0

我有 2 个 JS 文件,一个包含要在多个名为“form.js”的文件之间共享的通用函数列表,另一个特定于我的 CMS 上的某个页面,名为“blog.form.js”。

在“form.js”中,我有一个通用的 JS 函数,每当我请求从数据库加载记录时,它都会发出 jQuery.ajax() 请求:

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

如果您需要更多关于.done()真正内容的信息,请查看 jquerys 网站上的 Deferreds 以及上面的链接。我希望这有帮助。

于 2012-05-02T23:50:11.783 回答