第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將事件偵聽器添加到多個生成的元素

將事件偵聽器添加到多個生成的元素

素胚勾勒不出你 2023-12-19 17:11:03
我正在嘗試使用純 JS 并基于 CSS 和 HTML GUI 為我的學(xué)校制作 Tic-Tac-Toe。我知道這可能不是最好的方法,但我認(rèn)為它可能有效。不幸的是,它根本不起作用。我嘗試在 Board.generate() 中通過 JS 生成整個板,因為我想讓我的板可調(diào)整大小,然后向每個生成的單元格添加事件偵聽器,但這不是& #39;不工作。 Onclick 僅在最后一個元素上調(diào)用,而不在前面的元素上調(diào)用。我認(rèn)為我可以通過創(chuàng)建一個函數(shù)來繞過這個問題,但我想了解為什么我的代碼不起作用。這是我的代碼:class Board {  constructor(size) {    this.size = size;     this.cells = [];    for (let x = 0; x < size; x++) {      this.cells[x] = [];      for (let y = 0; y < size; y++) {        this.cells[x][y] = new Cell(x, y, null);      }    }  }   generate() {    document.getElementById('game').innerHTML = '<div id="board"></div>';     let boardEl = document.getElementById('board');     for (let y = 0; y < this.size; y++) {      boardEl.innerHTML += '<div id="r' + y + '" class="board-row"></div>';      let rowEl = document.getElementById('r' + y);       for (let x = 0; x < this.size; x++)        this.cells[x][y].addElement(rowEl);    }  }} class Cell {  constructor(x, y, mark) {    this.x = x;    this.y = y;    this.mark = mark;    this.id = 'c' + x + y;    this.element = null;  }   addElement(rowEl) {    rowEl.innerHTML += '<div id="' + this.id + '" class="board-cell"> CELL </div>';    this.element = document.getElementById(this.id);    this.element.addEventListener('click', () => this.clicked(), false);  }   clicked() {    console.log(this.x, this.y, ' CLICKED!');  }} window.onload = function () {  var game = new Board(3);  game.generate();};<style>  .board-cell {    width: 10%;    height: 10%;    background: white;    color:black;  }</style><div id="container" class="fullscreen">  <div id="game" class="fullscreen">    <!-- Generated board -->  </div></div>我知道我的代碼現(xiàn)在一團(tuán)糟,但我只是感到沮喪,而且這只是一個草圖,我會繼續(xù)努力。 另外,如果我犯了一些錯誤,我很抱歉我的英語。
查看完整描述

1 回答

?
www說

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊

任何時候設(shè)置 innerHTML 屬性都會覆蓋之前設(shè)置的任何 HTML。這包括串聯(lián)賦值,因為


element.innerHTML += '<b>Hello</b>';

和寫作一樣


element.innerHTML = element.innerHTML + '<b>Hello</b>';

這意味著所有未通過 HTML 屬性附加的處理程序都將被“分離”,因為它們附加的元素不再存在,并且一組新的元素已取代它們。要保留所有以前的事件處理程序,您必須附加元素而不覆蓋任何以前的 HTML。最好的方法是使用 DOM 創(chuàng)建函數(shù),例如 createElement 和appendChild:


let divEl  = document.createElement("div");

divEl.innerHTML = "CELL";   

divEl.className = 'board-cell'

divEl.id = this.id;

rowEl.appendChild(divEl);

對于行 div 元素也是如此:


let divRowEl  = document.createElement("div");

divRowEl.className = 'board-row'

divRowEl.id = 'r' + y;

boardEl.appendChild(divRowEl);

class Board {

  constructor(size) {

    this.size = size;

 

    this.cells = [];

    for (let x = 0; x < size; x++) {

      this.cells[x] = [];

      for (let y = 0; y < size; y++) {

        this.cells[x][y] = new Cell(x, y, null);

      }

    }

  }

 

  generate() {

    

    document.getElementById('game').innerHTML = '<div id="board"></div>';

 

    let boardEl = document.getElementById('board');

 

    for (let y = 0; y < this.size; y++) {

      let divRowEl  = document.createElement("div");

      divRowEl.className = 'board-row'

      divRowEl.id = 'r' + y;

      boardEl.appendChild(divRowEl);

      let rowEl = document.getElementById('r' + y);

      

      for (let x = 0; x < this.size; x++)

        this.cells[x][y].addElement(rowEl);

    }

  }

}

 

class Cell {

  constructor(x, y, mark) {

    this.x = x;

    this.y = y;

    this.mark = mark;

    this.id = 'c' + x + y;

    this.element = null;

  }

 

  addElement(rowEl) {

    let divEl  = document.createElement("div");

    divEl.innerHTML = "CELL" + this.id;   

    divEl.className = 'board-cell'

    divEl.id = this.id;

    divEl.addEventListener('click', () => this.clicked(), false);

    rowEl.appendChild(divEl);

  }

 

  clicked() {

    console.log(this.x, this.y, ' CLICKED!');

  }

}

 

window.onload = function () {

  var game = new Board(3);

  game.generate();

};

<style>

  .board-cell {

    width: 10%;

    height: 10%;

    background: white;

    color:black;

  }

</style>

<div id="container" class="fullscreen">


  <div id="game" class="fullscreen">


    <!-- Generated board -->


  </div>


</div>


查看完整回答
反對 回復(fù) 2023-12-19
  • 1 回答
  • 0 關(guān)注
  • 142 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號