摘要:我們也可以在設(shè)置中間允許一個(gè)回調(diào)函數(shù),來覆蓋默認(rèn)的函數(shù),這也是一個(gè)支持定制的非常棒的方法。對外暴露了一個(gè)對象。所以我們的設(shè)置應(yīng)該像這樣對于也可以使用同樣的方法來實(shí)現(xiàn)提供回調(diào)函數(shù)如果你的插件是事件驅(qū)動的話,最好為每個(gè)事件提供回調(diào)函數(shù)。
_Advanced Plugin Concepts_,翻譯自 jQuery 官方網(wǎng)站。
默認(rèn)設(shè)置的共有接口對于上一篇文章最后的代碼,我們可以改進(jìn),也應(yīng)該改進(jìn)的地方就是,為我們的插件的默認(rèn)設(shè)置提供共有接口,使得用戶可以直接更改默認(rèn)設(shè)置。
這樣做的好處就是可以讓用戶用最少的代碼量來定制我們的插件。這次的例子是:
// Plugin definition. $.fn.hilight = function( options ) { // Extend our default options with those provided. // Note that the first argument to extend is an empty // object – this is to keep from overriding our "defaults" object. var opts = $.extend( {}, $.fn.hilight.defaults, options ); // Our plugin implementation code goes here. }; // Plugin defaults – added as a property on our plugin function. $.fn.hilight.defaults = { foreground: "red", background: "yellow" };
現(xiàn)在用戶可以這樣更改默認(rèn)設(shè)定:
// This needs only be called once and does not // have to be called from within a "ready" block $.fn.hilight.defaults.foreground = "blue";
這樣使用我們的插件:
$( "#myDiv" ).hilight();
你可以看到,我們允許用戶使用僅僅一行代碼就覆蓋了某個(gè)默認(rèn)設(shè)定。除此之外,用戶仍然可以傳入?yún)?shù)來覆蓋他們設(shè)定的默認(rèn)設(shè)置。
// Override plugin default foreground color. $.fn.hilight.defaults.foreground = "blue"; // ... // Invoke plugin using new defaults. $( ".hilightDiv" ).hilight(); // ... // Override default by passing options to plugin method. $( "#green" ).hilight({ foreground: "green" });附屬函數(shù)的公共接口
為某些附屬函數(shù)提公共接口,能夠非常好的去擴(kuò)展和讓別人擴(kuò)展你的插件。
舉個(gè)例子,我們的插件可能實(shí)現(xiàn)了一個(gè)叫 format 的函數(shù), 這個(gè)函數(shù)格式化強(qiáng)調(diào)文本的形式。我們在 hilight 函數(shù)下面定義了 format 的默認(rèn)方法。
// Plugin definition. $.fn.hilight = function( options ) { // Iterate and reformat each matched element. return this.each(function() { var elem = $( this ); // ... var markup = elem.html(); // Call our format function. markup = $.fn.hilight.format( markup ); elem.html( markup ); }); }; // Define our format function. $.fn.hilight.format = function( txt ) { return "" + txt + ""; };
我們也可以在設(shè)置中間允許一個(gè)回調(diào)函數(shù),來覆蓋默認(rèn)的 format 函數(shù), 這也是一個(gè)支持定制的非常棒的方法。
使用這些技術(shù),其他人可以非常方便的定制你的插件,然后發(fā)布。換句話說,其他人可以為你的插件來寫插件。
考慮到這篇文章里這個(gè)蒼白的例子并不是非常具有說服力,一個(gè)現(xiàn)實(shí)的例子就是 Cycle Plugin。這個(gè)插件是一個(gè)幻燈片插件,內(nèi)置非常多切換特效,像滾動、滑動、淡出等。但是實(shí)際上它不可能定義每個(gè)人想要的效果,那么插件的擴(kuò)展性就非常重要了。
Cycle Plugin 對外暴露了一個(gè) transitions 對象。 在這里用戶可以自己定義他們的切換特效。
$.fn.cycle.transitions = { // ... };保持私有函數(shù)私有
對外提供一部分你的插件的公共接口確實(shí)很強(qiáng)大,但是你要想清楚哪些部分需要提供給公共接口,哪些不需要。當(dāng)函數(shù)一旦暴露在外,任何對參數(shù)和語義(函數(shù)的功能)的更改都會摧毀向后兼容性。一般來說,如果你不確定一個(gè)方法是否應(yīng)該設(shè)為公有,那么也許答案是不。
所以我們?nèi)绾卧诓桓銇y命名空間并且保持私有的情況下定義更多的函數(shù)呢?這就是閉包的事情了。
為了展示如何解決這個(gè)問題,我們在我們的插件里加了一個(gè)函數(shù) debug。這個(gè)函數(shù)在 console 中輸出選定的對象。我們將整個(gè)插件用一個(gè)函數(shù)包裹起來(上一篇文章也有提到)。
// Create closure. (function( $ ) { // Plugin definition. $.fn.hilight = function( options ) { debug( this ); // ... }; // Private function for debugging. function debug( obj ) { if ( window.console && window.console.log ) { window.console.log( "hilight selection count: " + obj.length ); } }; // ... // End of closure. })( jQuery );Bob & Sue(實(shí)例)
Bob 已經(jīng)創(chuàng)建了一個(gè)新的畫廊插件(叫 "superGallery")。這個(gè)插件使得一系列圖片變得可導(dǎo)航的。Bob 同樣還添加了一些動畫效果使得插件變得更加有趣。他想讓他的插件獲得最大程度的可定制性,所以他寫出了下面的代碼:
jQuery.fn.superGallery = function( options ) { // Bob"s default settings: var defaults = { textColor: "#000", backgroundColor: "#fff", fontSize: "1em", delay: "quite long", getTextFromTitle: true, getTextFromRel: false, getTextFromAlt: false, animateWidth: true, animateOpacity: true, animateHeight: true, animationDuration: 500, clickImgToGoToNext: true, clickImgToGoToLast: false, nextButtonText: "next", previousButtonText: "previous", nextButtonTextColor: "red", previousButtonTextColor: "red" }; var settings = $.extend( {}, defaults, options ); return this.each(function() { // Plugin code would go here... }); };
你想到的第一件事情可能就是,這個(gè)插件該有多大才能實(shí)現(xiàn)這么多可定制功能。這個(gè)插件的體積可能完全沒必要這么大。
Bob 對他的插件非常滿意。他覺得他的插件會在不同的情景之下會是一個(gè)通用的解決方案。
Sue 決定去用一用這個(gè)新插件。她設(shè)置了所有的選項(xiàng),但是她意識到,如果圖片的寬度以低速變化的話,會獲得更加好的效果。她趕緊去搜索了 Bob 的文檔,但是并沒有找到 animateWidthDuration 類似的選項(xiàng)。
你看到問題了嗎?問題的關(guān)鍵是并不是你的插件有多少個(gè)選項(xiàng),而是有什么選項(xiàng)。
Bob 做的有點(diǎn)兒過了。他提供的定制性看起來很高,其實(shí)非常低。特別是考慮到一個(gè)人可能想要在這個(gè)插件中控制的所有特性。Bob 犯了個(gè)錯(cuò)誤,它提供了非常多荒誕的選項(xiàng),殊不知讓他的插件變得更難定制了。
一個(gè)更好的模型所以現(xiàn)在非常明顯了,Bob 需要一個(gè)新的定制模型。一個(gè)并沒有放棄必須的控制和抽象細(xì)節(jié)的定制模型。
這里有一些建議,可以讓你更好的創(chuàng)建一個(gè)可定制化插件。
不要創(chuàng)建自己的語法使用你的插件的開發(fā)者不應(yīng)該要去學(xué)一門新的語言或新的技術(shù),只要搞定他們的工作。
Bob 他為 delay 這個(gè)選項(xiàng)提供了最大的定制性。他設(shè)置了4個(gè)不同的延遲:
var delayDuration = 0; switch ( settings.delay ) { case "very short": delayDuration = 100; break; case "quite short": delayDuration = 200; break; case "quite long": delayDuration = 300; break; case "very long": delayDuration = 400; break; default: delayDuration = 200; }
這導(dǎo)致不僅僅用戶所能控制的延遲水平變少了,還花費(fèi)了比較多的空間。20行代碼僅僅就為了定義一個(gè)延遲時(shí)間,有點(diǎn)兒多了。
一個(gè)更加好的方式就是讓用戶自己傳入延遲的時(shí)間。
元素的完全控制權(quán)如果你的插件在DOM中創(chuàng)建了一些元素。那么你最好讓用戶有方法去控制它。有些時(shí)候這意味著提供給用戶傳入ID或者類名的方法。但是注意你的插件不應(yīng)該全局依賴這些。
一個(gè)不好的實(shí)現(xiàn):
// Plugin code $( "" ).appendTo( "body" );
一個(gè)好一點(diǎn)兒的實(shí)現(xiàn):
// Retain an internal reference: var wrapper = $( "" ) .attr( settings.wrapperAttrs ) .appendTo( settings.container ); // Easy to reference later... wrapper.append( "..." );
注意我們使用了 .attr() 來增加特定的屬性。所以我們的設(shè)置應(yīng)該像這樣:
var defaults = { wrapperAttrs : { class: "gallery-wrapper" }, // ... rest of settings ... }; // We can use the extend method to merge options/settings as usual: // But with the added first parameter of TRUE to signify a DEEP COPY: var settings = $.extend( true, {}, defaults, options );
對于CSS 也可以使用同樣的方法來實(shí)現(xiàn):
var defaults = { wrapperCSS: {}, // ... rest of settings ... }; // Later on in the plugin where we define the wrapper: var wrapper = $( "" ) .attr( settings.wrapperAttrs ) .css( settings.wrapperCSS ) // ** Set CSS! .appendTo( settings.container );提供回調(diào)函數(shù)
如果你的插件是事件驅(qū)動的話,最好為每個(gè)事件提供回調(diào)函數(shù)。
var defaults = { // We define an empty anonymous function so that // we don"t need to check its existence before calling it. onImageShow : function() {}, // ... rest of settings ... }; // Later on in the plugin: nextButton.on( "click", showNextImage ); function showNextImage() { // Returns reference to the next image node var image = getNextImage(); // Stuff to show the image here... // Here"s the callback: settings.onImageShow.call( image ); }記住,這是一個(gè)權(quán)衡問題
你的插件不可能在所有的情況下都能工作。同樣的,當(dāng)你提供很少的控制的方法的時(shí)候,它也有可能沒啥用。所以,權(quán)衡是非常重要的事情。以下有三點(diǎn):
靈活性:你的插件要處理多少種情況?
大小:你的插件大小和它的功能相匹配嗎?
性能:你的插件無論什么情況都會處理設(shè)置選項(xiàng)嗎?影響速度嗎?值得嗎?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85935.html
摘要:,翻譯自官方網(wǎng)站。如何建立一個(gè)基礎(chǔ)的插件有時(shí),你想要在你的代碼里面實(shí)現(xiàn)一個(gè)可復(fù)用的功能。譯者注建立一個(gè)基礎(chǔ)的插件假設(shè)我們現(xiàn)在要建立一個(gè)讓元素里的文字變綠的插件。鏈?zhǔn)讲僮髯畲蟮奶攸c(diǎn)之一就是支持鏈?zhǔn)讲僮鳌@缱g者注的作用是返還的控制權(quán)。 _How to Create a Basic Plugin_, 翻譯自 jQuery 官方網(wǎng)站。 如何建立一個(gè)基礎(chǔ)的插件 有時(shí),你想要在你的代碼里面實(shí)現(xiàn)一...
摘要:并不是所有人寫的代碼或者插件都適合小白使用,比如這是一個(gè)的滾動插件,大多數(shù)人使用了之后發(fā)現(xiàn)滾動不了,去作者提,其實(shí)是他們并不懂滾動的原理。 最近在這里看了一篇關(guān)于面試的文章《回顧自己三次失敗的面試經(jīng)歷》,作者三次倒在了輪播圖上。囧,所以我也寫個(gè)輪播圖看看。這次是用jQuery寫的,因?yàn)樽罱恢痹谘芯縥Query插件的寫法,所以用jQuery寫的,而且我發(fā)現(xiàn),我vue用太多,完全不熟悉d...
摘要:在社交系統(tǒng)中有這樣一個(gè)命令主要是用作包的安裝,升級,卸載。這在開發(fā)過程中很有用。內(nèi)測申請方式提供個(gè)人企業(yè)聯(lián)系方式及認(rèn)證信息實(shí)名企業(yè)營業(yè)執(zhí)照照片或掃描件及申請說明,發(fā)送郵件至將有機(jī)會獲得首批內(nèi)測資格,名額有限,申請從速。 在前面,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個(gè),這里重點(diǎn)講以下如何實(shí)現(xiàn) plus-component 的。 plus-c...
摘要:工作這么多年,第一次想起來寫技術(shù)博客,記錄自己的學(xué)習(xí)歷程。這幾天項(xiàng)目中集成全文檢索,在此記錄自己的學(xué)習(xí)歷程與各位友人共同分享。學(xué)習(xí)是在自己的電腦安裝一環(huán)境以下文中所提及的是簡稱下載地址下載新的版本下載完成解壓到你的開發(fā)目錄即可。 工作這么多年,第一次想起來寫技術(shù)博客,記錄自己的學(xué)習(xí)歷程。這幾天項(xiàng)目中集成ES全文檢索,在此記錄自己的學(xué)習(xí)歷程與各位友人共同分享。學(xué)習(xí)是在自己的電腦安裝Ela...
以前我們敲靜態(tài)頁面都是寫好html,css, js,然后再去刷新瀏覽器,艾尼馬又不行,有重新寫過再刷新,一個(gè)頁面下來按chrl+r的次數(shù)可讓你的鍵盤多活好幾天,要不會刷新快捷按鈕那不得手殘了都。 后來,grunt,gulp等工具應(yīng)運(yùn)而生,當(dāng)然它們不止這個(gè)功能,但卻很好地減輕了我們的負(fù)擔(dān)。這篇文章介紹一些如何使用這些工具使構(gòu)建頁面變得簡單高效。這只是個(gè)人的目前在用的不成熟的方案,更專業(yè)的還請參考...
閱讀 2340·2021-09-30 09:47
閱讀 2959·2019-08-30 11:05
閱讀 2534·2019-08-29 17:20
閱讀 1921·2019-08-29 13:01
閱讀 1727·2019-08-26 13:39
閱讀 1249·2019-08-26 13:26
閱讀 3210·2019-08-23 18:40
閱讀 1828·2019-08-23 17:09