簡體   English   中英

重新將onclicklistener附加到按鈕

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM