2013-03-27 51 views
1

好的,所以我對jQuery插件遊戲很陌生,我做了大量的閱讀,看起來好像有2700萬種方法來編寫jQuery插件。我想在我的插件中使用最簡潔的方式來處理事件。jQuery插件如何添加事件?

就拿這個基地插件模式:

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

    var pluginName = 'MyPlugin'; 
    var defaults = { 
      propertyName: "value" 
    }; 

    function Plugin(element, options) { 
      this.options = $.extend({}, defaults, options); 
      this._defaults = defaults; 
      this._name = pluginName; 
      this.element = element; 
      this.init(); 
    } 

    Plugin.prototype = { 
      init: function() { 
        // SOME INIT FUNCTION 
      }, 
      someMethod: function(el, options) { 
        // DO SOMETHING ELSE 
      } 
    } 

    $.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); 

然後我們有這個簡單的html:

<a href="a link to somewhere">My Link</a> 

讓我們在我們的插件說我們想鏈接被點擊時提醒href和防止默認操作。顯然,這是一個非常愚蠢的例子,我想要做的事情更加激烈,所以請不要說'你不需要插件,'因爲這不是重點。

所以我們初始化我們對我們的鏈接插件:

$(document).ready(function(){ 
    $('a').each(function(){ 
     $(this).MyPlugin(); 
    }); 
}); 

我不知道是否有添加一個點擊的方式:方法,只是有它自動調用。或者也許有某種內部事件綁定?

+0

它看起來像(從插件b的方式oilerplate被寫入),你可以輸入$('a')。MyPlugin()來將它綁定到所有的元素。 – 2013-03-27 05:51:17

+0

好吧,但這並不回答事件問題 – Tomas 2013-03-27 06:13:07

回答

0

編輯2:我是對的第一次,嘿。我之前沒有使用過這種模式,但我喜歡它。

因此,在您的插件原型方法中,您可以訪問each循環中的元素,因此您可以在那裏綁定點擊或任何您想要的內容!

$.fn[pluginName] = function(options) { 
    return this.each(function() { 
     $(this).click(function(event) { 
      event.preventDefault(); 
      alert($(this).attr('href')); 
     }); 

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

而且,在function Plugin線是在你的代碼缺少{

看到它在此琴工作:http://jsfiddle.net/PDyEd/

+0

我不認爲這是放置該代碼的好地方。在這種設置中,代碼塊主要用於確保沒有插件的多個副本。 – Tomas 2013-03-27 12:51:31

+0

是啊......我真的同意伊格納西奧的看法後再次。 – CWSpear 2013-03-27 17:29:53

1

我只想在初始化函數中添加一個click事件,所以它是清潔

Plugin.prototype = { 
    init: function() { 
     // DO INIT 

     $(this.element).on("click", function(e){ 
      e.preventDefault(); 
      alert($(this).attr("href")); 
     }); 
    }, 
    someMethod: function(el, options) { 
     // DO SOMETHING ELSE 
    } 
}; 

或者,

你可以只把它放在一個單獨的方法:http://jsfiddle.net/nashio/PDyEd/4/

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

    var pluginName = 'MyPlugin'; 
    var defaults = { 
     propertyName: "value" 
    }; 

    function Plugin(element, options) { 
     this.options = $.extend({}, defaults, options); 
     this._defaults = defaults; 
     this._name = pluginName; 
     this.element = element; 
     this.init(); 
     this.attachEvents(this.element, this.options); 
    } 

    Plugin.prototype = { 
     init: function() { 
      // DO INIT 
     }, 
     attachEvents: function(el, options) { 
      $(el).on("click", function(e){ 
       e.preventDefault(); 
       alert($(this).attr("href")); 
      }); 
     } 
    }; 

    $.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() { 
    $('a').MyPlugin(); 
}); 
+0

我試圖找出是否有辦法將此功能從init函數中取出。我想一個人可以把點擊處理程序放在init中,並將它發送到一個點擊方法......聽起來不像它應該是這樣。 – Tomas 2013-03-27 12:58:36

+0

那麼,init在創建對象時正在執行,所以這就是爲什麼我會把它放在那裏,但如果你想把它拿出來,你可以把它放在一個可能被稱爲「attachEvents」的方法上,然後執行它實例。 – Ignacio 2013-03-27 18:30:40

+0

我會選擇這個作爲正確的答案,但我不認爲事件附件應該出現在主插件函數中。我最終做的是創建一個方法,在這種情況下,我們將其稱爲alertHref。請看這裏的示例小提琴:http:// jsfiddle。淨/ kjVhE/ – Tomas 2013-03-28 15:39:37