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 感謝您的幫助!:)
添加回答
舉報