代码之家  ›  专栏  ›  技术社区  ›  rxmnnxfpvg

jQuery向回调传递更多参数

  •  248
  • rxmnnxfpvg  · 技术社区  · 16 年前

    在jQuery中有没有办法将更多数据传递到回调函数中?

    $.post ,例如,传入AJAX调用的结果数据以及一些自定义参数

    function clicked() {
        var myDiv = $("#my-div");
        // ERROR: Says data not defined
        $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
        // ERROR: Would pass in myDiv as curData (wrong)
        $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
    }
    
    function doSomething(curData, curDiv) {
    
    }
    

    14 回复  |  直到 8 年前
        1
  •  345
  •   Braiam nahurmf    8 年前

    解决方案是通过闭包绑定变量。


    作为一个更基本的示例,下面是一个接收和调用回调函数的示例函数,以及一个示例回调函数:

    function callbackReceiver(callback) {
        callback("Hello World");
    }
    
    function callback(value1, value2) {
        console.log(value1, value2);
    }
    

    这将调用回调并提供一个参数。现在,您需要提供一个附加参数,因此将回调封装在闭包中。

    callbackReceiver(callback);     // "Hello World", undefined
    callbackReceiver(function(value) {
        callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
    });
    

    或者,更简单地说,使用 ES6 Arrow Functions

    callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
    

    至于你的具体例子,我没有使用 .post 函数指针

    function callBack(data, textStatus, jqXHR) {};
    

    因此,我认为解决办法如下:

    var doSomething = function(extraStuff) {
        return function(data, textStatus, jqXHR) {
            // do something with extraStuff
        };
    };
    
    var clicked = function() {
        var extraStuff = {
            myParam1: 'foo',
            myParam2: 'bar'
        }; // an object / whatever extra params you wish to pass.
    
        $.post("someurl.php", someData, doSomething(extraStuff), "json");
    };
    

    在最后一行, doSomething(extraStuff) 调用 函数指针 .

    因为 extraStuff doSomething 这是本条例草案的范围 剂量

    多余的 在返回的匿名内部函数中引用 剂量 它由闭包绑定到外部函数的 多余的 论点这是事实,即使在 剂量

    我没有测试过上面的代码,但在过去的24小时里我已经编写了非常类似的代码,并且正如我所描述的那样工作。

    当然,根据您的个人偏好/编码标准,您可以传递多个变量,而不是单个“extraStuff”对象。

        2
  •  83
  •   Vincent Robert    10 年前

    doSomething(data, myDiv) ,您实际上调用了该函数,而没有对其进行引用。

    你可以通过考试 doStomething 直接运行,但必须确保其具有正确的签名。

    function clicked() {
        var myDiv = $("#my-div");
        $.post("someurl.php",someData, function(data){ 
          doSomething(data, myDiv)
        },"json"); 
    }
    
    function doSomething(curData, curDiv) {
        ...
    }
    

    在匿名函数代码中,可以使用封闭范围中定义的变量。这就是Javascript作用域的工作方式。

        3
  •  53
  •   zeroasterisk    13 年前

    $.ajax({}) 基本语法与一个辅助函数。

    请把车开过去 key: value 在设置ajax请求时,就像在任何对象上一样配对。。。 (因为 $(this) 尚未更改上下文,它仍然是上面绑定调用的触发器)

    <script type="text/javascript">
    $(".qty input").bind("keypress change", function() {
        $.ajax({
            url: "/order_items/change/"+$(this).attr("data-order-item-id")+"/qty:"+$(this).val()+"/returnas.json",
            type: "POST",
            dataType: "json",
            qty_input: $(this),
            anything_else_i_want_to_pass_in: "foo",
            success: function(json_data, textStatus, jqXHR) {
                /* here is the input, which triggered this AJAX request */
                console.log(this.qty_input);
                /* here is any other parameter you set when initializing the ajax method */
                console.log(this.anything_else_i_want_to_pass_in);
            }
        });
    });
    </script>
    

    这比设置var更好的原因之一是,var是全局的,因此是可覆盖的。。。如果有两种东西可以触发ajax调用,那么理论上,触发它们的速度比ajax调用响应的速度要快,并且第二个调用的值会传递给第一个调用。使用上面的这种方法,这不会发生(而且使用起来也很简单)。

        4
  •  21
  •   Community CDub    8 年前

    在当今世界,有另一个更干净的答案,取自另一个堆栈溢出答案:

    function clicked()
    {
        var myDiv = $( "#my-div" );
    
        $.post( "someurl.php", {"someData": someData}, $.proxy(doSomething, myDiv), "json" );
    }
    
    function doSomething( data )
    {
        // this will be equal to myDiv now. Thanks to jQuery.proxy().
        var $myDiv = this;
    
        // doing stuff.
        ...
    }
    

    jQuery HOW TO?? pass additional parameters to success callback for $.ajax call?

        5
  •  8
  •   Rohan Almeida    16 年前

    您也可以尝试以下方法:

    function clicked() {
    
        var myDiv = $("#my-div");
    
        $.post("someurl.php",someData,function(data){
            doSomething(data, myDiv);
        },"json"); 
    }
    
    function doSomething(curData, curDiv) {
    
    }
    
        6
  •  5
  •   Artem Barger    16 年前

    您可以使用JavaScript的闭包:

    function wrapper( var1, var2,....) // put here your variables
    {
      return function( data, status)
      {
         //Handle here results of call
      }
    };
    

    当你能做到的时候:

    $.post("someurl.php",data,wrapper(var1, var2, etc...),"html");
    
        7
  •  3
  •   Igor    14 年前

    我在上一篇文章中犯了一个错误。这是如何在回调函数中传递附加参数的工作示例:

    function custom_func(p1,p2) {
        $.post(AJAX_FILE_PATH,{op:'dosomething',p1:p1},
            function(data){
                return function(){
                    alert(data);
                    alert(p2);
                }(data,p2)
            }
        );
        return false;
    }
    
        8
  •  3
  •   molokoloco    12 年前

    让我们简单点吧!:)

    $.ajax({
        url: myUrl,
        context: $this, // $this == Current $element
        success: function(data) {
            $.proxy(publicMethods.update, this)(data); // this == Current $element
        }
    });
    
        9
  •  2
  •   Lorenzo Polidori madhead    11 年前

    使用 .ajax() 用于向回调函数传递附加参数的jQuery API和闭包:

    function sendRequest(method, url, content, callback) {
        // additional data for the callback
        var request = {
            method: method,
            url: url
        };
    
        $.ajax({
            type: method,
            url: url,
            data: content
         }).done(function(data, status, xhr) {
            if (callback) callback(xhr.status, data, request);
         }).fail(function(xhr, status) {
            if (callback) callback(xhr.status, xhr.response, request);
         });
    };
    
        10
  •  1
  •   Lyfing    11 年前

    对我和其他刚接触Javascript的新手来说,
    Closeure Solution 有点太让人困惑了。

    虽然我发现了这一点,但您可以使用jquery轻松地向每个ajax回调传递任意多的参数。

    这是 .

    第一个,哪个 @零星号 如上文所述,例如:

    var $items = $('.some_class');
    $.each($items, function(key, item){
        var url = 'http://request_with_params' + $(item).html();
        $.ajax({
            selfDom     : $(item),
            selfData    : 'here is my self defined data',
    
            url         : url,
            dataType    : 'json',
            success     : function(data, code, jqXHR){
                // in $.ajax callbacks, 
                // [this] keyword references to the options you gived to $.ajax
                // if you had not specified the context of $.ajax callbacks.
                // see http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings context
                var $item = this.selfDom;
                var selfdata = this.selfData;
                $item.html( selfdata );
                ...
            } 
        });
    });
    

    第二,通过将自定义数据添加到 XHR object 它存在于整个ajax请求-响应生命周期中。

    var $items = $('.some_class');
    $.each($items, function(key, item){
        var url = 'http://request_with_params' + $(item).html();
        $.ajax({
            url         : url,
            dataType    : 'json',
            beforeSend  : function(XHR) {
                // 为了便于回调,把当前的 jquery对象集存入本次 XHR
                XHR.selfDom = $(item);
                XHR.selfData = 'here is my self defined data';
            },
            success     : function(data, code, jqXHR){
                // jqXHR is a superset of the browser's native XHR object
                var $item = jqXHR.selfDom;
                var selfdata = jqXHR.selfData;
                $item.html( selfdata );
                ...
            } 
        });
    });
    

    正如您所看到的,这两种解决方案有一个缺点:您每次都需要编写一点代码,而不仅仅是编写:

    $.get/post (url, data, successHandler);
    

    阅读有关$.ajax的更多信息: http://api.jquery.com/jquery.ajax/

        11
  •  1
  •   Kőhalmy Zoltán    8 年前

    如果还有人来这里,这是我的看法:

    $('.selector').click(myCallbackFunction.bind({var1: 'hello', var2: 'world'}));
    
    function myCallbackFunction(event) {
        var passedArg1 = this.var1,
            passedArg2 = this.var2
    }
    

    在绑定到回调函数之后,这里发生的事情将在函数中作为 this .

    bind 功能。

        12
  •  1
  •   Musa    8 年前
    $(document).on('click','[action=register]',function(){
        registerSocket(registerJSON(),registerDone,second($(this)));
    });
    
    function registerSocket(dataFn,doneFn,second){
                     $.ajax({
                           type:'POST',
                           url: "http://localhost:8080/store/public/register",
                           contentType: "application/json; charset=utf-8",
                           dataType: "json",
                           data:dataFn
                     }).done ([doneFn,second])
                       .fail(function(err){
                                console.log("AJAX failed: " + JSON.stringify(err, null, 2));
                            });
    }
    
    function registerDone(data){
        console.log(JSON.stringify(data));
    }
    function second(element){
        console.log(element);
    }
    

    第二种方式:

    function socketWithParam(url,dataFn,doneFn,param){
      $.ajax({
        type:'POST',
        url:url,
        contentType: "application/json; charset=utf-8",
        headers: { 'Authorization': 'Bearer '+localStorage.getItem('jwt')},
        data:dataFn
        }).done(function(data){
          doneFn(data,param);
        })
        .fail(function(err,status,xhr){
        console.log("AJAX failed: " + JSON.stringify(err, null, 2));
        });
    }
    
    $(document).on('click','[order-btn]',function(){
      socketWithParam(url,fakeDataFn(),orderDetailDone,secondParam);
    });
    
    function orderDetailDone(data,param){
      -- to do something --
    }
    
        13
  •  0
  •   jrharshath    16 年前

    实际上,您的代码不起作用,因为在编写时:

    $.post("someurl.php",someData,doSomething(data, myDiv),"json"); 
    

    你放一个 函数调用 作为第三个参数,而不是 函数引用

        14
  •  0
  •   Community CDub    8 年前

    作为 b01's answer ,第二个论点 $.proxy 通常用于保存 this 美元代理 部分应用于函数,用数据预填充函数。请注意,任何参数 $.post 到回调的传递将在末尾应用,因此 doSomething 应在其参数列表的末尾列出:

    function clicked() {
        var myDiv = $("#my-div");
        var callback = $.proxy(doSomething, this, myDiv);
        $.post("someurl.php",someData,callback,"json"); 
    }
    
    function doSomething(curDiv, curData) {
        //"this" still refers to the same "this" as clicked()
        var serverResponse = curData;
    }
    

    此方法还允许将多个参数绑定到回调:

    function clicked() {
        var myDiv = $("#my-div");
        var mySpan = $("#my-span");
        var isActive = true;
        var callback = $.proxy(doSomething, this, myDiv, mySpan, isActive);
        $.post("someurl.php",someData,callback,"json"); 
    }
    
    function doSomething(curDiv, curSpan, curIsActive, curData) {
        //"this" still refers to the same "this" as clicked()
        var serverResponse = curData;
    }