jQuery 學(xué)習(xí)第七課 擴(kuò)展jQuery的功能 插件開發(fā)
更新時間:2010年05月17日 22:55:29 作者:
在介紹如何擴(kuò)展jQuery之前,先大致看下jQuery源碼(以1.3.2版本為例)。
jQuery的主體如下:
(function(){ ……})();
對于Javascript基礎(chǔ)不太好好的人來說比較奇怪。實際上,這個表達(dá)式聲明了一個匿名函數(shù)(第一個括號),然后再執(zhí)行它(第二個括號)。在這個函數(shù)中,完成了jQuery一系列方法和對象的定義。第24行很關(guān)鍵,
jQuery = window.jQuery = window.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
}
在這里,定義了十分強(qiáng)大的$函數(shù)。$其實是jQuery的一個別名。jQuery才是“正宗”的jQuery函數(shù),$的定義只是為了減少程序員的打字量。$很容易和其他庫沖突,例如著名的prototype庫也使用了這個名字。不過jQuery和其他庫沖突的機(jī)會就少多了,因此使用jQuery 要比$安全的多。下面再說沖突的問題。再看return的對象fn的定義,第35行
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) { …… }, ……
};
很顯然fn只是一個jQuery的原型的簡寫而已。其中定義了一個init函數(shù)。實際上,init充當(dāng)?shù)氖莏Query的構(gòu)造函數(shù)的角色。當(dāng)我們使用var i=$(‘selector')這樣的代碼的時候,可以發(fā)現(xiàn)變量i被jQuery包裹起來了,也就是i帶上了jQuery.fn的方法。很明顯,i的prototype被指向了jQuery.fn。再Javascript的世界里,可以說,i是jQuery的一個實例,你嘗試下 i instanceof jQuery,返回的是true。然而,這里并沒有用 i=new $(selector); 我估計,$是如此常用的一個函數(shù),如果每次都要使用new來構(gòu)造一個對象的話,那也太麻煩了,這就是init存在的理由,$本身被定義為一個很簡單的函數(shù),它內(nèi)部僅有一行代碼,返回一個init對象。我們每調(diào)用一次$(selector)方法,都返回一個jQuery對象。有點工廠模式的味道。當(dāng)然,如果你對Javascript比較熟悉,就會知道這樣是不夠的,我們需要把init的prototype設(shè)為jQuery.fn,代碼541行:
jQuery.fn.init.prototype = jQuery.fn;
到540行為止,都是定義的jQuery的原型對象,用OO語言的話說,相當(dāng)于實例方法,從540行開始,定義了一系列jQuery的方法,相當(dāng)于靜態(tài)方法。至此,拋開方法的具體實現(xiàn)不談(有些實在是太困難了),jQuery的結(jié)構(gòu)基本上是明了的了。下面開始介紹擴(kuò)展。
擴(kuò)展jQuery首先要注意的就是避免命名沖突,尤其是搶手的$??紤]周到的jQuery設(shè)計了一個jQuery.noConflict()方法,使得jQuery可以拱手讓出$符號,避免和其他庫沖突,而程序員可以使用完整的符號jQuery來調(diào)用jQuery提供的方法。noConflict()的實現(xiàn)簡單而巧妙,順便看一下,首先在第21行,
// Map over the $ in case of overwrite
_$ = window.$,jQuery首先記錄下windows.$,注意這行代碼的運行時間非常早,在jQuery任何函數(shù)執(zhí)行之前就會被執(zhí)行。當(dāng)然,這里的_$也有沖突的可能,不過概率是在是太小了,誰會用這么詭異的名字作為關(guān)鍵的變量呢。此時如果$已經(jīng)被其他庫占用,它的值會保留在_$中,在任何時候,只要調(diào)用jQuery.noConflict方法,619行,其代碼如下:
noConflict: function( deep ) {
window.$ = _$;
if ( deep )
window.jQuery = _jQuery;
return jQuery;
},
這樣,$就又還回去了。
作為插件開發(fā)者,我們無法保證$是否被拱手相讓,最保險的是調(diào)用jQuery方法,然而有一個技巧可以保留簡單的$而不影響其他部分,那就是:
(function($){
// plugin code goes here, you can use $ safely.
})(jQuery);
關(guān)于插件的js文件的命名,一般是jquery.pluginname.js。
要擴(kuò)展jQuery工具函數(shù)(靜態(tài)函數(shù))是很容易的,下面一個例子實現(xiàn)一個將數(shù)字?jǐn)U展成固定位數(shù)的字符串的函數(shù)。
(function($) {
$.toFixedWidth = function(value, length, fill) {
var res = value.toString();
if (!fill) fill = 0;
var padding = length - res.length;
if (padding < 0) {
res = res.substr(-padding);
} else {
for (var n = 0; n < padding; n++)
res = fill + res;
}
return res;
}
})(jQuery);
要編寫包裝集的方法也同樣容易,下面實現(xiàn)一個使表單元素只讀的方法:
$.fn.setReadOnly = function(readonly) {
return this.find('input:text').attr('readonly', readonly).css('opacity', readonly ? 0.5 : 1.0);
}
下面編寫一個小頁面測試下,這個頁面模擬的是訂單提交頁面,如果用戶需要發(fā)票,需要填寫發(fā)票信息,否則不能填寫發(fā)票信息。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery Extension</title>
<script src="jquery-1.3.2.js" type="text/javascript"></script>
<script src="jquery.yinzixin.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
$('#OrderID').val($.toFixedWidth('123', 8));
$('#InvoiceRequired').click(function() {
$('.InvoiceInfo').setReadOnly(!this.checked);
});
$('.InvoiceInfo').setReadOnly(false);
}
);
</script>
</head>
<body>
<form>
Order ID:<input type="text" id="OrderID" /> <br />
<input type="checkbox" id="InvoiceRequired" />Invoice Required<br />
<div class="InvoiceInfo">
Inovice Tilte:<input type="text" id="Text1" />
Invoice Content:<input type="text" id="Text2" />
</div>
<input type="button" value="Submit" />
</form>
</body>
</html>
(function(){ ……})();
對于Javascript基礎(chǔ)不太好好的人來說比較奇怪。實際上,這個表達(dá)式聲明了一個匿名函數(shù)(第一個括號),然后再執(zhí)行它(第二個括號)。在這個函數(shù)中,完成了jQuery一系列方法和對象的定義。第24行很關(guān)鍵,
復(fù)制代碼 代碼如下:
jQuery = window.jQuery = window.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
}
在這里,定義了十分強(qiáng)大的$函數(shù)。$其實是jQuery的一個別名。jQuery才是“正宗”的jQuery函數(shù),$的定義只是為了減少程序員的打字量。$很容易和其他庫沖突,例如著名的prototype庫也使用了這個名字。不過jQuery和其他庫沖突的機(jī)會就少多了,因此使用jQuery 要比$安全的多。下面再說沖突的問題。再看return的對象fn的定義,第35行
復(fù)制代碼 代碼如下:
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) { …… }, ……
};
很顯然fn只是一個jQuery的原型的簡寫而已。其中定義了一個init函數(shù)。實際上,init充當(dāng)?shù)氖莏Query的構(gòu)造函數(shù)的角色。當(dāng)我們使用var i=$(‘selector')這樣的代碼的時候,可以發(fā)現(xiàn)變量i被jQuery包裹起來了,也就是i帶上了jQuery.fn的方法。很明顯,i的prototype被指向了jQuery.fn。再Javascript的世界里,可以說,i是jQuery的一個實例,你嘗試下 i instanceof jQuery,返回的是true。然而,這里并沒有用 i=new $(selector); 我估計,$是如此常用的一個函數(shù),如果每次都要使用new來構(gòu)造一個對象的話,那也太麻煩了,這就是init存在的理由,$本身被定義為一個很簡單的函數(shù),它內(nèi)部僅有一行代碼,返回一個init對象。我們每調(diào)用一次$(selector)方法,都返回一個jQuery對象。有點工廠模式的味道。當(dāng)然,如果你對Javascript比較熟悉,就會知道這樣是不夠的,我們需要把init的prototype設(shè)為jQuery.fn,代碼541行:
jQuery.fn.init.prototype = jQuery.fn;
到540行為止,都是定義的jQuery的原型對象,用OO語言的話說,相當(dāng)于實例方法,從540行開始,定義了一系列jQuery的方法,相當(dāng)于靜態(tài)方法。至此,拋開方法的具體實現(xiàn)不談(有些實在是太困難了),jQuery的結(jié)構(gòu)基本上是明了的了。下面開始介紹擴(kuò)展。
擴(kuò)展jQuery首先要注意的就是避免命名沖突,尤其是搶手的$??紤]周到的jQuery設(shè)計了一個jQuery.noConflict()方法,使得jQuery可以拱手讓出$符號,避免和其他庫沖突,而程序員可以使用完整的符號jQuery來調(diào)用jQuery提供的方法。noConflict()的實現(xiàn)簡單而巧妙,順便看一下,首先在第21行,
// Map over the $ in case of overwrite
_$ = window.$,jQuery首先記錄下windows.$,注意這行代碼的運行時間非常早,在jQuery任何函數(shù)執(zhí)行之前就會被執(zhí)行。當(dāng)然,這里的_$也有沖突的可能,不過概率是在是太小了,誰會用這么詭異的名字作為關(guān)鍵的變量呢。此時如果$已經(jīng)被其他庫占用,它的值會保留在_$中,在任何時候,只要調(diào)用jQuery.noConflict方法,619行,其代碼如下:
復(fù)制代碼 代碼如下:
noConflict: function( deep ) {
window.$ = _$;
if ( deep )
window.jQuery = _jQuery;
return jQuery;
},
這樣,$就又還回去了。
作為插件開發(fā)者,我們無法保證$是否被拱手相讓,最保險的是調(diào)用jQuery方法,然而有一個技巧可以保留簡單的$而不影響其他部分,那就是:
復(fù)制代碼 代碼如下:
(function($){
// plugin code goes here, you can use $ safely.
})(jQuery);
關(guān)于插件的js文件的命名,一般是jquery.pluginname.js。
要擴(kuò)展jQuery工具函數(shù)(靜態(tài)函數(shù))是很容易的,下面一個例子實現(xiàn)一個將數(shù)字?jǐn)U展成固定位數(shù)的字符串的函數(shù)。
復(fù)制代碼 代碼如下:
(function($) {
$.toFixedWidth = function(value, length, fill) {
var res = value.toString();
if (!fill) fill = 0;
var padding = length - res.length;
if (padding < 0) {
res = res.substr(-padding);
} else {
for (var n = 0; n < padding; n++)
res = fill + res;
}
return res;
}
})(jQuery);
要編寫包裝集的方法也同樣容易,下面實現(xiàn)一個使表單元素只讀的方法:
復(fù)制代碼 代碼如下:
$.fn.setReadOnly = function(readonly) {
return this.find('input:text').attr('readonly', readonly).css('opacity', readonly ? 0.5 : 1.0);
}
下面編寫一個小頁面測試下,這個頁面模擬的是訂單提交頁面,如果用戶需要發(fā)票,需要填寫發(fā)票信息,否則不能填寫發(fā)票信息。
復(fù)制代碼 代碼如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery Extension</title>
<script src="jquery-1.3.2.js" type="text/javascript"></script>
<script src="jquery.yinzixin.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
$('#OrderID').val($.toFixedWidth('123', 8));
$('#InvoiceRequired').click(function() {
$('.InvoiceInfo').setReadOnly(!this.checked);
});
$('.InvoiceInfo').setReadOnly(false);
}
);
</script>
</head>
<body>
<form>
Order ID:<input type="text" id="OrderID" /> <br />
<input type="checkbox" id="InvoiceRequired" />Invoice Required<br />
<div class="InvoiceInfo">
Inovice Tilte:<input type="text" id="Text1" />
Invoice Content:<input type="text" id="Text2" />
</div>
<input type="button" value="Submit" />
</form>
</body>
</html>

相關(guān)文章
jQuery :nth-child前有無空格的區(qū)別分析
:nth-child(index)子元素過濾選擇器的描述是:選取每個父元素下的弟index個子元素,index從1開始。2011-07-07利用JQuery直接調(diào)用asp.net后臺的簡單方法
下面小編就為大家?guī)硪黄肑Query直接調(diào)用asp.net后臺的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10jquery 自定義容器下雨效果可將下雨圖標(biāo)改為其他
這篇文章主要介紹了jquery 自定義容器下雨效果可將下雨圖標(biāo)改為其他,需要的朋友可以參考下2014-04-04DIV+CSS+jQ實現(xiàn)省市聯(lián)動可擴(kuò)展
這篇文章主要介紹了DIV+CSS+jQ實現(xiàn)省市聯(lián)動可擴(kuò)展方法的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06淺談jQuery hover(over, out)事件函數(shù)
下面小編就為大家?guī)硪黄獪\談jQuery hover(over, out)事件函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-12-12