Class-wide 事件发生故障

Class-wide Event is Malfunctioning

我在 JavaScript 中创建了 divs 的 16x16 网格。 每个 div 都有一个 mouse enter 事件(继承自 common class)应该改变它的 black背景为 白色.

这是我的问题: 而每个 div 在悬停时应该改变颜色,所有 divs (悬停时)导致相同的底部 -对div变色,而不是自己。


我相信所有事件都引用了 class 名称 "squares" 下的最终 div(右下角 div)。 如何让每个事件都引用它自己的 div?

快照

代码

    //GRID CREATION (30x30)
    var container = document.getElementById('container');
    var size = 30;

    //Row Creation (30)
    for(j=0; j < size; j++) {
        var row = document.createElement('div');
        row.classList.add("row");

        //Square Creation (30 per Row)
        for(i=0; i<size; i++) {
            var square = document.createElement('div')
            square.classList.add("square");

            //div background-color changes on mouse-enter   
            square.addEventListener('mouseenter', () => { 
                this.square.style.background = 'white';
            });

            row.appendChild(square);
        }
        container.append(row);
    }

当没有其他内容指向 this.square 时,在事件侦听器中找到 this.square 很奇怪。也许你最初尝试 square.style.background,由于 JavaScript closure inside loops – simple practical example 中描述的原因而没有工作,然后尝试用 this.style.background = 'white'; 修复它,但没有工作,因为它是一个箭头函数,然后尝试让 this.square 工作......?

无论如何,使用 non-arrow 函数,让 this 成为事件侦听器附加到的元素,而不是与外部的 this 相同:

square.addEventListener('mouseenter', <b>function ()</b> { 
    <b>this</b>.style.background = 'white';
});

或更好,用 let 声明你的变量——它必须可用,因为你使用的是箭头函数——并参考 square:

//GRID CREATION (30x30)
let container = document.getElementById('container');
let size = 30;

//Row Creation (30)
for (let j = 0; j < size; j++) {
    let row = document.createElement('div');
    row.classList.add("row");

    //Square Creation (30 per Row)
    for (let i = 0; i < size; i++) {
        let square = document.createElement('div');
        square.classList.add("square");

        //div background-color changes on mouse-enter   
        square.addEventListener('mouseenter', () => { 
            square.style.background = 'white';
        });

        row.appendChild(square);
    }
    container.append(row);
}

ji 的声明也丢失了。您应该启用 strict mode 而永远不要使用 var 来避免这些类型的问题。