0

私たちのサイトのいくつかのjsファイルに含まれている「ユーティリティ」js関数があったので、コードの繰り返しを減らすために、それをユーティリティファイルに移動し、すべてのjsファイルを変更してロードしてからで使用しましたgetScript。これはほとんどの場合に機能しましたが、livequeryを使用する1つのコードで、エラーが発生します。

新しい関数を使用する必要がある場合は常に、正常に使用しているコード:

$.getScript("js/utilities.js", function(){
   ... use parseQueryString function ....
});

前のコード:

$('.preview')
    .livequery(function(){
            $(this).attr('rel','myPage.cfm?' + parseQueryString($(this).attr('rel')));
        });

基本的に、「preview」のクラスを持つ要素がシーンに表示されるたびに、rel属性を解析して、新しく解析された文字列に置き換えます。

後のコード:

$('.preview')
    .livequery(function(){
            var preview = $(this);
            // load utilities.js so that we can access the parseQueryString function
            $.getScript("js/utilities.js", function(){
                preview.attr('rel','myPage.cfm?' + parseQueryString(preview.attr('rel')));
            });
        })

$('.preview').livequery問題は、これが呼び出しのコールバックを実行する前にループの次の反復に続くように見えることgetScriptです。したがって、preview変数は、そのrel属性を適切な値に置き換える前にリセットされます。これを正しく実行するにはどうすればよいですか?

4

2 に答える 2

0

私が思いついた回避策はうまくいっているようです... livequery ループの周りに getScript 呼び出しを配置し​​ます。

 // load utilities.js so that we can access the parseQueryString function
$.getScript("js/utilities.js", function(){
    $('.preview')
        .livequery(function(){
            $(this).attr('rel','myPage.cfm?' + parseQueryString($(this).attr('rel')));
        })
});
于 2012-11-07T09:29:19.873 に答える
0

タイトルで問題に名前を付けたと思います:)「非同期」がまさに原因です-ユーティリティのロードがオンになっており、その間にリクエストが行われ、実行が続行されるため..さらに一致するものがあれば、さらに別のライブクエリコールバックを入力します. 率直に言って、複数回ループする関数内にスクリプトのロードを配置するのは本当に悪い考えだと思います。それは少し無意味です。通常のスクリプトのように含めない理由はありません。

<script src="js/utilities.js" type="text/javascript"></script>

これが最もシンプルで合理的な解決策だと思います。ただし、何らかの理由で本当にこれを使用できない場合は、コンテキストを介してコールバック用の変数のローカル コピーを確保するか ( getScript は $.ajax ショートカットであるため、$.ajax コンテキスト オプションを参照してください)、または同期を試してください。 ajax...最後のものはオプションですが、この場合は実際に試してはいけません:)

于 2012-11-07T09:22:30.583 に答える