1 回答

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>
- 1 回答
- 0 關(guān)注
- 142 瀏覽
添加回答
舉報