jQuery擴展_動力節(jié)點Java學(xué)院整理
當(dāng)我們使用jQuery對象的方法時,由于jQuery對象可以操作一組DOM,而且支持鏈式操作,所以用起來非常方便。
但是jQuery內(nèi)置的方法永遠不可能滿足所有的需求。比如,我們想要高亮顯示某些DOM元素,用jQuery可以這么實現(xiàn):
$('span.hl').css('backgroundColor', '#fffceb').css('color', '#d85030'); $('p a.hl').css('backgroundColor', '#fffceb').css('color', '#d85030');
總是寫重復(fù)代碼可不好,萬一以后還要修改字體就更麻煩了,能不能統(tǒng)一起來,寫個highlight()方法?
$('span.hl').highlight(); $('p a.hl').highlight();
答案是肯定的。我們可以擴展jQuery來實現(xiàn)自定義方法。將來如果要修改高亮的邏輯,只需修改一處擴展代碼。這種方式也稱為編寫jQuery插件。
編寫jQuery插件
給jQuery對象綁定一個新方法是通過擴展$.fn
對象實現(xiàn)的。讓我們來編寫第一個擴展——highlight1()
:
$.fn.highlight1 = function () { // this已綁定為當(dāng)前jQuery對象: this.css('backgroundColor', '#fffceb').css('color', '#d85030'); return this; }
注意到函數(shù)內(nèi)部的this
在調(diào)用時被綁定為jQuery對象,所以函數(shù)內(nèi)部代碼可以正常調(diào)用所有jQuery對象的方法。
對于如下的HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-highlight1"> <p>什么是<span>jQuery</span></p> <p><span>jQuery</span>是目前最流行的<span>JavaScript</span>庫。</p> </div>
來測試一下highlight1()
的效果:
'use strict'; $('#test-highlight1 span').highlight1();
什么是jQuery
jQuery是目前最流行的JavaScript庫。
細心的童鞋可能發(fā)現(xiàn)了,為什么最后要return this
;?因為jQuery對象支持鏈式操作,我們自己寫的擴展方法也要能繼續(xù)鏈式下去:
$('span.hl').highlight1().slideDown();
不然,用戶調(diào)用的時候,就不得不把上面的代碼拆成兩行。
但是這個版本并不完美。有的用戶希望高亮的顏色能自己來指定,怎么辦?
我們可以給方法加個參數(shù),讓用戶自己把參數(shù)用對象傳進去。于是我們有了第二個版本的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; }
對于如下HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-highlight2"> <p>什么是<span>jQuery</span> <span>Plugin</span></p> <p>編寫<span>jQuery</span> <span>Plugin</span>可以用來擴展<span>jQuery</span>的功能。</p> </div>
來實測一下帶參數(shù)的highlight2()
:
'use strict'; $('#test-highlight2 span').highlight2({ backgroundColor: '#00a8e6', color: '#ffffff' });
什么是jQuery Plugin
編寫jQuery Plugin可以用來擴展jQuery的功能。
對于默認值的處理,我們用了一個簡單的&&
和||
短路操作符,總能得到一個有效的值。
另一種方法是使用jQuery提供的輔助方法$.extend(target, obj1, obj2, ...),
它把多個object對象的屬性合并到第一個target對象中,遇到同名屬性,總是使用靠后的對象的值,也就是越往后優(yōu)先級越高:
// 把默認值和用戶傳入的options合并到對象{}中并返回: var opts = $.extend({}, { backgroundColor: '#00a8e6', color: '#ffffff' }, options);
緊接著用戶對highlight2()
提出了意見:每次調(diào)用都需要傳入自定義的設(shè)置,能不能讓我自己設(shè)定一個缺省值,以后的調(diào)用統(tǒng)一使用無參數(shù)的highlight2()
?
也就是說,我們設(shè)定的默認值應(yīng)該能允許用戶修改。
那默認值放哪比較合適?放全局變量肯定不合適,最佳地點是$.fn.highlight2
這個函數(shù)對象本身。
于是最終版的highlight()
終于誕生了:
$.fn.highlight = function (options) { // 合并默認值和用戶設(shè)定值: var opts = $.extend({}, $.fn.highlight.defaults, options); this.css('backgroundColor', opts.backgroundColor).css('color', opts.color); return this; } // 設(shè)定默認值: $.fn.highlight.defaults = { color: '#d85030', backgroundColor: '#fff8de' }
這次用戶終于滿意了。用戶使用時,只需一次性設(shè)定默認值:
$.fn.highlight.defaults.color = '#fff'; $.fn.highlight.defaults.backgroundColor = '#000';
然后就可以非常簡單地調(diào)用highlight()
了。
對如下的HTML結(jié)構(gòu):
<!-- HTML結(jié)構(gòu) --> <div id="test-highlight"> <p>如何編寫<span>jQuery</span> <span>Plugin</span></p> <p>編寫<span>jQuery</span> <span>Plugin</span>,要設(shè)置<span>默認值</span>,并允許用戶修改<span>默認值</span>,或者運行時傳入<span>其他值</span>。</p> </div>
實測一下修改默認值的效果:
'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' });
如何編寫jQuery Plugin
編寫jQuery Plugin,要設(shè)置默認值,并允許用戶修改默認值,或者運行時傳入其他值。
最終,我們得出編寫一個jQuery插件的原則:
1.給$.fn
綁定函數(shù),實現(xiàn)插件的代碼邏輯;
2.插件函數(shù)最后要return this;
以支持鏈式調(diào)用;
3.插件函數(shù)要有默認值,綁定在$.fn.<pluginName>.defaults
上;
4.用戶在調(diào)用時可傳入設(shè)定值以便覆蓋默認值。
針對特定元素的擴展
我們知道jQuery對象的有些方法只能作用在特定DOM元素上,比如submit()方法只能針對form。如果我們編寫的擴展只能針對某些類型的DOM元素,應(yīng)該怎么寫?
還記得jQuery的選擇器支持filter()方法來過濾嗎?我們可以借助這個方法來實現(xiàn)針對特定元素的擴展。
舉個例子,現(xiàn)在我們要給所有指向外鏈的超鏈接加上跳轉(zhuǎn)提示,怎么做?
先寫出用戶調(diào)用的代碼:
$('#main a').external();
然后按照上面的方法編寫一個external擴展:
$.fn.external = function () { // return返回的each()返回結(jié)果,支持鏈式調(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); } }); } }); }
對如下的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>
實測外鏈效果:
'use strict'; $('#test-external a').external();
小結(jié)
擴展jQuery對象的功能十分簡單,但是我們要遵循jQuery的原則,編寫的擴展方法能支持鏈式調(diào)用、具備默認值和過濾特定元素,使得擴展方法看上去和jQuery本身的方法沒有什么區(qū)別。
相關(guān)文章
實例講解jQuery EasyUI tree中state屬性慎用
本文通過實例代碼給大家介紹jQuery EasyUI tree中state屬性慎用,切忌把state設(shè)置為closed,否則該節(jié)點會加載整個tree,形成死循環(huán)2016-04-04JS拖動選擇table里的單元格完整實例【基于jQuery】
這篇文章主要介紹了JS拖動選擇table里的單元格,結(jié)合完整實例形式分析了基于jQuery的table表格動態(tài)操作相關(guān)實現(xiàn)技巧,涉及事件響應(yīng)及頁面元素屬性動態(tài)操作使用方法,需要的朋友可以參考下2019-05-05jQuery實現(xiàn)分頁功能(含ajax請求、后臺數(shù)據(jù)、附完整demo)
這篇文章主要給大家介紹了關(guān)于jQuery實現(xiàn)分頁功能的相關(guān)資料,主要包含ajax請求和后臺數(shù)據(jù),文末給出了完整的demo示例,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04jQuery一步一步實現(xiàn)跨瀏覽器的可編輯表格,支持IE、Firefox、Safari、Chrome、Opera
在修改數(shù)據(jù)時,有時候為了方便,我們希望能夠直接在表格里面對數(shù)據(jù)進行直接修改。2009-08-08jQuery實現(xiàn)智能判斷固定導(dǎo)航條或側(cè)邊欄的方法
這篇文章主要介紹了jQuery實現(xiàn)智能判斷固定導(dǎo)航條或側(cè)邊欄的方法,涉及jQuery針對頁面元素屬性的判斷與動態(tài)操作相關(guān)技巧,需要的朋友可以參考下2016-09-09jQuery監(jiān)聽文件上傳實現(xiàn)進度條效果的方法
下面小編就為大家?guī)硪黄猨Query監(jiān)聽文件上傳實現(xiàn)進度條效果的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10uploadify多文件上傳參數(shù)設(shè)置技巧
uploadify插件配置實用比較簡單,很多開發(fā)者都喜歡使用。但是它有個缺點就是剛加載的時候稍微慢了一秒左右,本文通過一段代碼實例給大家介紹uploadify多文件上傳參數(shù)設(shè)置技巧,朋友們一起學(xué)習(xí)吧2015-11-11