0

「form.js」と呼ばれる複数のファイル間で共有される汎用関数のリストを含む 2 つの JS ファイルと、「blog.form.js」と呼ばれる CMS の特定のページに固有の別の JS ファイルがあります。

"form.js" の内部には、データベースからレコードをロードするように要求するたびに jQuery.ajax() 要求を行う汎用 JS 関数があります。

function load_record( field_id, class_name, entity_type ) {

// Send ajax request to load the record, and enable the form's state once the record's content has been received.
var response = $.ajax({
    async: false,
    dataType: "json",
    data: {
        action: "load_"+entity_type,
        id: $("#"+field_id+"_list").val()
    },
    success: function(response) {
        // Make visible the buttons to allow actions on record, such as deleting or renaming.
        $("#"+field_id+"_actions").show();

        // Make visible the container of all form elements related to the record.
        $("#"+field_id+"_form_inputs").show();

        // Must return response so the calling JS file can use the values returned to
        // populate the form inputs associated with the record that's just been loaded
        // with the correct values.
        return response;
    },
    type: "post",
    url: "/ajax/record/"+class_name
});
alert( response.link + " " + response + " " + response.responseText);
return response;

}

「blog.form.js」内で、リストを含むメニューからロードするデータベース レコードを選択すると呼び出される関数があります。

// Select a link for editing.
$("#links_list").live( "change", function(){ 
    // Insert response returned from function call to load the db record into a variable.
    // This is so the form inputs associated with the record loaded can be populated with the correct values. 
    var response = load_record('links_edit', 'blog', 'link'); 
    alert( response.link );
    $("#links_edit_url").val( response.link );        
});

ajax リクエストは、目的のレスポンスを返します。残念ながら、load_record() 内のデバッグ アラート ステートメント "alert( response.link + " " + response + " " + response.responseText)" は、次を返します: undefined [Object XMLHTTPRequest] {"link": "http://www .url.com"}。

したがって、他の関数のデバッグ アラート ステートメント「alert( response.link )」も未定義を返します。

XMLHTTPRequest オブジェクトが正常に返されました。では、response.link がその値が未定義であると述べているのはなぜですか?

どんな助けでも大歓迎です。

4

2 に答える 2

0

あなたがしたい

alert( response.link + " " + response + " " + response.responseText);

成功関数の内部。あなたも欲しくない

var response = $.ajax(...

あなたはただajaxを呼び出すだけです...

$.ajax(...

Ajax は (そうしないように指示しない限り) 非同期です。つまり、要求はいつでも戻ってくる可能性があります。関数の外側で応答を使用しようとするのは意味がありませんsuccess(クロージャーでラップするか、引数として渡さない限り)。 success応答が (正常に) 完了したときに発生し、その関数でのみresponse定義されます。

于 2012-05-02T23:36:58.043 に答える
0

あなたは完全に正しい方向に進んでおり、ajax オブジェクトを返す関数を作成できます。jQuery はその ajax 呼び出しをDeferredオブジェクトとして返します。そのため、事後に ajax 応答を利用するための追加のメソッドがあります。

$("#links_list").live( "change", function(){ 
    load_record('links_edit', 'blog', 'link').done( function( response ) {
        alert( response.link );
        $("#links_edit_url").val( response.link );     
    });
});

alert( response.link + " " + response + " " + response.responseText);inはload_record、success または done ハンドラーに追加しない限り、そのまま返されます。

実際の内容についてさらに情報が必要な場合は、上記のリンクを使用して jquerys サイトの Deferreds を参照してください.done()。これが役立つことを願っています。

于 2012-05-02T23:50:11.783 に答える