3

簡単に言えば、ページがロードされる前に時々完了する ajax 呼び出しがあるので、コールバックを でラップしようとしましたが、ページがロードされると$( fn )コールバックが起動しません... 誰かこれに対する良い解決策がありますか?

$.get( '/foo.json', function( data ){
    $( function(){
        // won't get here if page ready beats the ajax call

        // process data
        $( '.someDiv' ).append( someData );
    } );
} );

はい、それらの順序を逆にすると常に機能することはわかっていますが、ドキュメントの準備が整うまで ajax 呼び出しが不必要に延期されます。

4

6 に答える 6

1

いいえ、onDOMready に追加された関数は常に実行され、イベントが既に発生している場合は即座に実行されます。http://api.jquery.com/ready/のドキュメントを参照してください。使用する場合のみ$(document).bind("ready")、イベントが既に発生したときに実行されません。

イベント ハンドラーが起動しない理由として考えられるのは、他のハンドラーがエラーをスローしていることです。jQuery には、実行されるハンドラー用の内部配列があり、ネイティブ DOM ロード イベントを処理するメソッドはそれを反復処理します。以前のハンドラーのいずれかでエラーが発生した場合、ループが中断され、その後に追加された他のハンドラーは呼び出されません。

于 2012-04-10T17:14:24.807 に答える
1
var result;
$(document).on('ready.specialAjax', function () {
   if (result) {
      $(".someDiv").append(result);
   }
});
$.get('/foo.json').done(function (data) {
   if ($(".someDiv").length) {
      $(".someDiv").append(data);
      $(document).off('ready.specialAjax');
   }
   else {
      result = data;
   }
});

基本的に、ajax は、可能であればすぐに someDiv に追加しようとします。それ以外の場合は、ajax の結果を格納し、実行時に独自に追加しますresultdocument.readyこれ.offは、ajax が正常に実行された場合にデータが 2 回追加されるのを防ぐために行われます。その場合、結果は空白になるため、これは問題ではありませんが、きれいにするためです。

于 2012-04-10T17:19:32.517 に答える
1

deferred を使用した別の方法を次に示します。どうやら、 deferreds を で使用できるようですがdocument.ready、少し奇妙です:

$(document).data("readyDeferred", $.Deferred()).ready(function() {
   $(document).data("readyDeferred").resolve();
});
var jqxhr = $.get('/foo.json');
$.when(jqxhr, $(document).data('readyDeferred'))
   .done(function (jqxhr) {
      $(".someDiv").append(jqxhr[2].responseText);
   });
于 2012-04-10T17:26:33.433 に答える
0

結果をグローバル変数にロードし、DOM対応にロードします。重要なのは、結果が空の場合は、空になるsetTimeoutまで繰り返し処理することです。

var result;
$.get("/foo.json", function(data) {
    result = data;
});

function insertAJAX() {
    if(result !== undefined) {
        $(".someDiv").append(result);
    } else {
        setTimeout(insertAJAX, 250);
    }
}

$(function() {
    insertAJAX();
});

AJAXが何らかの理由で結果を返さない場合に備えて、タイムアウトカウンターを追加して、一定の時間が経過した後に試行を停止することができます。

于 2012-04-10T17:16:06.803 に答える
0

これをするのは悪くありません。

var getData;
$.get( '/foo.json', function( data ){
    getData = data;
});
$(function() {
    var intt = setTimeinterval(function() {
         if(getData.length) {
              //do your task
              clearInterval(intt);
         }
    }, 100);
});
于 2012-04-10T17:21:57.470 に答える
0

AJAX コールバック内で dom の準備ができているかどうかを確認して、準備完了後に追加するか、すぐに追加するかを確認する必要があります。以下のコードを参照してください。

var isDomReady = false;

$.get( '/foo.json', function( data ){
    if (isDomReady) {
      $(function(){  $('.someDiv').append( someData );   });
    } else {
       $('.someDiv').append( someData );  
    }
} );

$(function(){
   isDomReady = true;
   // and all you ready code
});
于 2012-04-10T17:19:48.377 に答える