jQuery擴(kuò)展_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
當(dāng)我們使用jQuery對(duì)象的方法時(shí),由于jQuery對(duì)象可以操作一組DOM,而且支持鏈?zhǔn)讲僮鳎杂闷饋?lái)非常方便。
但是jQuery內(nèi)置的方法永遠(yuǎn)不可能滿(mǎn)足所有的需求。比如,我們想要高亮顯示某些DOM元素,用jQuery可以這么實(shí)現(xiàn):
$('span.hl').css('backgroundColor', '#fffceb').css('color', '#d85030');
$('p a.hl').css('backgroundColor', '#fffceb').css('color', '#d85030');
總是寫(xiě)重復(fù)代碼可不好,萬(wàn)一以后還要修改字體就更麻煩了,能不能統(tǒng)一起來(lái),寫(xiě)個(gè)highlight()方法?
$('span.hl').highlight();
$('p a.hl').highlight();
答案是肯定的。我們可以擴(kuò)展jQuery來(lái)實(shí)現(xiàn)自定義方法。將來(lái)如果要修改高亮的邏輯,只需修改一處擴(kuò)展代碼。這種方式也稱(chēng)為編寫(xiě)jQuery插件。
編寫(xiě)jQuery插件
給jQuery對(duì)象綁定一個(gè)新方法是通過(guò)擴(kuò)展$.fn對(duì)象實(shí)現(xiàn)的。讓我們來(lái)編寫(xiě)第一個(gè)擴(kuò)展——highlight1():
$.fn.highlight1 = function () {
// this已綁定為當(dāng)前jQuery對(duì)象:
this.css('backgroundColor', '#fffceb').css('color', '#d85030');
return this;
}
注意到函數(shù)內(nèi)部的this在調(diào)用時(shí)被綁定為jQuery對(duì)象,所以函數(shù)內(nèi)部代碼可以正常調(diào)用所有jQuery對(duì)象的方法。
對(duì)于如下的HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-highlight1"> <p>什么是<span>jQuery</span></p> <p><span>jQuery</span>是目前最流行的<span>JavaScript</span>庫(kù)。</p> </div>
來(lái)測(cè)試一下highlight1()的效果:
'use strict';
$('#test-highlight1 span').highlight1();
什么是jQuery
jQuery是目前最流行的JavaScript庫(kù)。
細(xì)心的童鞋可能發(fā)現(xiàn)了,為什么最后要return this;?因?yàn)閖Query對(duì)象支持鏈?zhǔn)讲僮鳎覀冏约簩?xiě)的擴(kuò)展方法也要能繼續(xù)鏈?zhǔn)较氯ィ?br />
$('span.hl').highlight1().slideDown();
不然,用戶(hù)調(diào)用的時(shí)候,就不得不把上面的代碼拆成兩行。
但是這個(gè)版本并不完美。有的用戶(hù)希望高亮的顏色能自己來(lái)指定,怎么辦?
我們可以給方法加個(gè)參數(shù),讓用戶(hù)自己把參數(shù)用對(duì)象傳進(jìn)去。于是我們有了第二個(gè)版本的highlight2():
$.fn.highlight2 = function (options) {
// 要考慮到各種情況:
// options為undefined
// options只有部分key
var bgcolor = options && options.backgroundColor || '#fffceb';
var color = options && options.color || '#d85030';
this.css('backgroundColor', bgcolor).css('color', color);
return this;
}
對(duì)于如下HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-highlight2"> <p>什么是<span>jQuery</span> <span>Plugin</span></p> <p>編寫(xiě)<span>jQuery</span> <span>Plugin</span>可以用來(lái)擴(kuò)展<span>jQuery</span>的功能。</p> </div>
來(lái)實(shí)測(cè)一下帶參數(shù)的highlight2():
'use strict';
$('#test-highlight2 span').highlight2({
backgroundColor: '#00a8e6',
color: '#ffffff'
});
什么是jQuery Plugin
編寫(xiě)jQuery Plugin可以用來(lái)擴(kuò)展jQuery的功能。
對(duì)于默認(rèn)值的處理,我們用了一個(gè)簡(jiǎn)單的&&和||短路操作符,總能得到一個(gè)有效的值。
另一種方法是使用jQuery提供的輔助方法$.extend(target, obj1, obj2, ...),它把多個(gè)object對(duì)象的屬性合并到第一個(gè)target對(duì)象中,遇到同名屬性,總是使用靠后的對(duì)象的值,也就是越往后優(yōu)先級(jí)越高:
// 把默認(rèn)值和用戶(hù)傳入的options合并到對(duì)象{}中并返回:
var opts = $.extend({}, {
backgroundColor: '#00a8e6',
color: '#ffffff'
}, options);
緊接著用戶(hù)對(duì)highlight2()提出了意見(jiàn):每次調(diào)用都需要傳入自定義的設(shè)置,能不能讓我自己設(shè)定一個(gè)缺省值,以后的調(diào)用統(tǒng)一使用無(wú)參數(shù)的highlight2()?
也就是說(shuō),我們?cè)O(shè)定的默認(rèn)值應(yīng)該能允許用戶(hù)修改。
那默認(rèn)值放哪比較合適?放全局變量肯定不合適,最佳地點(diǎn)是$.fn.highlight2這個(gè)函數(shù)對(duì)象本身。
于是最終版的highlight()終于誕生了:
$.fn.highlight = function (options) {
// 合并默認(rèn)值和用戶(hù)設(shè)定值:
var opts = $.extend({}, $.fn.highlight.defaults, options);
this.css('backgroundColor', opts.backgroundColor).css('color', opts.color);
return this;
}
// 設(shè)定默認(rèn)值:
$.fn.highlight.defaults = {
color: '#d85030',
backgroundColor: '#fff8de'
}
這次用戶(hù)終于滿(mǎn)意了。用戶(hù)使用時(shí),只需一次性設(shè)定默認(rèn)值:
$.fn.highlight.defaults.color = '#fff'; $.fn.highlight.defaults.backgroundColor = '#000';
然后就可以非常簡(jiǎn)單地調(diào)用highlight()了。
對(duì)如下的HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-highlight"> <p>如何編寫(xiě)<span>jQuery</span> <span>Plugin</span></p> <p>編寫(xiě)<span>jQuery</span> <span>Plugin</span>,要設(shè)置<span>默認(rèn)值</span>,并允許用戶(hù)修改<span>默認(rèn)值</span>,或者運(yùn)行時(shí)傳入<span>其他值</span>。</p> </div>
實(shí)測(cè)一下修改默認(rèn)值的效果:
'use strict';
$.fn.highlight.defaults.color = '#659f13';
$.fn.highlight.defaults.backgroundColor = '#f2fae3';
$('#test-highlight p:first-child span').highlight();
$('#test-highlight p:last-child span').highlight({
color: '#dd1144'
});
如何編寫(xiě)jQuery Plugin
編寫(xiě)jQuery Plugin,要設(shè)置默認(rèn)值,并允許用戶(hù)修改默認(rèn)值,或者運(yùn)行時(shí)傳入其他值。
最終,我們得出編寫(xiě)一個(gè)jQuery插件的原則:
1.給$.fn綁定函數(shù),實(shí)現(xiàn)插件的代碼邏輯;
2.插件函數(shù)最后要return this;以支持鏈?zhǔn)秸{(diào)用;
3.插件函數(shù)要有默認(rèn)值,綁定在$.fn.<pluginName>.defaults上;
4.用戶(hù)在調(diào)用時(shí)可傳入設(shè)定值以便覆蓋默認(rèn)值。
針對(duì)特定元素的擴(kuò)展
我們知道jQuery對(duì)象的有些方法只能作用在特定DOM元素上,比如submit()方法只能針對(duì)form。如果我們編寫(xiě)的擴(kuò)展只能針對(duì)某些類(lèi)型的DOM元素,應(yīng)該怎么寫(xiě)?
還記得jQuery的選擇器支持filter()方法來(lái)過(guò)濾嗎?我們可以借助這個(gè)方法來(lái)實(shí)現(xiàn)針對(duì)特定元素的擴(kuò)展。
舉個(gè)例子,現(xiàn)在我們要給所有指向外鏈的超鏈接加上跳轉(zhuǎn)提示,怎么做?
先寫(xiě)出用戶(hù)調(diào)用的代碼:
$('#main a').external();
然后按照上面的方法編寫(xiě)一個(gè)external擴(kuò)展:
$.fn.external = function () {
// return返回的each()返回結(jié)果,支持鏈?zhǔn)秸{(diào)用:
return this.filter('a').each(function () {
// 注意: each()內(nèi)部的回調(diào)函數(shù)的this綁定為DOM本身!
var a = $(this);
var url = a.attr('href');
if (url && (url.indexOf('http://')===0 || url.indexOf('https://')===0)) {
a.attr('href', '#0')
.removeAttr('target')
.append(' <i class="uk-icon-external-link"></i>')
.click(function () {
if(confirm('你確定要前往' + url + '?')) {
window.open(url);
}
});
}
});
}
對(duì)如下的HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-external"> <p>如何學(xué)習(xí)<a rel="external nofollow" >jQuery</a>?</p> <p>首先,你要學(xué)習(xí)<a href="/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000" rel="external nofollow" >JavaScript</a>,并了解基本的<a rel="external nofollow" >HTML</a>。</p> </div>
實(shí)測(cè)外鏈效果:
'use strict';
$('#test-external a').external();
小結(jié)
擴(kuò)展jQuery對(duì)象的功能十分簡(jiǎn)單,但是我們要遵循jQuery的原則,編寫(xiě)的擴(kuò)展方法能支持鏈?zhǔn)秸{(diào)用、具備默認(rèn)值和過(guò)濾特定元素,使得擴(kuò)展方法看上去和jQuery本身的方法沒(méi)有什么區(qū)別。
相關(guān)文章
使用jQuery實(shí)現(xiàn)動(dòng)態(tài)添加小廣告
下面小編就為大家?guī)?lái)一篇使用jQuery實(shí)現(xiàn)動(dòng)態(tài)添加小廣告。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
jquery實(shí)現(xiàn)手機(jī)發(fā)送驗(yàn)證碼的倒計(jì)時(shí)代碼
這篇文章主要介紹了jquery實(shí)現(xiàn)手機(jī)發(fā)送驗(yàn)證碼的倒計(jì)時(shí)代碼,需要的朋友可以參考下2014-02-02
iframe中使用jquery進(jìn)行查找的方法【案例分析】
這篇文章主要介紹了iframe中使用jquery進(jìn)行查找的方法,結(jié)合實(shí)際案例形式較為詳細(xì)的分析了jQuery結(jié)合iframe查找的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
使用JS或jQuery模擬鼠標(biāo)點(diǎn)擊a標(biāo)簽事件代碼
這篇文章主要介紹了使用JS或jQuery模擬鼠標(biāo)點(diǎn)擊a標(biāo)簽事件代碼,需要的朋友可以參考下2014-03-03
jQuery基于ajax實(shí)現(xiàn)星星評(píng)論代碼
這篇文章主要介紹了jQuery基于ajax實(shí)現(xiàn)星星評(píng)論代碼,可實(shí)現(xiàn)實(shí)時(shí)顯示評(píng)論效果的功能,基于Ajax實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08

