我有一个ajax请求,它返回JSON
个数据(对象数组)。
迭代这个数组我生成一个链接列表。我想设置一个onClick
事件并使用来自ajax响应的params调用函数。
听起来可能不太清楚,所以这是一个例子:
function test(param1) {
// ...
}
$.ajax({
url: 'getSomeData.php',
type: 'post',
data: data,
success: function(result){
var result = JSON.parse(result);
$div = $('<div />');
for (i in result.someObject) {
$div.append('<a href="#" id="linkID' + i + '">ajax link ' + i + '</a>');
$('#linkID' + i).click(function(){
test(result.someObject[i]); // <--- My question is here
return false;
});
}
$(document.body).append($div);
}
});
在我的函数test
中,我总是得到迭代数组的最后一个对象。我知道为什么会这样,但我不知道如何修复它。
答案 0 :(得分:4)
这是i的范围问题,如果你使用一个闭包来限制它的范围到下面的click事件处理程序,它应该没问题。
(function(i) {
$('#linkID' + i).click(function(){
test(result.someObject[i]); // <--- My question is here
return false;
});
})(i);
这保证了i处于创建处理程序时的值,而不是它设置的最后一个值。
答案 1 :(得分:2)
您的问题是作用域 - 您的变量i
未绑定在作用域中,因此在调用事件处理程序时它始终具有指定的最后一个值。
解决此问题的最简单方法(当您使用jQuery时)是使用eventData
参数.click()
:
('#linkID' + i).click({ param1: result.someObject[i] }, test);
然后更改test
以阅读事件数据:
function test(ev) {
var param1 = ev.data.param1;
// ...
}
jQuery将绑定所提供的任何eventData,并自动将其添加到传递给事件处理程序的事件对象。
这避免了必须创建任何其他闭包来修复所提供参数的范围。
上标题为“传递事件数据”的部分答案 2 :(得分:0)
您可以使用jQuery.proxy()
简单示例:
MyObject = function() {
this.element = $('#element');
this.some_var = 'It works!';
this.element.click($.proxy(this.handleClick, this));
};
MyObject.prototype.handleClick = function() {
console.log(this.some_var);
};
var m = new MyObject();
jQuery docs的示例:
<script>
var me = {
type: "zombie",
test: function(event) {
// Without proxy, `this` would refer to the event target
// use event.target to reference that element.
var element = event.target;
$(element).css("background-color", "red");
// With proxy, `this` refers to the me object encapsulating
// this function.
$("#log").append( "Hello " + this.type + "<br>" );
$("#test").unbind("click", this.test);
}
};
var you = {
type: "person",
test: function(event) {
$("#log").append( this.type + " " );
}
};
// execute you.test() in the context of the `you` object
// no matter where it is called
// i.e. the `this` keyword will refer to `you`
var youClick = $.proxy( you.test, you );
// attach click handlers to #test
$("#test")
// this === "zombie"; handler unbound after first click
.click( $.proxy( me.test, me ) )
// this === "person"
.click( youClick )
// this === "zombie"
.click( $.proxy( you.test, me ) )
// this === "<button> element"
.click( you.test );
</script>