我试图检查一个链接(我知道如果不可用的50%的时间,但在随机时间),看看它是否返回一个200 HTTP状态码。如果是这样,我想将链接上的类从离线更改为在线。
期望过程:获得指向ip地址的所有链接,给它们类离线,为每个做一个请求到YQL,如果收到200代码更改类在线
目前我有这个:
var streams = $('article a[href^="http://65"]');
streams.addClass("offline");
streams.each(function (){
destination = $(this).attr("href");
$.getJSON("http://query.yahooapis.com/v1/public/yql?q=use%20%22store%3A%2F%2FtbYorcb2jIkiHPcRbkpSUG%22%20as%20HTTPStatus2%3B%20select%20status%20from%20HTTPStatus2%20where%20url%3D%22"+ encodeURIComponent(destination) +"%22&format=json&callback=",
function(data){
var httpstatus = data.query.results.result.status;
if(httpstatus == 200){
console.log('If = 200');
changeStatus();
}
}
);
function changeStatus(){
console.log('changeStatus called');
$(this).removeClass("offline").addClass("online");
};
//$(this).removeClass("offline").addClass("online");
});
这一切似乎都离不开changeStatus函数。我以为把它放在AJAX请求之外的一个单独的函数中就可以了,但事实并非如此。看起来问题是$(this)
的参考是不对的。但是,如果我将相同的语句放在函数之外(如上面的代码注释),它会正常工作。
当您在changeStatus函数中使用$(this)时,this标识符指的是changeStatus函数对象,而不是正在迭代的当前流。您需要传入对象,或者将changeStatus移动到另一个函数中。
streams.each(function (){
var that = $(this),
destination = that.attr("href");
$.getJSON("http://query.yahooapis.com/v1/public/yql?q=use%20%22store%3A%2F%2FtbYorcb2jIkiHPcRbkpSUG%22%20as%20HTTPStatus2%3B%20select%20status%20from%20HTTPStatus2%20where%20url%3D%22"+ encodeURIComponent(destination) +"%22&format=json&callback=",
function(data){
var httpstatus = data.query.results.result.status;
if(httpstatus == 200){
console.log('If = 200');
changeStatus();
}
}
);
function changeStatus(){
console.log('changeStatus called');
that.removeClass("offline").addClass("online");
};
});
你的目标变量还缺少一个"var"。
编辑:关于"this"关键字的一些帮助:http://jqfundamentals.com/#example-2.40
你应该重构你的代码,将"changeStatus()"方法的代码直接包含在回调闭包中,以维护作用域链。
var streams = $('article a[href^="http://65"]');
streams.addClass("offline");
streams.each(function (){
destination = $(this).attr("href");
$.getJSON("http://query.yahooapis.com/v1/public/yql?q=use%20%22store%3A%2F%2FtbYorcb2jIkiHPcRbkpSUG%22%20as%20HTTPStatus2%3B%20select%20status%20from%20HTTPStatus2%20where%20url%3D%22"+ encodeURIComponent(destination) +"%22&format=json&callback=",
function(data){
var httpstatus = data.query.results.result.status;
if(httpstatus == 200){
console.log('If = 200');
console.log('changeStatus called');
$(this).removeClass("offline").addClass("online");
}
}
);
//$(this).removeClass("offline").addClass("online");
});