【发布时间】:2017-07-31 14:01:05
【问题描述】:
如果我点击第一个“编辑”,我会得到一个 console.log('click happend') 但如果我通过 javascript 添加其中一个框(点击“添加框”),然后从这个新框中编辑 click 不会工作。我知道这是因为 javascript 在元素不存在时运行,这就是为什么没有单击事件侦听器的原因。我也知道使用 jQuery 我可以这样做:
$('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?
【问题讨论】:
标签: javascript event-delegation