最初の「編集」をクリックするとconsole.log('click happend')
が表示されますが、これらのボックスの1つをjavascript(「追加ボックス」をクリック)に追加してからclick
新しいボックスは機能しません。要素がなかったときにjavascriptが実行され、クリックイベントリスナーが存在しないからです。私はまた、jQueryを使って私がそうすることができることを知っています。javacriptによって挿入された要素にクリックイベントを追加する
$('body').on('click', '.edit', function(){ // do whatever };
これはうまくいくでしょう。
しかし、どうすればこのプレーンなJavascriptで対応できますか?有用なリソースが見つかりませんでした。私が働きたいと思う簡単な例を作りました。これを解決する最善の方法は何ですか?
問題は次のとおりです。ボックスを追加して「編集」をクリックすると、何も起こりません。
var XXX = {};
XXX.ClickMe = function(element){
this.element = element;
onClick = function() {
console.log('click happend');
};
this.element.addEventListener('click', onClick.bind(this));
};
[...document.querySelectorAll('.edit')].forEach(
function (element, index) {
new XXX.ClickMe(element);
}
);
XXX.PrototypeTemplate = function(element) {
this.element = element;
var tmpl = this.element.getAttribute('data-prototype');
addBox = function() {
this.element.insertAdjacentHTML('beforebegin', tmpl);
};
this.element.addEventListener('click', addBox.bind(this));
};
[...document.querySelectorAll('[data-prototype]')].forEach(
function (element, index) {
new XXX.PrototypeTemplate(element);
}
);
[data-prototype] {
cursor: pointer;
}
<div class="box"><a class="edit" href="#">Edit</a></div>
<span data-prototype="<div class="box"><a class="edit" href="#">Edit</a></div>">Add box</span>
This Q/A is useful informationが、それは問題を解決する方法についての私の質問に答えていません。どのようにDOM内に動的に挿入された要素のためにnew XXX.ClickMe(element);
のようなeventListenerを呼び出すことができますか?
可能性のある重複した[DOMイベントの代表団は何ですか?](https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation:魔法のように動作します) –