我想为数组中的所有元素分配jQuery click-function。但另外,我需要从click-function中访问数组。希望消息来源更清楚:
for (var i=0; i<mybox.myarray.length; i++) {
mybox.myarray[i].jqelem.click(function(event, mybox) {
event.preventDefault();
doStuffWithParameter(mybox);
});
}
// mybox is a JavaScript object (not jQuery-element!), myarray is an array, jqelem is a jQueryelement ala $("div.myclass");
问题似乎与function(event, mybox)
有关,显然这不起作用,即mybox
在函数中是unknown
。我想我有点'理解为什么它不能这样工作,但是如何实现呢?
PS:我基本上只是为了避免手动为所有数组元素键入它。
答案 0 :(得分:3)
只需删除名为mybox
的<无用的第二个回调函数参数。
如果mybox
在外部块的范围内,它也将在内部回调函数的范围内!
如果您需要知道回调中i
的适当值,那么您可以执行event registration-time binding:
for (var i=0; i<mybox.myarray.length; i++) {
mybox.myarray[i].jqelem.click({i: i}, function(event) {
// use "event.data.i" to access i's value
var my_i = event.data.i;
});
}
地图{i : i}
与jQuery eventData
文档中的.click()
参数相对应。
答案 1 :(得分:1)
调用click处理程序时,第一个参数是事件数据。 jQuery没有传递第二个参数。
更新:使用闭包转到mybox
对象(请注意我删除了第二个参数)
for (var i=0; i<mybox.myarray.length; i++) {
mybox.myarray[i].jqelem.click(function(event) {
event.preventDefault();
// here's the trick to get the correct i
(function(item) {
return function() {
doStuffWithParameter(mybox.myarray[item]);
};
})(i);
// you can access any object from parent scope here
// (except i, to get to right i, you need another trick),
// effectively creating a closure
// e.g. doOtherStuff(myarray)
});
}
在此处阅读有关闭包的更多信息:http://jibbering.com/faq/notes/closures/
在这里:How do JavaScript closures work?
答案 2 :(得分:1)
您可以获取jquery数据属性的帮助
for (var i=0; i<mybox.myarray.length; i++) {
mybox.myarray[i].jqelem.data("arrayIndex", i).click(function(event) {
event.preventDefault();
doStuffWithParameter(mybox.myarray[$(this).data("arrayIndex")]);
});
}