2012-02-14 8 views
0

私は自分のjQuery関数を作成して、テーブル内のいくつかの行を並べ替えようとしています。ファンクション内でコールバックを呼び出す

この関数はかなりうまく動作しますが、私は設定オブジェクトで設定できるはずのコールバック関数を呼び出す方法は不明です。これはjQuery関数を作成する方法ですか?コードはここにアクションで見ることができます:http://jsfiddle.net/fcHQh/

機能は次のとおりです。

(function($){ 
    $.fn.reorder = function(options) { 

     var settings = { 
      'up': '.up', 
      'down': '.down', 
      'timeout': 1000, 
      'url': '', 
      'success': null, 
      'error': null 
     }; 

     var methods = { 
      init : function(element) { 
       $(settings.up + ',' + settings.down).on('click', function (event) { 
        event.preventDefault(); 
        var row = $(this).parents('tr:first'); 
        if ($(this).is(settings.up)) { 
         row.insertBefore(row.prev()); 
        } else { 
         row.insertAfter(row.next()); 
        } 
        tools.delay(function() { methods.sort(element) }, settings.timeout); 
       }); 
      }, 
      sort : function(element) { 
       $(element).find('tr').find('input:hidden').each(function() { 
        element.priorities.push($(this).val()); 
       }); 
       if (settings.url) { 
        methods.callback(element); 
       } 
      }, 
      callback : function(element) { 
          // THIS SHOULD ONLY BE FIRED IF CALLBACK IS DEFINED? 
       $.ajax({ 
        type: 'GET', 
        url: settings.url, 
        data: { priorities: element.priorities.join(',') }, 
        success: function() { 
        // FIRE THE 'settings.success' if its set 
        }, 
        error: function() { 
        // FIRE THE 'settings.error' if its set 
        } 
       }); 
      } 
     }; 

     var tools = { 
      delay : (function() { 
       var timer = 0; 
       return function (callback, ms) { 
        clearTimeout(timer); 
        timer = setTimeout(callback, ms); 
       }; 
      })() 
     } 

     return this.each(function() { 
      if (options) $.extend(settings, options); 
      this.priorities = []; 
      methods.init(this); 
     }); 
    }; 
})(jQuery); 

答えて

2

私はあなたがデフォルトオブジェクトを持って提案し、あなたのオプションを使用しているマージ:

var defaults = { 
    up: '.up', 
    down: '.down', 
    timeout: 1000, 
    url: '', 
    success: function() {}, 
    error: function() {} 
}; 

var settings = $.extend({}, defaults, options); 

// ... 
callback: function() { 
    $.ajax({ 
    success: settings.success, 
    error: settings.error 
    }); 
}, 
// ... 
+0

要旨はということですデフォルトを上書きしたくない場合や、渡されたオプションが上書きされないようにすることもできますが、デフォルトがある場合はコピーを作成することができます。 $ .extendはそれを実現します。 http://api.jquery.com/jQuery.extend/ –

+0

を参照してください。よろしくお願いします。:-) – janhartmann

+0

jQueryプラグインの作成に関する優れた入門書があります:http://docs.jquery.com/Plugins/Authoring –

関連する問題