带有绑定click事件的Javascript循环总是返回最后的结果
Javascript loop with binded click event always returning last result
我有一个for循环在javascript中运行。在这个循环中,我创建了一个列表项并将一个click事件绑定到它。当我单击此列表项时,我希望它调用一个函数,并将当前循环对象的数据作为参数。
问题是,无论我点击哪个列表项。作为参数传递的数据是我正在循环的对象的最后一个元素,而不是正在单击的当前元素。
for(e in data) {
var suggestItem = $('<li>'+ data[e]['name'] +'</li>');
suggestItem.click(function() {
$(this).addClass('activeSuggestion');
suggestSelect(suggestField, data[e]);
});
suggestList.append(suggestItem);
}
我想我知道为什么会发生这种情况,但不知道该如何处理。
这是一个经典的Javascript闭包问题。当click事件被触发时(当您单击某项内容时),循环已经完成执行。e
的值是data
中最后一个键的值。解决这个问题的方法是在循环内部创建一个新的作用域。
for(var e in data) {
(function(datum) {
suggestList.append(
$('<li>' + datum.name + '</li>')
.click(function() {
$(this).addClass('activeSuggestion');
suggestSelect(suggestField, datum);
});
);
})(data[e]);
}
Javascript是函数作用域,所以每当遇到一个新函数时,就会创建一个新的作用域。上面的代码将data[e]
的值"捕获"到datum
中,因为它将其作为参数传递给函数。另一种更容易理解的编码方式:
for(var e in data) {
(function() {
var datum = data[e];
suggestList.append(
$('<li>' + datum.name + '</li>')
.click(function() {
$(this).addClass('activeSuggestion');
suggestSelect(suggestField, datum);
});
);
})();
}
它没有向函数传递参数,但是因为Javascript是函数作用域,每次触发click事件时,它都会查找datum
被分配的位置。
还请注意for(VAR e in data)
,这将阻止e
成为全局变量。
您需要打破对e
的闭包。
因为你使用jQuery,最简单的方法是用jQuery的data
函数保存e
的当前值。由于JavaScript中的所有函数参数都是按值传递的,这有效地破坏了闭包;现在,您的点击处理程序将在处理程序创建时使用e
的值,而不是在循环结束时使用e
的值。
for(e in data) {
var suggestItem = $('<li>'+ data[e]['name'] +'</li>');
suggestItem.data('savedE', e).click(function() {
$(this).addClass('activeSuggestion');
suggestSelect(suggestField, data[$(this).data('savedE')]);
});
suggestList.append(suggestItem);
}
相关文章:
- CKFinder 3为所选文件返回错误的URL
- 如何在d3.js中返回路径的y坐标
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- 对不同的数组进行切片并返回选定的值
- Ajax请求返回空的数据字符串,但首先得到了正确的数据
- getBoundingClientRect在Chrome中返回相同的值
- $(document).height和$(window).heaght都返回相同的值-使用的是正确的doctype
- Javascript中带有返回值的嵌套函数
- 从数组JavaScript中删除并返回最后n个项的最快方法
- IE使用类jquery返回相同的最后一个单选按钮值
- 我必须创建一个函数,该函数返回传入的数组的最后一个元素
- 何时返回表达式的最后一部分
- jqgrid 自定义格式化程序:自定义格式化程序始终返回网格的最后一行.为什么
- 为什么来自循环的警报总是返回最后一个值,而不是每个迭代值
- 带有绑定click事件的Javascript循环总是返回最后的结果
- 当变量在不同的行上声明和赋值时返回最后赋值
- Javascript数组返回所有的最后一个条目
- 反应:从嵌套的 props 返回最后一个子对象
- php中的MySql查询只在json编码时返回最后的结果