2012-01-04 1 views
0

Я пытаюсь проверить ссылку (которую я знаю, если она неактивна в 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). Однако, если я помещаю одну и ту же инструкцию вне функции (как указано в коде выше), она работает нормально.

Любые помощь/указатели будут высоко оценены.

+1

«это» не имеет никакого значения внутри функции обратного вызова. Событие обратного вызова происходит за пределами области вашего цикла. –

+0

Спасибо Splash-X - я подумал, что это так, но не знал, как обойти его (и не мог бы выразить это правильно!). – phil

ответ

1

при использовании $ (это) внутри вашей функции changeStatus, то этот идентификатор относится к объекту функции 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» в вашей переменной назначения.

Edit: некоторая помощь с «этим» ключевым словом: http://jqfundamentals.com/#example-2.40

+0

Спасибо jbabey - это отлично поработало, как только я заметил вашу небольшую опечатку в конце второй строки - я уверен, что вы бросили ее специально, чтобы убедиться, что я не просто копировал! :) Могу я просто спросить вас о 'changeStatus (that)'? Почему вы передаете 'this' на' changeStatus() '? Без него он работает нормально. Мне просто интересно узнать. Благодаря! – phil

+0

передачи не требуется, поскольку переменная «this» все еще находится в области действия, когда в функции changeStatus. я отредактирую свой ответ, чтобы избежать путаницы. о чем вы опираетесь на вторую строчку? – jbabey

+0

Просто a, вместо a; - Это не сработало, пока я не разобрался. Спасибо за ссылку, а также btw - не встретили этот сайт раньше. – phil

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"); 
}); 
+0

Спасибо, Джон. Я начал так, но нашел, что это не сработало ... Если я добавляю 'console.log ($ (this));' он показывает $ (this), ссылаясь на запрос 'get'. – phil

Смежные вопросы