2 回答

TA贡献1829条经验 获得超7个赞
虽然您可以保存对调用时使用的函数的引用,以便可以将其删除,addEventListener
for (let x = 0; x < 4; x++) {
const mazeBlock = document.createElement('div');
document.body.appendChild(mazeBlock);
mazeBlock.className = 'blockStyle';
mazeBlock.id = 'mazeBlock' + x;
mazeBlock.addEventListener('click', function handler() {
mazeBlock.removeEventListener('click', handler);
eventCall(mazeBlock);
});
}
(上面,以 作为第一个参数调用)eventCall<div>
通过将第三个参数传递给以下命令来确保函数只能调用一次会更容易:{ once: true }addEventListener
mazeBlock.addEventListener( 'click', eventCall, { once: true });
(上面,以事件作为第一个参数调用 - 要获得 ,访问参数的 )eventCall<div>.target
如果需要删除所有此类元素的侦听器,则可以考虑使用不同的方法 - 与其附加大量侦听器然后全部删除,不如使用事件委派。这样,您所要做的就是删除单个委派侦听器:
document.body.addEventListener('click', function handler(event) {
if (!event.target.matches('.blockStyle')) return;
// A block was clicked on, remove the listener:
document.body.removeEventListener('click', handler);
// Do stuff with the clicked element:
eventCall(event.target);
});
如果您被奇怪的学校规则强迫为每个元素添加侦听器,请在循环外部创建侦听器函数,然后迭代所有元素并在需要时从每个元素中删除侦听器:
const handler = (event) => {
document.querySelectorAll('.blockStyle').forEach((div) => {
div.removeEventListener('click', handler);
});
// do stuff with event and event.target
};

TA贡献1828条经验 获得超6个赞
...最终这样做:
function createMaze() {
var x;
for (x = 0; x < 4; x++) {
const mazeBlock = document.createElement('div');
document.body.appendChild(mazeBlock);
mazeBlock.className = 'blockStyle';
mazeBlock.id = 'mazeBlock' + x;
mazeBlock.addEventListener( 'click', eventCall );
}
}
function eventCall() {
alert( this.id );
}
//...this is called from another piece of the script on a separate occasion
function removeListeners() {
var blocks = document.getElementsByClassName('blockStyle');
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i];
block.removeEventListener( 'click', eventCall );
}
}
@CertainPerformance 感谢您的帮助!:)
添加回答
举报