我正在开发一个迭代某些DOM
元素的应用程序,并为每个元素执行Ajax
请求。问题是我无法访问回调函数中的每个DOM
元素。
$('.class').each(function() {
$.getJSON(url, function(data) {
$(this).attr('id', data.id); // $(this) is not accessible
});
});
有没有办法解决这个问题?
答案 0 :(得分:6)
您应该使用变量,因为每个函数调用的this
值都会发生变化,而$ .getJSON this
的回调内部不再是元素。
$('.class').each(function() {
var self = this;
$.getJSON(url, function(data) {
self.id = data.id;
});
});
另一个选项是each()
$('.class').each(function(index, element) {
$.getJSON(url, function(data) {
element.id = data.id;
});
});
答案 1 :(得分:3)
您可以这样做,而不必执行任务。
$.getJSON(url, function(data) {
$(this).attr('id', data.id); // $(this) is accessible
}.call(this));
答案 2 :(得分:2)
一种方法是使用Function#bind
,如下所示:
$('.class').each(function() {
$.getJSON(url, function(data) {
$(this).attr('id', data.id);
}.bind(this)); // Pass `this` into the getJSON and now `this` should be the DOM element
});
这样做的是,无论你传入bind
的是什么,都会在函数内设置为this
。您可以阅读MDN here
答案 3 :(得分:1)
您可以将选择器缓存在类似它的变量中:
$('.class').each(function() {
var $this = $(this); // cache it here
$.getJSON(url, function(data) {
$this.attr('id', data.id); // $(this) is not accessible
});
});
或者如果您可以将$.getJson()
更改为传统$.ajax()
,那么您可以使用context:this,
参数:
$('.class').each(function() {
$.ajax({
url : url,
dataType: 'json',
context: this,
success: function(data) {
this.id = data.id; // $(this) is not accessible
}
});
});