1

2つのJavaScript関数があります。1つは(別の関数を介して)ajaxコンテンツをロードする関数で、もう1つはコールバック関数です。彼らは次のように見えます:

function createReply(callBack){
    ajaxPage('test.html', 'next-reply');
    callBack();
}

function updateNext(){
    document.getElementById('next-reply').id  = "reply-item";
}

createReply(updateNext);

ご覧のとおり、このcreateReply()関数を呼び出して、コールバック関数の名前を渡します。この場合はupdateNext()

このcreateReply()関数では、ajaxを介してコンテンツをロードする別の関数を呼び出しています。この関数が完了すると、コールバックが実行されることになっています。コールバックは、ajaxコンテンツがロードされているdivのIDを変更します。これが問題が発生している場所です

エラーが発生しました:

Uncaught TypeError: Cannot set property 'innerHTML' of null 

つまり、IDが「next-reply」の要素は存在しないため変更できません。存在しない理由は、その要素の場合、コールバック関数がIDを変更するためです。目的は、ajaxコンテンツがロードされた後(つまり、ajaxPage()関数が実行された後)にコールバックを起動させることです。

誰かが問題が何であるかを見ることができますか?プレーンJavaScriptでコールバック関数を実装するより良い方法はありますか?

PS:jQueryはありません

4

2 に答える 2

2

コメントで指摘されているように、これはAJAX呼び出しが非同期で発生するという事実によるものです。で実行されるスレッドcreateReplyは、サーバーから応答が返される前に実行を継続します。

ajaxPageへの参照を受け入れるにはリファクタリングする必要がありcallback、応答の準備ができたらそれを呼び出す必要があります。何かのようなもの:

function createReply(callBack){
    ajaxPage('test.html', 'next-reply', callBack);
}

次に、ajaxPageで:

function ajaxPage(url, id, callback){
   //Do AJAX stuff

   //When the response is returned:
   if(callback) callback();
}
于 2012-12-13T20:57:41.220 に答える
0

現在、コールバックはajaxPage関数の直後に実行されます。つまり、ajaxPageが成功を返すのを待たないということです。ajax呼び出しが終了した直後に発生します。コールバックが発生する前に完了していない可能性が非常に高くなります。

于 2012-12-13T20:31:20.147 に答える