$(this)/ .each help:jQuery 404通过YQL检查

时间:2012-01-04 16:42:40

标签: jquery

我正在尝试检查链接(我知道如果在50%的时间内不可用,但是在随机时间),以查看它是否返回200 HTTP状态代码。如果是这样,我想将链接上的类从离线更改为在线。

期望的进程:获取指向ip地址的所有链接,给他们离线类,每次向YQL发出请求,如果收到200代码则将类更改为Online。

目前我有这个:

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)引用是不对的。但是,如果我在函数之外放置相同的语句(如上面的代码中所述),它可以正常工作。

非常感谢任何帮助/指示。

2 个答案:

答案 0 :(得分:1)

在changeStatus函数中使用$(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

答案 1 :(得分:0)

您应该重构代码,直接在回调闭包中包含“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");
});