jQuery:如何在不丢失默认参数的情况下将参数添加到回调函数中

时间:2013-06-22 10:57:29

标签: javascript jquery jquery-callback

我有这段代码:

var callbackAfterLoad = function(data, ecBlock) {
    ecBlock.html(data);
    ecBlock.slideDown();
}

function bindevents(userInput, ecBlock, callbackAfterLoad) {
    userInput.keyup(function () {
        delay(function () {
            $.post("/preview", {content:userInput.val()}, callbackAfterLoad(data, ecBlock));
        }, 500);
    });
 }

这个错误:

Uncaught ReferenceError: data is not defined 

但是当我查看jQuery示例时

$.post("test.php", function(data) {
  alert("Data Loaded: " + data);
});

为什么我收到此错误?为什么jQuery示例工作而不是我的? (我们不能添加参数?)。是否定义了默认的$ .post回调,并且无法覆盖其签名?

2 个答案:

答案 0 :(得分:6)

$.post中的第三个参数应该是一个函数,但是当你这样做时:

$.post("/preview", {content:userInput.val()}, callbackAfterLoad(data, ecBlock))

第三个参数不是函数,而是函数的返回值。像这样:

fn = callbackAfterLoad   // function reference
fn = callbackAfterLoad() // function execution and return value reference

在您的示例中执行时,data尚不可用。正确的语法是:

$.post("/preview", {content:userInput.val()}, callbackAfterLoad)

如果需要将自定义参数传递给回调,可以创建一个新的代理函数,如下所示:

var callback = function(data) {
    callbackAfterLoad.call(this, data, ecBlock);
};
$.post("/preview", {content:userInput.val()}, callback);

答案 1 :(得分:1)

尝试以另一种方式使用.post方法:

$.post("/preview", {content:userInput.val()}, function(data){ callbackAfterLoad(data, ecBlock)} );

您的示例无效,因为您在callbackAfterLoad实际“发生”之前立即呼叫.post并返回数据。在jQuery示例中,回调函数仅作为处理程序注册,但不会立即触发。