2017-02-26 4 views
0

addEventListenerはなぜCANCELラベル要素と連携し、最初のものではないのですか?コンソールにエラーメッセージが表示されません。addEventListenerが私に耳を傾けるのはなぜですか?

var ctrl = document.createElement('div'); 
 
ctrl.id = 'ctrl'; 
 

 
var showhide = document.createElement('label'); 
 
showhide.id = 'showhide'; 
 
showhide.innerHTML = 'Show/hide output'; 
 
showhide.setAttribute('onclick', 'return false;'); 
 
showhide.addEventListener("click", function() { 
 
    alert('Show/hide'); 
 
}); 
 

 
var cancel = document.createElement('label'); 
 
cancel.id = 'cancel'; 
 
cancel.innerHTML = 'CANCEL'; 
 
cancel.setAttribute('onclick', 'return false;'); 
 
//document.getElementById('showhide').insertAdjacentHTML('afterEnd', cancel.outerHTML); 
 
cancel.addEventListener("click", function() { 
 
    alert('cancel'); 
 
}); 
 

 
ctrl.appendChild(showhide) 
 
ctrl.innerHTML += ' | ' 
 
ctrl.appendChild(cancel) 
 
document.body.appendChild(ctrl)

+0

'ctrl.innerHTML + = '| ''は追加されず、要素内のすべてが破棄され、新しいコンテンツが作成されます。イベントリスナーは元の要素に追加されましたが、新しく作成された要素には追加されませんでした。 – Teemu

+0

ハァッ!それは簡単だった、ありがとう。 '+ ='は追加されませんか? – fivethous

+0

いいえ、それはちょうど 'innerHTML = innerHTML + 'へのショートカットです。 ''。 'insertAdjacentHTML'を使うか、textnodeを作成して追加してください。 – Teemu

答えて

1

あなたの上記のコードでは犯人はコード実行ctrl.innerHTML += ' | ';コメントとラインで、それが正常に動作します。 innerHTMLを使用すると、コンテンツが再割り当てされ、既存のイベントが破棄されて再評価されるためです。 Here is an example explained in StackOverflow answers.

+0

良い説明、ありがとうございます。リンク+1 – fivethous

関連する問題