如何在JavaScript中替换对象的情况下侦听事件

如何在JavaScript中替换对象的情况下侦听事件,javascript,html,css,Javascript,Html,Css,我正在用JavaScript创建一个拼字游戏,我遇到了一个问题。我有一个函数,可以在tile-rack-div中创建拼字块。我还有一个事件侦听器,可以在单击tile-div时侦听。单击电路板上的某个部分,然后单击平铺分区时,它会将平铺放置在电路板上,然后将其从父分区(平铺机架)中移除。其工作原理是:我创建一个数组,其中包含那些平铺div,然后当我从数组中移除div时,我会用新数组覆盖父div(平铺机架)。所有这些都发生得很好,但现在的问题是,当旧tile覆盖父div中的新tile时,事件侦听器将

我正在用JavaScript创建一个拼字游戏,我遇到了一个问题。我有一个函数,可以在tile-rack-div中创建拼字块。我还有一个事件侦听器,可以在单击tile-div时侦听。单击电路板上的某个部分,然后单击平铺分区时,它会将平铺放置在电路板上,然后将其从父分区(平铺机架)中移除。其工作原理是:我创建一个数组,其中包含那些平铺div,然后当我从数组中移除div时,我会用新数组覆盖父div(平铺机架)。所有这些都发生得很好,但现在的问题是,当旧tile覆盖父div中的新tile时,事件侦听器将不再工作

这是我的代码和我的整个代码的链接,解释了这一点:

let bag = ["A|1","A|1","A|1","A|1","A|1","A|1","A|1","A|1","A|1","B|3","B|3","C|3","C|3","D|2","D|2","D|2","D|2","E|1","E|1","E|1","E|1","E|1","E|1","E|1","E|1","E|1","E|1","E|1","E|1","F|4","F|4","G|2","G|2","G|2","H|4","H|4","I|1","I|1","I|1","I|1","I|1","I|1","I|1","I|1","I|1","J|8","K|5","L|1","L|1","L|1","L|1","M|3","M|3","N|1","N|1","N|1","N|1","N|1","N|1","O|1","O|1","O|1","O|1","O|1","O|1","O|1","O|1","P|3","P|3","Q|10","R|1","R|1","R|1","R|1","R|1","R|1","S|1","S|1","S|1","S|1","T|1","T|1","T|1","T|1","T|1","T|1","U|1","U|1","U|1","U|1","V|4","V|4","W|4","W|4","X|8","Y|4","Y|4","Z|10","|","|"];

// to fill the plate or stick with tiles from the bag array
let player1 = [];
let player2 = [];
let player1plate = document.getElementById("plate1");
let player2plate = document.getElementById("plate2");
// var tile = bag[Math.floor(Math.random() * bag.length)];

// FILL THE PLATE OR STICK WITH TILES
function fillStick(player, numberOfTilesNeeded, playerplate, id) {
  let insert = "";
  for (let i = 0; i < numberOfTilesNeeded; i++) {
    randomIndex = Math.floor(Math.random() * bag.length);
    player.push(bag[randomIndex]);
    bag.splice(randomIndex, 1);
  }
  for (let j = 0; j < player.length; j++) {
    insert += ` 
    <div class="tile" id="${id}${j}">
    <h2> ${player[j].split("|")[0]}</h2>
    <p>${player[j].split("|")[1]}</p>
  </div>`;
  }
  playerplate.innerHTML = insert;
  // console.log(bag);
  console.log(player1);
}
fillStick(player1, 7, player1plate, "tile");
fillStick(player2, 7, player2plate, "rile");

function removeTile(player, playerplate, id) {
  let insert = "";
  
  for (let j = 0; j < player.length; j++) {
    insert += ` 
    <div class="tile" id="${id}${j}">
    <h2> ${player[j].split("|")[0]}</h2>
    <p>${player[j].split("|")[1]}</p>
  </div>`;
  }
  playerplate.insertAdjacentHTML("beforeend",insert);
  console.log(playerplate);
}

// for the tiles on the rack/plate to click and be placed on the board
let tileClicked = 0;
let allTiles = document.querySelectorAll(".tile");


allTiles.forEach((e) => {
  e.addEventListener("click", () => {
    for (let i = 0; i < allTiles.length; i++) {
      allTiles[i].setAttribute("class", "tile");
    }
    if (tileClicked == e.id) {
      e.setAttribute("class", "tile");
      tileClicked = 0;
    } else {
      e.setAttribute("class", "tile active");
      tileClicked = e.id;
      if (clicked != 0) {
        document
          .getElementById(clicked)
          .setAttribute(
            "style",
            "background: #dfb15b; flex-direction: column;"
          );
        document.getElementById(clicked).setAttribute("class", "tilesections");
        document.getElementById(clicked).innerHTML = e.innerHTML;
        if (tileClicked.split("e")[0] == "til") {
          player1.splice(tileClicked.split("e")[1], 1);
          removeTile(player1, player1plate, "tile")
        } else {
          player2.splice(tileClicked.split("e")[1], 1);
          removeTile(player2, player2plate, "rile")// where i stopped
          console.log(player2);
        }

        clicked = 0;
        tileClicked = 0;
        e.setAttribute("class", "tile");
      }
    }
    // console.log(e.id);
    // console.log(player1);
  });
});
“A”1、“A”1、“A”1、“A”1”、“A”1、“A”1”、“A”1、“A”1”、“A”1”、“A”1”、“A”1”、“A”1”、“A”1”、“A”1”、“A”1”、“A”1、“A”1”、“A”1”、“1”、“A”1”、“A、1”、“A、1”、“A、1”、“A、1”、“A、1”、“A、1”、“A、1”、“A、A、1”、“A、1”、“A、1”、“A、1”、“A、1”、“A”、“A、1”、“A”、“A”、“A”、“A”、“1”、“A”、“A”、“A”、“1”、“A”、“A”、“1”、“A”、“A”、“A”、“1”、“A”、“A”、“A”、“1”、“A”、“A”、“A”、“1”、“A”、“A”、“A”、“A”、“A”、“1”、“A”、“A”、“1”、“A”、“A”、“A”、“A”、“A”、“1”、“A”、“A”、“A”、“1”、“A”、“A”、“A”、“1”、“B”、“B”、“B”、“B”、“B”、“B”、“1)、1、1、1、1、1、1、1、1、1、4、4、4、4、3、3、3、2、1、2、G、1、1、3、3、1、3、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、2、G、2、G、2、G、2、2、2、2、H、4、4、H、4、4、H、4、4、4、H、H、4、4、H、H、4、4、4、4、H、H、H、4、4、4、4、H、H、H、4、4、H、H、4、4、4、3、4、3、H、H、4、4、H、H、H、4、4、4、3、H、H、4、4、4、3、H、H、4、4、3、3、H|1”、“N|1”,“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“0”、“1”、“1”、“O”1”、“1”、“O”1”、“1”、“O”1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“R”1”、“1”、“1”、“1”、“R”、“1”、“1”、“1”、“R”、“1”、“1”、“R”、“1”、“R”、“1”、“1”、“1”、“R”、“1”、“1”、“1”、“R”、“1”、“1”、“1”、“1”、“R”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“R”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“R”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“R”、“1”、“R”、“R”、“T | 1、T | 1、T | 1、T | 1、U | 1、U | 1、U | 1、V | 4、V | 4、W | 4、W | 4、X | 8、Y | 4、Y | 4、Y | 4、Y | 4、Z | 10、V |、V |、V | 4、W |; //用袋子阵列中的瓷砖填充盘子或粘贴 让player1=[]; 让player2=[]; let player1plate=document.getElementById(“plate1”); let player2plate=document.getElementById(“plate2”); //var tile=bag[Math.floor(Math.random()*bag.length)]; //把盘子装满或贴上瓷砖 函数fillStick(播放器、所需的号码、播放器面板、id){ 插入“”; for(设i=0;i `; } playerplate.innerHTML=插入; //控制台日志(包); 控制台日志(player1); } 填充杆(player1、7、player1板,“瓷砖”); fillStick(player2,7,player2板,“rile”); 功能移除文件(播放器、播放器面板、id){ 插入“”; for(设j=0;j `; } playerplate.insertAdjacentHTML(“beforeend”,insert); 控制台日志(playerplate); } //用于机架/板上的瓷砖单击并放置在板上 让tileClicked=0; 让allTiles=document.queryselectoral(“.tile”); allTiles.forEach((e)=>{ e、 addEventListener(“单击”,()=>{ for(设i=0;i 为了更好地理解问题,可以使用此链接检查完整代码

我认为你应该以不同的方式来处理这个问题。与其在每个磁贴上添加一个均匀的侦听器,不如在磁贴容器上添加一个侦听器。当你单击内部磁贴时,事件将“冒泡”“向上。当它到达container div时,您可以捕获它并使用event参数的
event.target
属性获取最初单击的磁贴

HTML:

JS


这回答了你的问题吗?关于提议的复制演示了如何在没有jQuery的情况下使用事件委派。我现在明白了。谢谢您很高兴我能提供帮助,干杯!;)
<div id="board">
  <div id="1"> 1 </div>
  <div id="2"> 2 </div>
  <div id="3"> 3 </div>
</div>
#board > div
{
  width: 50px;
  height: 50px;
  background-color: gray;
  margin: 10px;
}
document.getElementById('board').addEventListener('click', (e) =>
{
  let t = e.target
  alert(`${t.id} clicked`)
})