成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

「jQuery插件開發(fā)日記」(二)高級(jí)插件理念 - [翻譯]

paulquei / 1773人閱讀

摘要:我們也可以在設(shè)置中間允許一個(gè)回調(diào)函數(shù),來(lái)覆蓋默認(rèn)的函數(shù),這也是一個(gè)支持定制的非常棒的方法。對(duì)外暴露了一個(gè)對(duì)象。所以我們的設(shè)置應(yīng)該像這樣對(duì)于也可以使用同樣的方法來(lái)實(shí)現(xiàn)提供回調(diào)函數(shù)如果你的插件是事件驅(qū)動(dòng)的話,最好為每個(gè)事件提供回調(diào)函數(shù)。

_Advanced Plugin Concepts_,翻譯自 jQuery 官方網(wǎng)站。

默認(rèn)設(shè)置的共有接口

對(duì)于上一篇文章最后的代碼,我們可以改進(jìn),也應(yīng)該改進(jìn)的地方就是,為我們的插件的默認(rèn)設(shè)置提供共有接口,使得用戶可以直接更改默認(rèn)設(shè)置。

這樣做的好處就是可以讓用戶用最少的代碼量來(lái)定制我們的插件。這次的例子是:

// 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();

你可以看到,我們?cè)试S用戶使用僅僅一行代碼就覆蓋了某個(gè)默認(rèn)設(shè)定。除此之外,用戶仍然可以傳入?yún)?shù)來(lái)覆蓋他們?cè)O(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)文本的形式。我們?cè)?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ù),來(lái)覆蓋默認(rèn)的 format 函數(shù), 這也是一個(gè)支持定制的非常棒的方法。
使用這些技術(shù),其他人可以非常方便的定制你的插件,然后發(fā)布。換句話說(shuō),其他人可以為你的插件來(lái)寫插件。

考慮到這篇文章里這個(gè)蒼白的例子并不是非常具有說(shuō)服力,一個(gè)現(xiàn)實(shí)的例子就是 Cycle Plugin。這個(gè)插件是一個(gè)幻燈片插件,內(nèi)置非常多切換特效,像滾動(dòng)、滑動(dòng)、淡出等。但是實(shí)際上它不可能定義每個(gè)人想要的效果,那么插件的擴(kuò)展性就非常重要了。

Cycle Plugin 對(duì)外暴露了一個(gè) transitions 對(duì)象。 在這里用戶可以自己定義他們的切換特效。

$.fn.cycle.transitions = {
 
    // ...
 
};
保持私有函數(shù)私有

對(duì)外提供一部分你的插件的公共接口確實(shí)很強(qiáng)大,但是你要想清楚哪些部分需要提供給公共接口,哪些不需要。當(dāng)函數(shù)一旦暴露在外,任何對(duì)參數(shù)和語(yǔ)義(函數(shù)的功能)的更改都會(huì)摧毀向后兼容性。一般來(lái)說(shuō),如果你不確定一個(gè)方法是否應(yīng)該設(shè)為公有,那么也許答案是不。

所以我們?nèi)绾卧诓桓銇y命名空間并且保持私有的情況下定義更多的函數(shù)呢?這就是閉包的事情了。

為了展示如何解決這個(gè)問(wèn)題,我們?cè)谖覀兊牟寮锛恿艘粋€(gè)函數(shù) debug。這個(gè)函數(shù)在 console 中輸出選定的對(duì)象。我們將整個(gè)插件用一個(gè)函數(shù)包裹起來(lái)(上一篇文章也有提到)。

// 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 同樣還添加了一些動(dòng)畫效果使得插件變得更加有趣。他想讓他的插件獲得最大程度的可定制性,所以他寫出了下面的代碼:

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è)插件的體積可能完全沒(méi)必要這么大。

Bob 對(duì)他的插件非常滿意。他覺(jué)得他的插件會(huì)在不同的情景之下會(huì)是一個(gè)通用的解決方案。

Sue 決定去用一用這個(gè)新插件。她設(shè)置了所有的選項(xiàng),但是她意識(shí)到,如果圖片的寬度以低速變化的話,會(huì)獲得更加好的效果。她趕緊去搜索了 Bob 的文檔,但是并沒(méi)有找到 animateWidthDuration 類似的選項(xiàng)。

你看到問(wèn)題了嗎?

問(wèn)題的關(guān)鍵是并不是你的插件有多少個(gè)選項(xiàng),而是有什么選項(xiàng)。

Bob 做的有點(diǎn)兒過(guò)了。他提供的定制性看起來(lái)很高,其實(shí)非常低。特別是考慮到一個(gè)人可能想要在這個(gè)插件中控制的所有特性。Bob 犯了個(gè)錯(cuò)誤,它提供了非常多荒誕的選項(xiàng),殊不知讓他的插件變得更難定制了。

一個(gè)更好的模型

所以現(xiàn)在非常明顯了,Bob 需要一個(gè)新的定制模型。一個(gè)并沒(méi)有放棄必須的控制和抽象細(xì)節(jié)的定制模型。

這里有一些建議,可以讓你更好的創(chuàng)建一個(gè)可定制化插件。

不要?jiǎng)?chuàng)建自己的語(yǔ)法

