3

我试图让一个函数从我可以使用的 ajax 调用返回数据。问题是函数本身被许多对象调用,例如:

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html, obj) {
            alert (html);
        }  
    }); 

    return false;
}

这意味着在匿名“成功”函数中,我无法知道调用的 obj(或 id)实际上是什么。我能想到的唯一方法是将 id 附加到文档中,但这似乎有点太粗糙了。还有另一种方法吗?

4

4 回答 4

7

您可以使用封闭范围中的变量,这种技术称为“闭包”。所以:

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html) {
            alert(obj.id);  // This is the obj argument to ajax_submit().
            alert(html);
        }  
    }); 

    return false;
}
于 2010-04-28T17:17:33.030 回答
4

如果您尝试通过 ajax 将 html 加载到页面上,您可能需要考虑load()函数。

于 2010-04-28T17:18:36.470 回答
2

JavaScript 中的函数被封闭在定义它们的范围内(这是一个闭包)。在这种情况下,每次调用都会创建一个新的匿名成功回调函数ajax_submit(),因此父作用域中的所有变量将始终可以访问。

您的代码应该可以正常工作。如果你想有一个回调函数,它可以作为参数传递给ajax_submit()并像这样调用:

…
success: function(html, obj) {
    callback(html);
}
…
于 2010-04-28T17:21:04.780 回答
0

变量obj,idmessage都在匿名函数中可用。

这是因为 Javascript 中有一个称为闭包的功能,我建议您阅读一下。

闭包的一般要点是,函数将永远可以访问存在于其定义范围内的变量。

这样做的结果是您可以执行以下操作:

    success: function(html) {
        alert (id);
        alert (obj);
    } 

整天(但请注意,obj成功函数中的参数将优先obj于 ajax_submit 函数中的变量。)

于 2010-04-28T17:19:43.753 回答