如何建立一個jQuery外掛
為什麼要建立jQuery外掛 ? 因為這樣程式碼可以複用。
我們有這樣一個頁面,頁面上面有如下的文字(看原始碼),我們想要的效果是,當滑鼠移到連結的時候,用一個浮動的div來顯示a標籤的title內容.
這是通過js來完成的。假設有一個方法tooltip(), 你只需要呼叫這個方法就能達成你的願望,就像這樣:
$(`a.tooltip`).tooltip({
rounded: true
});
假設我們把外掛命名為tooltip,則需要定義一個jQuery.tooltip.js檔案。這樣命名只是為了說明這是jQuery的外掛,實際上你可以隨便命名這個檔名。下面來開始寫我們的外掛:
(function($){
# …code
})(jQuery);
外掛的程式碼必須包含在這個格式裡。這裡要注意,要確保你沒有使用別的js庫,否則這個美元符$,會發生衝突,如果要避免產生這種衝突,你最好在外掛裡都使用jQuery字元來代替美元符。
我們首先來定義外掛函式:
$.fn.tooltip = function(options) {
…
}
然後設定預設的引數:
var
defaults = {
background : `#e3e3e3`,
color : `black`,
rounded: false
},
然後再用setting變數來接收使用者自定義的引數,使用extend方法來merge這些引數。
settings = $.extend({}, defaults, options);
現在要開始寫方法了,使用者如果使用這個外掛的時候,傳入的jquery dom物件可能不只是一個元素,我們需要給每個class為tooltip的a標籤都繫結好這個事件,那麼就需要迭代了,這裡jquery提供了each方法:
this.each(function() {
var $this = $(this);
var title = this.title;
… …
}
這裡為什麼要用$this呢? 這是為了提醒自己,正在和jQuery物件打交道。
然後寫滑鼠事件等等,來看最後的程式碼:
(function($){
$.fn.tooltip = function(options) {
var
defaults = {
background: `#e3e3e3`,
color: `black`,
rounded: false
},
settings = $.extend({}, defaults, options);
this.each(function() {
var $this = $(this);
var title = this.title;
if($this.is(`a`) && $this.attr(`title`) != “) {
this.title = “;
$this.hover(function(e) {
// mouse over
$(`
`)
.appendTo(`body`)
.text(title)
.hide()
.css({
backgroundColor: settings.background,
color: settings.color,
top: e.pageY + 10,
left: e.pageX + 20
})
.fadeIn(350);
if(settings.rounded) {
$(`#tooltip`).addClass(`rounded`);
}
}, function() {
// mouse out
$(`#tooltip`).remove();
});
}
$this.mousemove(function(e) {
$(`#tooltip`).css({
top: e.pageY + 10,
left: e.pageX + 20
});
});
});
// returns the jQuery object to allow for chainability.
return this;
}
})(jQuery);
總結:
1. 這裡有個小技巧,假如要定義多個變數:
var a = {};
var b = {};
var c = {};
可以這麼寫:
var
a = {},
b = {},
c = {};
2.外掛程式碼裡,迴圈內的this, 迴圈外的this,迴圈內的$(this)的關係, 實際上是jQuery物件和dom物件的關係。
頁面上呼叫外掛方法,外掛方法內部的each外的this,則是jQuery物件,這個物件是個集合物件,也就是$(`a.tooltip`)這個物件,頁面上共有2個class為tooltip的a標籤。
jquery物件的$方法,返回的是jquery集合物件,裡面的元素,如果你用get方法去呼叫得到的是dom,你用eq方法呼叫得到的是jquery物件,比如:
$(`a`).eq(0)得到的是jquery物件
$(`a`).get(0)得到的是dom物件,
直接$(`a`)[0]得到的是dom物件,
而jquery的each方法,我認為是迭代的是dom物件,而不是jquery物件,所以在each裡面this是dom物件,而需要$(this)來得到jquery物件來進行操作 。把這個關係搞清楚就行了。