編寫外掛程式的目的是給已經有的一系列方法或函式做乙個封裝,以便在其他地方重複使用,提高開發效率和方便後期維護。本文將詳細介紹如何編寫jquery外掛程式
jquery的外掛程式主要分為3種型別
1、封裝物件方法
2、封裝全域性函式
可以將獨立的函式加到jquery命名空間下,如常用的jquery.ajax()、去首尾空格的jquery.trim()方法等,都是jquery內部作為全域性函式的外掛程式附加到核心上去的
3、選擇器外掛程式
雖然jquery的選擇器十分強大,但是在少數情況下,還是會需要用到選擇器外掛程式來擴充一些自己喜歡的選擇器
1、jquery外掛程式的檔名推薦命名為jquery.[外掛程式名].js,以免和其他js庫外掛程式混淆
2、所有的物件方法都應當附加到jquery.fn物件上,而所有的全域性函式都應當附加到jquery物件本身上
3、在外掛程式內部的this指向的是當前通過選擇器獲取的jquery物件,而不像一般方法那樣,如click,內部的this指向的是dom元素
4、可以通過this.each來遍歷所有的元素
5、所有的方法或函式外掛程式,都應當以分號結尾。否則壓縮的時候可能出現問題。為了穩妥些,甚至可以在外掛程式頭部先加上乙個分號,以免他人不規範的**影響自身的外掛程式**
6、外掛程式應該返回乙個jquery物件,以保證外掛程式的可鏈式操作
7、避免在外掛程式內部使用$作為jquery物件的別名,而應使用完整的jquery來表示,避免衝突。當然,也可以利用閉包來迴避這種問題,使外掛程式內部繼續使用$作為jquery的別名
利用閉包的特性,即可以避免內部臨時變數影響全域性空間,又可以在外掛程式內容繼續使用$作為jquery的別名。常見的jquery外掛程式都是以下這種形式的:
(function())();
首先定義乙個匿名函式function(),然後用括號括起來,變成(function())這種形式,最後通過()這個運算子來執行。可以傳遞引數進行,以供內部函式使用
//為了更好的相容性,開始前有個分號
;(function($))(jquery);
//這裡就將jquery作為實參傳遞給匿名函式了
上面的**是一種常見的jquery外掛程式的結構
jquery提供了兩個用於拓展jquery功能的方法,即jquery.fn.extend()方法和jquery.extend()方法。jquery.fn.extend()方法用於拓展封裝物件方法的外掛程式,jquery.extend()方法用於拓展封裝全域性函式的外掛程式和選擇器外掛程式。這兩個方法都接受乙個引數,型別為object。object物件的"名/值對"分別代表"函式或方法名/函式主體"
【jquery.fn.extend()】
jquery.fn.extend()方法用於將乙個物件的內容合併到jquery的原型,以提供新的jquery例項方法
foobar全選
全不選
【jquery.extend()】
jquery.extend()方法用乙個或多個其他物件來擴充套件乙個物件,然後返回被擴充套件的物件
jquery.extend( target [, object1 ] [, objectn ] )
例如,合併settings物件和options物件,修改並返回settings物件
var settings = ;var options = ;
var newoptions =jquery.extend(settings,options);
console.log(newoptions);
//object
jquery.extend()方法經常被用於設定外掛程式方法的一系列預設引數
functionfoo(options),options);
}
如果使用者呼叫foo()方法的時候,在傳遞的引數options物件設定了相應的值,那麼就使用設定的值,否則使用預設值
通過使用jquery.extend()方法,可以很方便地用傳入的引數來覆蓋預設值。此時,對方法的呼叫依舊保持一致,只不過要傳入的是乙個對映而不是乙個引數列表。這種機制比傳統的每個引數都去檢測的方式不僅靈活而且更加簡潔。此外使用命名引數意味著再新增新選項也不會影響過去編寫的**,從而使開發者使用起來更加直觀明了
1、封裝jquery物件方法的外掛程式
編寫設定和獲取顏色的外掛程式color(),該外掛程式用於實現以下兩個功能:
(1)設定匹配元素的顏色
(2)獲取匹配的元素(元素集合中的第乙個)的顏色
由於是對jquery物件的方法拓展,因此採用拓展第一類外掛程式的方法jquery.fn.extend()來編寫,這裡給這個方法提供了乙個引數value,如果呼叫方法的時候傳遞了value這個引數,那麼就是用這個值來設定字型顏色,否則就是獲取匹配元素的字型顏色的值
;(function()else
}
});
})(jquery);
實際上,css()方法內容已經有判斷value是否為undefined的機制,所以才可以根據傳遞引數的不同而返回不同的值。因此,**可以刪減如下
;(function()
});
})(jquery);
測試文字
另外,如果要定義一組外掛程式,可以使用如下所示寫法:
;(function(), "border":function
(value),
"background":function
(value)
});
})(jquery);
2、封裝全域性函式的外掛程式
這類外掛程式是在jquery命名空間內部新增乙個函式
例如新增兩個函式,用於去除左側和右側空格。雖然jquery已經提供了jquery.trim()方法來去除兩端空格,但在某些情況下,會只希望去除某一側的空格
去除左側、右側的空格的函式分別寫成如下jquery**。(text||"")部分是用於防止傳遞進來的text這個字串變數處於未定義的特殊狀態,如果text是undeined,則返回字串"",否則返回字串text。這個處理是為了保證接下來的字串替換方法replace()方法不會出錯
;(function($),
rtrim:
function
( text )
});
})(jquery);
var $str = " test ";
console.log($.trim($str));
//'test'
console.log($.ltrim($str));//
'test '
console.log($.rtrim($str));//
' test'
3、自定義選擇器
jquery以其強大的選擇器著稱,那麼jquery的選擇器的工作原理是什麼呢?
jquery的選擇解析器首先會使用一組正規表示式來解析選擇器,然後針對解析出的每乙個選擇符執行乙個函式,稱為選擇函式。最後根據這個選擇函式的返回值為true還是false來決定是否保留這個元素,這樣就可以找到匹配的元素節點
如$("div:gl(1)"),該選擇器首先會獲取所有的元素,然後隱式地遍歷這些元素,並逐個將這些元素作為引數,連同括號裡的「1」等一些引數一起傳遞給gt對應的選擇器函式進行判斷。如果返回true則保留,否則不保留,這樣得到的結果就是乙個符合要求的元素的集合
選擇器的函式一共接受3個引數,形式如下:
function(a,i,m)
第乙個引數為a,指的是當前遍歷到的dom元素
第二個引數為i,指的是當前遍歷到的dom元素的索引值,從0開始
第三個引數是m,它是由jquery正則解析引擎進一步解析後的產物,是乙個陣列:其中最重要的乙個是m[3],在$("div:gl(1)")中即為括號裡的數字「1」。
在jquery中已經有lt、gt和eq選擇器,因此這裡寫乙個介於兩者之間(between)的選擇器
思路:在上面的三個引數中,m[3]為"a,b"的形式,因此把m[3]用","分隔,然後跟索引值i進行對比,如果i在m[3]表示的範圍之間就返回true,否則為false
;(function($) });
})(jquery);
[注意]經測試,函式中第二個引數i的值始終為0,無法獲取索引值,這時就需要自造索引,**如下
;(function($) });
})(jquery);
<div>
<
i>0
i>
<
i>1
i>
<
i>2
i>
<
i>3
i>
<
i>4
i>
<
i>5
i>
div>
<
button
id="btn"
>測試
button
>
<
script
>
;(function
($) });
})(jquery);$('
#btn
').click(
function
());
script
>
jquery外掛程式編寫
最近大家都玩什麼react node angular這些玩意去了 隨著瀏覽器的相容性 以及前端開發思想的進化 jquery逐漸被拋棄 現在自己也很少用了 純粹為了懷戀曾經的jquery.現在寫寫jquery外掛程式的寫法。沒事的時候避免老年痴呆,可以用來玩玩。寫法一 function window ...
jQuery 編寫外掛程式
jquery為開發外掛程式提供了兩個方法,分別是 1 類級別的外掛程式開發,即給jquery新增新的全域性函式,相當於給jquery類本身新增方法。2 物件級別的外掛程式開發,即給jquery物件新增方法。1 類級別的外掛程式開發 用的比較少 a.新增全域性函式 jquery.foo functio...
jQuery 編寫外掛程式
編寫乙個jquery外掛程式的原則 給 fn繫結函式,實現外掛程式的 邏輯 外掛程式函式最後要return this 以支援鏈式呼叫 外掛程式函式要有預設值,繫結在 fn.defaults上 使用者在呼叫時可傳入設定值以便覆蓋預設值。一 fn 給jquery物件繫結乙個新方法是通過擴充套件 fn物件...