2011-08-09 64 views
2

我有一個圖像滑塊插件,我想擴展一些功能。我想使它這樣你就可以通過調用以下,如jQuery的用戶界面不會調用下一個方法:jQuery插件 - 調用公共函數/方法

$("#elemID").imageSlider("next");

我就如何完成這件事損失就是一種。這是迄今爲止我所缺乏的一些膽量。

(function($) { 
$.fn.imageSlider = function (options) { 
    var options = $.extend({}, $.fn.imageSlider.defaults, options), 
     obj = $(this),       // Set it here so we only look for it once 
     objID = obj.attr('id'), 
     sliderName = objID + '_slider', 
     total = 0, 
     counterID = objID + '_ct'; 

    // Private Methods 
    var initialize = function() {   
     if (options.jsonObject === null) { 
      processAjax(); 
     } else { 
      process(options.jsonObject); 
     } 

     return obj; 
    } 

    // Executes an AJAX call 
    var processAjax = function() { 
     $.ajax({ 
      url: options.jsonScript, 
      type: 'GET', 
      data: options.ajaxData, 
      dataType: 'json', 
      success: function (data) { 
       process(data); 
      }, 
      complete: function (jqXHR, textStatus) { 
       if (options.onComplete !== $.noop) { 
        options.onComplete.call(); 
       } 
      } 
     }); 
    } 

    var process = function (data) { 
     // Generates the HTML 
    } 

    var changeImage = function (me, target, ops) { 
     //rotate the image 
    } 

    $.fn.imageSlider.next = function (elemID) { 
     // Currently how I call next on the slider 
    } 

    return initialize(); 
} 


$.fn.imageSlider.defaults = { 
    // options go here 
    } 
})(jQuery) 

回答

1

標準的方式做到這一點(see docs)是創建的名字叫methods設有專賣店,您的每一個方法的對象,而實際推廣中查找按名稱調用的方法,並運行它。贊...

(function($){ 

    var methods = { 
    init : function(options) { // THIS }, 
    process : function() { // IS }, 
    changeImage : function() { // GOOD }, 
    next : function(content) { // !!! } 
    }; 

    $.fn.imageSlider = function(method) { 

    // Method calling logic 
    if (methods[method]) { 
     return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); 
    } else if (typeof method === 'object' || ! method) { 
     return methods.init.apply(this, arguments); 
    } else { 
     $.error('Method ' + method + ' does not exist on jQuery.imageSlider'); 
    }  

    }; 

})(jQuery); 
+0

謝謝!我一定看過那一百萬次,卻從未意識到這一點。 – tomoguisuru