[英]Reattaching the onclicklistener to the button
這個問題與關於SO的另一個問題有關 。 我沒有改寫,所以請先閱讀。
在解決上述問題時,我遇到了我不知道的行為。
此代碼段有效:
var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked(a) { document.body.innerHTML += '<div>welcome</div>'; // getting the button from document.getElement method bt1 = document.getElementById('bt1'); bt1.onclick = clicked; }
<body> <button id="bt1">Click Me</button> </body>
雖然這不是:
var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked(a) { document.body.innerHTML += '<div>welcome</div>'; // getting the button from event.target var b = a.target; b.onclick = clicked; }
<body> <button id="bt1">Click Me</button> </body>
任何見解都將有助於清除概念。
在單擊的函數bt1
重新創建bt1
按鈕a.target
指向舊按鈕,而不是新按鈕。
該行document.body.innerHTML += '<div>welcome</div>';
不僅將div附加到主體,還設置了完整主體的innerHTML,這將導致主體內的所有元素再次被初始化。 在第一個代碼示例中,您通過id檢索了新創建的按鈕(因為在innerHTML賦值之后調用了getElementById),但是在第二個示例中,引用了舊按鈕,該按鈕不再顯示在瀏覽器中。
這種將內容附加到主體的方法是一種代碼味道,因為瀏覽器必須在主體內部重新創建任何內容。 更好的解決方案是使用appendChild
API。 這樣,就不會重新創建按鈕,並且您不必重新附加事件偵聽器:
var bt1;
document.addEventListener('DOMContentLoaded', load);
function load() {
document.body.innerHTML += '<div>welcome</div>';
bt1 = document.getElementById('bt1');
bt1.onclick = clicked;
}
function clicked(a) {
var newDiv = document.createElement('div');
newDiv.textContent = 'welcome';
document.body.appendChild(newDiv);
}
Element.innerHTML替換給定DOM元素中的所有內容。
要將HTML插入文檔中而不是替換元素的內容,請使用Element.insertAdjacentHTML()方法,該方法將允許您以所需的方式使用target屬性。
var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked(a) { console.log(a.srcElement); document.body.insertAdjacentHTML('beforeend', '<div>welcome</div>'); // getting the button from event.target var b = a.target; b.onclick = clicked; }
<body> <button id="bt1">Click Me</button> </body>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.