https://learn.jquery.com/plugins/basic-plugin-creation/
http://maidot.blogspot.tw/2011/04/jquery-this-this-different-between-this.html
1.創建一個基礎的jQuery plugin
-把我們創造的plugin加入至$.fn之中
(擴展$.fn.abc(),即$.fn.abc()是對jquery擴展了一個abc方法,那麼後面你的每一個jquery實例都可以引用這個方法了)
$.fn.greenify = function() { this.css( "color", "green" ); }; $( "a" ).greenify(); // Makes all the links green.
-注意這邊是使用css(),所以我們也用this,而非$(this),
因為在JQuery中this代表目前的DOM對象,$(this)代表我們用JQuery所選取的JQuery對象,
在上述方法中,this代表greenify(),而他與.css()都同屬同一個jQuery object的一部份
2.Chaining 讓自建jQuery plugin可與其他方法相連
新增一行『return this』把該jQuery Object 傳回
$.fn.greenify = function() { this.css( "color", "green" ); return this; } $( "a" ).greenify().addClass( "greenified" );
3.確保plugin不會與其他JavaScript libraries產生衝突
(Protecting the $ Alias and Adding Scope)
在最外層多加一層$()宣告
(function ( $ ) { $.fn.greenify = function() { this.css( "color", "green" ); return this; }; }( jQuery ));
4.讓一個plugin根據參數,做出不同的動作
(function( $ ) { $.fn.popup = function( action ) { if ( action === "open") { // Open popup code. } if ( action === "close" ) { // Close popup code. } }; }( jQuery ));
5.透過each(),對多個指定的DOM elements進行處理
$.fn.myNewPlugin = function() {
return this.each(function() {
// Do something to each element here.
});
};
Notice that we return the results of .each() instead of returning this. Since .each() is already chainable, it returns this, which we then return. This is a better way to maintain chainability than what we've been doing so far..each() 方法,會遍歷jQuery對象中的每一個DOM元素
然後透過$(this) 將每一個取到的DOM變成jQuery Object
return this.each(function() { var link = $(this); link.css("color", setting.color) });6.讓一個plugin接受『一組設定』
(function ( $ ) { $.fn.greenify = function( options ) { // This is the easiest way to have default options. var settings = $.extend({ // These are the defaults. color: "#556b2f", backgroundColor: "white" }, options ); // Greenify the collection based on the settings variable. return this.css({ color: settings.color, backgroundColor: settings.backgroundColor }); }; }( jQuery ));Example usage:
$( "div" ).greenify({ color: "orange" });
defaults 設定的顏色透過$.extend()把覆蓋成傳進來的值
The default value for color of #556b2f gets overridden by $.extend() to be orange.
7.完整範例
my_plugin.js
(function($) { $.fn.greenify = function(action, options) { var setting = $.extend({ color: "green", backgroundColor: "white" }, options); if (action === 'div') { return this.css({ color: setting.color, backgroundColor: setting.backgroundColor }); }; if (action === 'a') { return this.each(function() { var link = $(this); link.css("color", setting.color) }); } }; }(jQuery));template.html
<!doctype html> <html> <head> <meta charset="utf-8"> <script src="js/jquery-1.12.0.min.js"></script> <script src="js/my_plugin.js"></script> <script> $(document).ready(function() { $("a").greenify("a", { color: "red" }); $("div").greenify("div", { color: "white", backgroundColor: "red" }); }); </script> <title>jQuery</title> <body> <a href="www.google.com.tw">GoogleGoog</a> <a href="www.yahoo.com.tw">YahooYahoo</a> <div> Hello </div> </body> </html>
沒有留言:
張貼留言