使用你的插件的開發(fā)者不應(yīng)該要去學(xué)一門新的語(yǔ)言或新的技術(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
$( "

一個(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() 來(lái)增加特定的屬性。所以我們的設(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 );

對(duì)于CSS 也可以使用同樣的方法來(lái)實(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ū)動(dòng)的話,最好為每個(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)衡問(wèn)題

你的插件不可能在所有的情況下都能工作。同樣的,當(dāng)你提供很少的控制的方法的時(shí)候,它也有可能沒(méi)啥用。所以,權(quán)衡是非常重要的事情。以下有三點(diǎn):

靈活性:你的插件要處理多少種情況?

大?。耗愕牟寮笮『退墓δ芟嗥ヅ鋯幔?/p>

性能:你的插件無(wú)論什么情況都會(huì)處理設(shè)置選項(xiàng)嗎?影響速度嗎?值得嗎?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85935.html

相關(guān)文章

  • jQuery插件開發(fā)日記」(一)如何建立一個(gè)基礎(chǔ)的插件 - [翻譯]

    摘要:,翻譯自官方網(wǎng)站。如何建立一個(gè)基礎(chǔ)的插件有時(shí),你想要在你的代碼里面實(shí)現(xiàn)一個(gè)可復(fù)用的功能。譯者注建立一個(gè)基礎(chǔ)的插件假設(shè)我們現(xiàn)在要建立一個(gè)讓元素里的文字變綠的插件。鏈?zhǔn)讲僮髯畲蟮奶攸c(diǎn)之一就是支持鏈?zhǔn)讲僮?。例如譯者注的作用是返還的控制權(quán)。 _How to Create a Basic Plugin_, 翻譯自 jQuery 官方網(wǎng)站。 如何建立一個(gè)基礎(chǔ)的插件 有時(shí),你想要在你的代碼里面實(shí)現(xiàn)一...

    Sunxb 評(píng)論0 收藏0
  • 小白成長(zhǎng)日記:一步一步寫個(gè)輪播圖插件

    摘要:并不是所有人寫的代碼或者插件都適合小白使用,比如這是一個(gè)的滾動(dòng)插件,大多數(shù)人使用了之后發(fā)現(xiàn)滾動(dòng)不了,去作者提,其實(shí)是他們并不懂滾動(dòng)的原理。 最近在這里看了一篇關(guān)于面試的文章《回顧自己三次失敗的面試經(jīng)歷》,作者三次倒在了輪播圖上。囧,所以我也寫個(gè)輪播圖看看。這次是用jQuery寫的,因?yàn)樽罱恢痹谘芯縥Query插件的寫法,所以用jQuery寫的,而且我發(fā)現(xiàn),我vue用太多,完全不熟悉d...

    notebin 評(píng)論0 收藏0
  • 基于 Laravel Route 的 社交系統(tǒng)ThinkSNS+ Component【研發(fā)日記系列三

    摘要:在社交系統(tǒng)中有這樣一個(gè)命令主要是用作包的安裝,升級(jí),卸載。這在開發(fā)過(guò)程中很有用。內(nèi)測(cè)申請(qǐng)方式提供個(gè)人企業(yè)聯(lián)系方式及認(rèn)證信息實(shí)名企業(yè)營(yíng)業(yè)執(zhí)照照片或掃描件及申請(qǐng)說(shuō)明,發(fā)送郵件至將有機(jī)會(huì)獲得首批內(nèi)測(cè)資格,名額有限,申請(qǐng)從速。 在前面,我介紹了拓展類型,分別有 plus-compnent 和 plus-plugin 兩個(gè),這里重點(diǎn)講以下如何實(shí)現(xiàn) plus-component 的。 plus-c...

    pf_miles 評(píng)論0 收藏0
  • ElasticSearch學(xué)習(xí)日記(一)

    摘要:工作這么多年,第一次想起來(lái)寫技術(shù)博客,記錄自己的學(xué)習(xí)歷程。這幾天項(xiàng)目中集成全文檢索,在此記錄自己的學(xué)習(xí)歷程與各位友人共同分享。學(xué)習(xí)是在自己的電腦安裝一環(huán)境以下文中所提及的是簡(jiǎn)稱下載地址下載新的版本下載完成解壓到你的開發(fā)目錄即可。 工作這么多年,第一次想起來(lái)寫技術(shù)博客,記錄自己的學(xué)習(xí)歷程。這幾天項(xiàng)目中集成ES全文檢索,在此記錄自己的學(xué)習(xí)歷程與各位友人共同分享。學(xué)習(xí)是在自己的電腦安裝Ela...

    codecraft 評(píng)論0 收藏0
  • [ 前端實(shí)習(xí)日記 ] 構(gòu)建靜態(tài)頁(yè)面基礎(chǔ)架構(gòu)

    以前我們敲靜態(tài)頁(yè)面都是寫好html,css, js,然后再去刷新瀏覽器,艾尼馬又不行,有重新寫過(guò)再刷新,一個(gè)頁(yè)面下來(lái)按chrl+r的次數(shù)可讓你的鍵盤多活好幾天,要不會(huì)刷新快捷按鈕那不得手殘了都。 后來(lái),grunt,gulp等工具應(yīng)運(yùn)而生,當(dāng)然它們不止這個(gè)功能,但卻很好地減輕了我們的負(fù)擔(dān)。這篇文章介紹一些如何使用這些工具使構(gòu)建頁(yè)面變得簡(jiǎn)單高效。這只是個(gè)人的目前在用的不成熟的方案,更專業(yè)的還請(qǐng)參考...

    lidashuang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<