Search code examples
javascriptjqueryjquery-callback

jQuery: how to add parameter to a callback function without losing default parameter


I have this code:

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);
    });
 }

And this error:

Uncaught ReferenceError: data is not defined 

But when I check out jQuery examples

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

Why do I got this error ? Why do jQuery example is working and not mine ? (we cannot add parameters ?). Is the default $.post callback defined and his signature cannot be overriden ?


Solution

  • The third argument in $.post should be a function, but when you do this:

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

    The third argument is not the function, but the return value of the function. Like this:

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

    And when executed in your example, data is not available yet. The correct syntax would be:

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

    If you need to pass custom arguments to your callback, you can create a new proxy function like this:

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