![](/img/trans.png)
[英]How can I attach event handlers to dynamically-generated DOM elements using jQuery?
[英]How can I remove dynamically generated event handlers in JavaScript
當我單擊按鈕時,我看到控制台消息顯示我已單擊它們。 當我取消選中復選框然后單擊按鈕時,我預計不會出現控制台消息,但我仍然會看到它們。 為什么removeEventListener
不移除事件監聽器?
const buttons = document.querySelectorAll('ul li button'); function initialize() { for (let i = 0; i < buttons.length; i++) { function doSomething() { console.log(`You clicked on ${buttons[i].textContent}`); } if (document.querySelector('#mode').checked) { buttons[i].addEventListener('click', doSomething); } else { buttons[i].removeEventListener('click', doSomething); } } } document.querySelector('#mode').addEventListener('click', initialize); initialize();
<input id='mode' type='checkbox' checked/> <label for='mode'>Do something when you click</label> <ul> <li><button>One</button> <li><button>Two</button> <li><button>Three</button> <li><button>Four</button>
我無法在 for 循環之外定義doSomething
,因為i
需要做其他事情(為簡單起見,此處未顯示)。 我確實需要為每個索引使用不同的處理程序。
目前, doSomething
是在 for 循環中定義的,這意味着每次執行initialize
時,您都會得到一個名為doSomething
的新 function。 因此addEventListener
添加一個 function 稱為doSomething
,並且removeEventListener
嘗試刪除另一個 function (也稱為doSomething
)。 新的doSomething
從未注冊為事件偵聽器,因此無法刪除,而舊的doSomething
不在 scope 中,因此我們無法引用它來刪除它。 相反,您可以動態生成函數一次並在initialize
中引用它們。
const buttons = document.querySelectorAll('ul li button'); const buttonFunctions = []; for (let i = 0; i < buttons.length; i++) { buttonFunctions[i] = function doSomething() { console.log(`You clicked on ${buttons[i].textContent}`); } } function initialize() { for (let i = 0; i < buttons.length; i++) { if (document.querySelector('#mode').checked) { buttons[i].addEventListener('click', buttonFunctions[i]); } else { buttons[i].removeEventListener('click', buttonFunctions[i]); } } } document.querySelector('#mode').addEventListener('click', initialize); initialize();
<input id='mode' type='checkbox' checked/> <label for='mode'>Do something when you click</label> <ul> <li><button>One</button> <li><button>Two</button> <li><button>Three</button> <li><button>Four</button>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.