0

chat.openChat()fromでHTMLコードを受け取りたいのですchat.getHtmlPage()が、リターン動作が「未定義」です。

var chat = {
    openChat : function($url){
        $('#popup').html(chat.getHtmlPage($url)); // It's wrong, UNDEFINED.
    },

    getHtmlPage : function($url){
        $.ajax({
            url: $url
        }).done(function($html) { 
            return $html; // It's OK! $html is with correct html, see with alert().
        });
    }
}

$(document).ready(function(){
    $('.btnChat').click(function(){
        chat.openChat($(this).attr('href')); // It's OK!
        ...
        return false;
    });
});
4

5 に答える 5

4

デフォルトでは AJAX リクエストは非同期であるため、 から結果を取得すると終了しますgetHtmlPage。同期に変更しても、からではなくハンドラーopenChatから値を返すため、未定義のままになります。donegetHtmlPage

メソッドにコールバックを提供する必要がありますgetHtmlPage。例:

var chat = {
    openChat : function($url){
        chat.getHtmlPage($url, function(html) {
            $('#popup').html(html); 
        });
    },
    getHtmlPage : function($url, callback){
        $.ajax({
            url: $url
        }).done(callback);
    }
}
于 2012-11-20T11:46:58.400 に答える
3

Ajax 呼び出しは非同期であるため、ajax 関数の戻り値をすぐに使用することはできません。結果を $('popup') に格納します。

次のようにする必要があります。

openChat : function($url){

    chat.getHtmlPage($url));
},

setHtmlPage : function ($html) {
    $('popup').html($html);
},


getHtmlPage : function($url){

    $.ajax({
        url: $url
    }).done(function($html) { 
        chat.setHtmlPage($html);
    });
}

また、ajax に関する jquery のドキュメントも参照してください。ajax リクエストを同期的に作成する方法はありますが、それはブラウザをブロックするため、新しいバージョンでは廃止されています。(そして、結局のところ、実際には ajax ではありません)

非同期に関する部分を確認してください

于 2012-11-20T11:46:27.220 に答える
2

次のようになります。

var chat = {
    openChat : function($url){
        chat.getHtmlPage($url);
    },

    getHtmlPage : function($url){
        $.ajax({
            url: $url
        }).done(function($html) { 
            $('#popup').html($html); 
        });
    }
}

$(document).ready(function(){
    $('.btnChat').click(function(){
        chat.openChat($(this).attr('href')); // It's OK!
        ...
        return false;
    });
});

AJAX は非同期です。一度呼び出すと、スクリプトの実行は次の行に進み.done、リクエストが終了した後に呼び出されます。また、return from done は何もしません。リクエストが完了した後にトリガーされるjquery ajaxイベントです。また、jqueryは、同期的に動作させても、戻り値を上位レベルのコードに渡しません。

于 2012-11-20T11:45:50.397 に答える
0

AJAXの最初の「A」は「非同期」です。これは、.done()が呼び出されるまでに、残りのコードがすでに移動していることを意味します。この知識があればreturn、.done()のaはまったく意味がありません。代わりに、.ajax-object
で設定して、AJAXの非同期動作を非アクティブ化します。async: falseただし、これはAJAXの本来の目的ではなく、一部のブラウザで問題が発生する可能性があることに注意してください。

その場合、解決策は(asyncをfalseに設定することに加えて)をに設定することですreturngetHtmlPage

getHtmlPage : function($url){

    //a new variable to store the ajax-result
    //defining it here, so it's only visible within the scope of getHtmlPage
    var html;

    $.ajax({
        url: $url,
        async: false
    }).done(function($html) {
        //we use the html variable here to store the result 
        html = $html;
    });

    //finally returning the variable
    return html;
}

このように、ajax-callが終了するまでreturnステートメントは実行されません。

于 2012-11-20T11:57:12.830 に答える
0

解決

1つの一般的な機能(元のアイデア)を実行します。

var chat = {

    openChat : function($url, $htmlElement){

        chat.setHtmlPage($url, $htmlElement);
    },


    setHtmlPage : function($url, $htmlElement){

        $.ajax({
            url: $url
        }).done(function($html) { 
            $($htmlElement).html($html);
        });
    }

}

$(document).ready(function(){

    $('.btnChat').click(function(){

        chat.openChat($(this).attr('href'), '#popup');

        ...

        return false;
    });

});
于 2012-11-20T11:58:35.350 に答える