web-dev-qa-db-ja.com

パラメータとしてコールバックを受け入れるjquery関数を作成する方法

次の機能があります。

function ChangeDasPanel(controllerPath, postParams) {

    $.post(controllerPath, postParams, function(returnValue) {

        $('#DasSpace').hide("slide", { direction: "right" }, 1000, function() {

            $('#DasSpace').contents().remove();

            $('#DasSpace').append(returnValue).css("display", "block");

            $('#DasSpace').show("slide", { direction: "right" }, 1000);

        });

    });

};

しかし、私はこのようにそれを呼び出すことができるようにしたい

ChangeDasPanel("../Home/Test", {} ,function (){
  //do some stuff on callback
}

関数にコールバックのサポートを実装するにはどうすればよいですか?

48
_function ChangeDasPanel(controllerPath, postParams, f) {
  $.get(
    controllerPath, 
    postParams, 
    function(returnValue) {
      var $DasSpace = $('#DasSpace');
      $DasSpace.hide(
        "slide", { direction: "right" }, 1000, 
        function() {
          $DasSpace.contents().remove();
          $DasSpace.append(returnValue).css("display", "block");
          $DasSpace.show("slide", { direction: "right" }, 1000);
        }
      );
      if (typeof f == "function") f(); else alert('meh');
    }
  );
};
_

JavaScriptの他のオブジェクトと同様に関数を渡すことができます。コールバック関数を渡すのは簡単で、$.post()呼び出しで自分で行うこともできます。

コールバックを$.post()コールバックの一部として呼び出すか、それ自体で呼び出すかを決定できます。

75
Tomalak

グローバル変数とグローバル関数が悪であることがわかっているので、jQuery名前空間に自分のものを入れてみてください。

$.extend({
  myFunc : function(someArg, callbackFnk){
    var url = "http://example.com?q=" + someArg;
    $.getJSON(url, function(data){

      // now we are calling our own callback function
      if(typeof callbackFnk == 'function'){
        callbackFnk.call(this, data);
      }

    });
  }
});

$.myFunc(args, function(){
  // now my function is not hardcoded
  // in the plugin itself
});

この記事を読んで理解を深めてください。 jQueryでのコールバック関数の作成

22
Uzbekjon

私があなたを正しく理解していれば、別のパラメータを設定して変数を関数として呼び出すのと同じくらい簡単です:

function foo(mycallback) {
    mycallback();
}
14
Alan Plum

関数にパススルーできるオブジェクトを使用してみませんか。これはjQueryのようなもので、3つのパラメータを超えると扱いにくいため、メンテナンスが困難な名前付きパラメータxを節約できます。

例えば

function callingFunction(){

      var fnSettings: {
        url: someUrl,
        data: params,
        callback : function(){}
      };


      yourFunction( fnSettings );

}

function yourFunction( settings ) {

      $.post( settings.url, settings.data, settings.callback );

}
11
redsquare