3

getJSON 関数内で変数値が正しく設定されていません。変数 $videoId は、最初のアラートで予想どおり 396 と 397 を表示します。

しかし、2 番目のアラートでは、値 397 が 2 回表示されます。

ここで何か不足していますか?この種の問題について議論している他の投稿は見つかりませんでした。もしそうなら、私をそこに向けてください。

以下はjQueryコードです。

 $( "div .ow_video_list_item").each(function(){         
     $videoId = $(this).children("a").attr("href").split("/")[5];
     alert($videoId);    ==> First Alert

     $.getJSON("video/get-embed/" + $videoId + "/", function (data)   
     {                        
         $.each(data, function (key, code) {                                  
             alert($videoId);   ==> Second Alert
         });       
     });  

  });

以下は HTML コードです。

<div class="ow_video_list_item ow_small">
    <a href="http://site.com/video/396">Video 1</a>
</div>

<div class="ow_video_list_item ow_small">
    <a href="http://site.com/video/397">Video 2</a>
</div>
4

4 に答える 4

1

いくつかのこと。

  • あなたのコードでは $videoId が定義されていません。$videoLink は実際には $videoId であると想定しています。将来の参考のために、そのデータポイントにアクセスするためにこれらのようなことをする方が簡単かもしれません

<a href="http://site.com/video/396" data-video-id="396">Video 1</a>

そうすれば、そのビデオ ID に簡単にアクセスできます$(element).data('videoId')。クラスを使用するなど、これには他の戦略があります。

  • コード サンプルで $videoLink が $videoId であると想定されていない場合、$videoId はその関数の範囲外のどこかで定義されています。JS のスコープ/クロージャに関するリソースはたくさんあります。かなりの量の JS 開発作業を行っている場合は、Javascript: The good partsをお勧めします。

  • コード サンプルで $videoLink が実際に $videoId であると仮定することに戻ります。その .each ループ内で値を割り当てていますが、その変数自体はその関数内で「閉じられていません」。グローバルであるか、その各ループの範囲外の別の場所で定義されています。その var を保持するためvarにステートメントの前にa をスローします。$videoLink =

  • 別の潜在的な問題は、サーバーへの非同期呼び出しを呼び出しているが、その非同期呼び出しの範囲外の変数に依存していることです。ほとんどの場合、これらの呼び出しはミリ秒単位ですが、何が起こっているのかを理解する良い方法は、頭の中でコードを調べて、各サーバー呼び出しに 1 分かかると仮定することです。あなたの例では、外側のループが一度実行され、396 の ID を取得してから AJAX 要求を開始し、再度ループして ID 397 に対して同じことを行います。サーバーは、2 番目の ajax 要求にかかった時間内に応答しませんでした発射する。したがって、現在 2 つの ajax リクエストがぶら下がっています。$variableLink 変数は、ajax コールバック関数の外部で定義されているため、値は 397 です。これに対する解決策は?いくつかあります。

それを行う方法は他にもありますが、その変数を追跡する以外に何をしようとしているかの正確なユースケースを知らなければ、それを言うのは困難です. しかし、これは良い出発点になるはずです。

于 2013-02-27T15:25:40.690 に答える
1

getJson の非同期性に関する他のコメントは正しいです。しかし、ほとんどの問題は、グローバル変数 $videoId を使用することです。置き換えた場合:

$videoId = $(this).children("a").attr("href").split("/")[5];

var $videoId = $(this).children("a").attr("href").split("/")[5];

非同期メソッドを使用している場合でも問題ありません。

于 2013-02-27T14:45:29.947 に答える
1

メソッドを実行するときはgetJson、非同期コードを使用します。その場合、最後に指定した値は、アラート値で$videoIDある397両方のコールバックでそうです。これを乗り越える方法はいくつかあります。たとえば、アクションvideoIDから取得した「データ」の値を返し、それを使用できます。または、単純な整数変数を使用する代わりに、適切なキーを持つ値の配列を使用できます。たとえば、インデックス ( : 内) などです。そのように機能させる方法を見つける必要があります。私はそれがそれを行う最も簡単な方法だと思います!それが役立つことを願っています。getJsonalert(data.videoID)i$().each(function(i,e) {})data.id

于 2013-02-27T14:32:36.323 に答える
1

$videoLink実際$videoIdにはコメントで指摘されていると仮定します:

これは、getJSONメソッドが非同期であり、javascript クロージャを扱っているためです。コールバックを実行するとgetJSON:

function (data)   
     {                        
         $.each(data, function (key, code) {                                  
             alert($videoId);   ==> Second Alert
         }); 

最初の各ループでループし、$videoId が最後の値を取得したため、397 が 2 回表示されます。

JavaScript クロージャがどのように機能するかについては、こちらをご覧ください: JavaScript クロージャはどのように機能しますか?

于 2013-02-27T14:28:53.403 に答える