2012-01-04 8 views
0

私は200のHTTPステータスを返すかどうかを見るためにリンクをチェックしようとしています。コード。もしそうなら、リンク上のクラスをオフラインからオンラインに変更したいと思います。

希望のプロセス:IPアドレスを指すすべてのリンクを取得し、それらにクラスを与えます。オフラインで、それぞれに対してYQLへのリクエストを行います。

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を別の関数に移動する必要があります。

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」がありません。

編集:「この」キーワードを持ついくつかの助け:http://jqfundamentals.com/#example-2.40

+0

ありがとうございましたjbabey - 二度目の行末にちょっとしたタイプミスがあったらすごくうまくいっています。コピーして貼り付けるだけではないかということを意図的にスローしました! :) 'changeStatus(that)'について聞いてもいいですか?なぜあなたは 'changeStatus()'に 'that'を渡しますか?それなしでうまくいくようです。私はちょうど知りたいと思っています。ありがとう! – phil

+0

changeStatus関数で "that"変数がスコープ内にあるので、渡す必要はありません。私は混乱を避けるために私の答えを編集します。二番目の行で何のタイプミスをしていますか? – jbabey

+0

aの代わりにちょうどa;私がそれを分類するまでは機能しませんでした。 リンクをありがとうbtw - 前にそのサイトに出くわしたことはありません。 – phil

0

"changeStatus()"メソッドのコードをスコープチェーンを維持するためにコールバッククロージャに直接組み込むようにコードをリファクタリングする必要があります。あなたはchangeStatus機能の内部$(this)を使用する場合

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));'を追加すると、まだ 'get'リクエストを参照して$(this)が表示されます。 – phil