2013-01-02 68 views
11

我一直在使用jQuery Boilerplate開發插件,我無法弄清楚的一件事是如何從插件外部調用方法。使用jQuery插件設計模式的調用方法

僅供參考,這裏是樣板代碼我說的是: http://jqueryboilerplate.com/

在我的小提琴,

http://jsfiddle.net/D9JSQ/2/

這裏是代碼:

;(function ($, window, document, undefined) { 

    var pluginName = 'test'; 
    var defaults; 

    function Plugin(element, options) { 
     this.element = element; 

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

     this._name = pluginName; 

     this.init(); 
    } 

    Plugin.prototype = { 
     init: function() { 
      this.hello(); 
     }, 
     hello : function() { 
      document.write('hello'); 
     }, 
     goodbye : function() { 
      document.write('goodbye'); 
     } 
    } 


    $.fn[pluginName] = function (options) { 
      return this.each(function() { 
       if (!$.data(this, 'plugin_' + pluginName)) { 
        $.data(this, 'plugin_' + pluginName, 
        new Plugin(this, options)); 
       } 
      }); 
    } 


})(jQuery, window, document); 

$(document).ready(function() { 
    $("#foo").test(); 
    $("#foo").test('goodbye'); 
}); 

我我正嘗試使用以下語法調用再見方法:

$("#foo").test('goodbye') 

我該如何做到這一點?在此先感謝

+0

你可以看到[我對這個問題的回答](http://stackoverflow.com/a/13778012/417685)。它有一個可訪問方法的jQuery插件模板,實際上非常類似於這個,但它不是一樣的 – Alexander

+0

從jquery樣板wiki:https://github.com/jquery-boilerplate/jquery-boilerplate/wiki/Extending- jQuery-Boilerplate – jackocnr

回答

18

您必須獲取該類的引用,才能使用該插件結構調用它的方法。

http://jsfiddle.net/D9JSQ/3/

$(document).ready(function() { 
    var test = $("#foo").test().data("plugin_test"); 
    test.goodbye(); 
}); 

做你想做什麼,你必須擺脫文件撰寫的對它進行測試。

http://jsfiddle.net/D9JSQ/8/

; 
(function($, window, document, undefined) { 

    var pluginName = 'test'; 
    var defaults; 

    function Plugin(element, options) { 
     this.element = element; 

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

     this._name = pluginName; 

     this.init(); 
    } 

    Plugin.prototype = { 
     init: function(name) { 
      this.hello(); 
     }, 
     hello: function(name) { 
      console.log('hello'); 
     }, 
     goodbye: function(name) { 
      console.log('goodbye'); 
     } 
    } 


    $.fn[pluginName] = function(options) { 
     return this.each(function() { 
      if (!$.data(this, 'plugin_' + pluginName)) { 
       $.data(this, 'plugin_' + pluginName, new Plugin(this, options)); 
      } 
      else if ($.isFunction(Plugin.prototype[options])) { 
       $.data(this, 'plugin_' + pluginName)[options](); 
      } 
     }); 
    } 


})(jQuery, window, document); 

$(document).ready(function() { 
    $("#foo").test(); 
    $("#foo").test('goodbye'); 
});​ 

查找到控制檯的信息。

+0

我在某處看到了一種模式,它將所有方法存儲到數組中,並檢查插件被調用時的選項是否爲字符串,如果是,則調用該方法。這種結構可能嗎? –

+1

是的,您只需在您的結構中添加一個elseif來檢查現有方法的原型。如果存在,它會被執行。這是一個很好的例子,重新發明輪子沒有意義:http://keith-wood.name/pluginFramework.html –

+0

@AndrewH我回答了類似的問題,以if/else在這裏:http://stackoverflow.com/問題/ 14078481 /不能調用的函數在簡單的jQuery插件/ 14078885#14078885我最近注意到這種新的模式,用於開發jQuery插件,我會檢查出你發佈的樣板鏈接。 – Syon