jQuery/JavaScript:仅在循环的最后一次迭代期间分配的事件处理程序
jQuery/JavaScript: Event handlers only assigned during the last iteration of a loop
我遇到了一个问题,即实例化两个对象的循环,而这两个对象反过来创建元素并附加事件处理程序,实际上只附加循环最后一次迭代的事件处理程序。虽然我知道循环中匿名函数内部的作用域存在问题,但我看不出它在这里如何适用,而且我挠头......
因此,首先,视图对象的 setContent 方法遍历内容数组,并创建 CrowdControl.ui.Button 对象的两个实例:(为清楚起见,删除了不相关的代码)
setContent: function(content){
if(content.length > 0){
for(var i in content){
var c = content[i];
var container = $('<div></div>');
//content array code removed for clarity
var reject = new CrowdControl.ui.Button({label:'Reject'});
var approve = new CrowdControl.ui.Button({label:'Approve'});
container.append(reject.draw());
container.append(approve.draw());
this.contentlist.addItem(container);
}
}
}
这是 Button 对象(为了清楚起见,再次删除了一些代码)
CrowdControl.ui.Button = function(){
this.uniqueId = Math.random(); //added for debugging
var els = this.elements = {}
els.container = $('<div class="cc-button"></div>');
els.label = $('<div></div>').text('Debug');
els.container.append(els.label);
}
CrowdControl.ui.Button.prototype.draw = function(){
console.log('Drawing element '+this.uniqueId);
var els = this.elements;
els.container.remove();
console.log('Binding click to button');
console.log(els.container);
//attach the click handler - this will only attach during the last iteration
els.container.click( function(){ console.log('wtf'); });
return els.container;
}
上面的代码记录了所有元素都是创建的,它们都是唯一的,但只有 Button 对象的最后两个实例接收事件处理程序并在单击时记录"wtf"。
任何帮助将不胜感激 - 如果您需要更多代码或解释,请询问...
我修复了你的代码:http://jsfiddle.net/maniator/E8XcQ/6/
单击应如下所示:
//attach the click handler
$(els.container).click(function() {
console.log('wtf');
});
您不小心将click
附加到 DOM 元素而不是 jQuery 元素
谢谢尼尔的帮助。 实际上,问题出在我的框架中的其他地方,每次迭代后视图都会错误地重绘,并且每次都调用 .remove(),这当然是从子元素中删除事件处理程序。
相关文章:
- 如何在javascript中迭代数字列表
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 在ejs-partial中对JSON对象进行迭代
- 如何在DataTables 2.1中迭代对象数组
- 使用递归属性迭代保留属性结构
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 主干-从模板中迭代的集合中获取特定的模型
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 什么's是在javascript中迭代项的最佳方式
- 为什么这只是迭代 HTMLCollection 的奇怪元素
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- jQuery-迭代不正确?(太长,无法执行)
- 使用不正确的迭代器值进行事件分配
- 通过find()和each()迭代分配唯一的ID
- jQuery/JavaScript:仅在循环的最后一次迭代期间分配的事件处理程序