1

我有这个代码:

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 回调并且他的签名不能被覆盖?

4

2 回答 2

6

in 中的第三个参数$.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);
于 2013-06-22T11:16:44.543 回答
1

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

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

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

于 2013-06-22T10:59:47.947 回答