javascript - 如何在我的代码中修复 addEventListener?好像随时取消

标签 javascript

我正在尝试在容器内制作一个具有确定数量的正方形的网格。我使用了一个带有默认 16x16 方 block 的函数,并添加了一个 EventListener(鼠标悬停)以将一个类添加到任何 div。当我第一次刷新页面时,它工作得很好。问题是,当我想用​​个性化函数重置方 block 数时,我的代码可以完成这项工作,但 EventListener 停止工作。有什么帮助吗?

const container = document.getElementById('container');

const buttonsDiv = document.querySelector('#buttons-div');

setGrid();

function resetGrid() {
    clearGrid();

    while (container.firstChild) {
        container.removeChild(container.firstChild);
    };

    let numberOfsquares = prompt('Number of squares??? 1-64:');
    return setGrid(numberOfsquares);
}

function setGrid(numberOfsquares = 16) {
    let heightAndWidth = 960 / numberOfsquares;
    for (let i = 0; i < numberOfsquares; i++) {
        for (let j = 0; j < numberOfsquares; j++) {
            const divNode = document.createElement('div');
            divNode.classList.add('unit');
            divNode.style.width = heightAndWidth + 'px';
            divNode.style.height = heightAndWidth + 'px';
            container.appendChild(divNode);
        }
    }
    return numberOfsquares;
}

function clearGrid() {
    squares.forEach((square) => {
        square.classList.remove('hover');
    });
}

let squares = document.querySelectorAll('.unit');
squares.forEach((square) => {
    square.addEventListener('mouseover', (e) => {
        console.log('listened');
        square.classList.add('hover');
    });
});

const clearButton = document.createElement('button');
clearButton.textContent = 'Clear';
clearButton.classList.add('reset-button');
clearButton.setAttribute('id', 'clearButton');
buttonsDiv.appendChild(clearButton);

const resetButton = document.createElement('button');
resetButton.textContent = 'Reset';
resetButton.classList.add('reset-button');
resetButton.setAttribute('id', 'resetButton');
buttonsDiv.appendChild(resetButton);

const buttons = document.querySelectorAll('button');
buttons.forEach((button) => {
    button.addEventListener('click', (e) => {
        if (button.id === 'clearButton') {
            clearGrid();
        } else if (button.id === 'resetButton') {
            resetGrid();
        }
    });
});

最佳答案

如评论中所述。 resetGrid 函数从 DOM 中删除元素,因此不会再调用附加的事件监听器,因为元素不再存在。我建议为此使用“事件委托(delegate)”。因此,将事件监听器附加到 container 并在回调中使用 e.target 来确定哪个项目被命中。

container.addEventListener('mouseover', e => {
  const { target } = e;
  //use the child index for instance, or add col and row using a data attribute
})

关于javascript - 如何在我的代码中修复 addEventListener?好像随时取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57405113/

相关文章:

javascript - 单选按钮选中的属性未设置为 false

javascript - 淡入/淡出斑马条纹表

javascript - 滑动 CSS Javascript 栏

javascript - 如何在点击时显示 ul 元素?

javascript - 音频元素的 javascript 等价物是什么

javascript - Lodash 向对象添加属性的方法

javascript - js如何避免鼠标事件在不同元素上发生冲突

javascript - 设置一个等于当前所选选项的变量

javascript - 如果 li 具有 current 类,则 tiltSlider 播放/暂停视频元素

javascript - 如何以对象表示法调用内部 javascript 函数