亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

分享14個jQuery插件開發(fā)人員易犯的錯誤

系統(tǒng) 2126 0

分享14個jQuery插件開發(fā)人員易犯的錯誤

隨著越來越多的開發(fā)人員開始開發(fā)jQuery插件,所以我們隨時都有可能遇到很爛的插件開發(fā)“成果”。沒有在線演示,沒有文檔,或者插件沒有遵循最佳編碼實 踐。但是對于閱讀這篇文章的朋友來說,你很幸運,因為這里我們將介紹14個jQuery插件開發(fā)中最容易犯的錯誤。希望大家會覺得有幫助!

隨著jQuery的廣泛使用,每天都出現(xiàn)很多新的插件 ,但是問題在于很多插件真不怎么樣。

以前我們介紹過 10個幫助你創(chuàng)建超棒jQuery插件的小技巧 ,在今天這篇文章中,我們將專注于jQuery插件的最佳開發(fā)實踐,希望對于大家有幫助,如果你喜歡我們的文章,請給我們留言,謝謝!

錯誤一:不是在開發(fā)一個jQuery插件

總的來說,這里有很多大家接受的jQuery開發(fā)的模式。 如果你沒有遵從這些設計模式,你開發(fā)的插件有可能很“垃圾“??纯慈缦伦畛S玫哪J剑?

      (
      
        function
      
      
        ($, window, undefined){
$.fn.myPlugin 
      
      = 
      
        function
      
      
        (opts) {
   
      
      
        var
      
       defaults =
      
         {
      
      
      
        //
      
      
         設置你的選項缺省值
      
      
           }
 
  
      
      
        //
      
      
         使用用戶的選項缺省值來擴展缺省選項
      
      
        var
      
       options = $.extend(defaults, opts ||
      
         {});
 
   
      
      
        return
      
      
        this
      
      .each(
      
        function
      
      (){ 
      
        //
      
      
         jQuery鏈式操作
      
      
        //
      
      
         插件的相關內(nèi)容
      
      
           });
})(jQuery, window);
      
    

首先呢,我們創(chuàng)建了一個自調(diào)用的匿名方法來將我們插件中的參數(shù)和外部全局參數(shù)隔離開。我們傳遞$,window,和undefined三個變量參數(shù)。這些變 量和自調(diào)用的方法將和jQuery和window一起調(diào)用。對于undefined來說沒有傳遞任何值,因此如果我們決定在插件中使用undefined 關鍵字的話,其實”undefined“并沒有被定義。

使用這種方法可以有效的保證外部腳本被隔離而無法給undefined變量賦值,例如,將無法賦值undefined為true。

$被作為jQuery來傳遞;我們使用這種方法來保證在匿名方法的外部,$仍舊可以參考為其它內(nèi)容,例如,prototype。

傳遞變量給全局性訪問的window對象能允許更多經(jīng)過壓縮最小化(minification)處理的代碼(當然,壓縮是應該做的)

下 一步,我們將使用jQuery插件的模式, $.fn.PluginName。這用來登記你的插件使得其能被應用到 $(selector).method()格式中。簡單使用new來擴展jQuery的prototype。如果你想創(chuàng)建一個jQuery的方法的話,只 需要直接添加如下代碼:

      $.PluginName = 
      
        function
      
      
        (options){
   
      
      
        //
      
      
         擴展選項,執(zhí)行插件功能
      
      
}
    

這種類型的插件不可以執(zhí)行鏈式操作,因為方法在jQuery對象中定義為屬性,不能返回jQuery對象,例如如下代碼:

      $.splitInHalf = 
      
        function
      
      
        (stringToSplit){
   
      
      
        var
      
       length =
      
         stringToSplit.length;
   
      
      
        var
      
       stringArray = stringToSplit.split(stringToSplit[Math.floor(length/2)]);
   
      
        return
      
      
         stringArray;
}
      
    

這個我們返回了一個字符串數(shù)組。直接返回array比較合理,因為這有可能是用戶需要的返回類型(當然如果需要的話,直接使用jQuery對象來封裝也很容易)。對比以上代碼,我們看看如下代碼:

      $.getOddEls = 
      
        function
      
      (jQcollection){ 
      
        //

      
      
        return
      
       jQcollection.filter(
      
        function
      
      
        (index){
      
      
      
        var
      
       i = index+1
      
        ;
      
      
      
        return
      
       (index % 2 != 0
      
        );
   });
}
      
    

在這個例子中,我們得到奇數(shù)數(shù)值,用戶可能需要jQuery對象返回$.getOddEls;因此我們返回了 filter 方法,這個方法通過傳遞的方法返回了jQuery的collection定義。一個比較好的原則是封轉(zhuǎn)返回的元素到一個jQuery方法中,特別是如果用戶希望它可以進行鏈式操作;如果你返回數(shù)組,字符串,數(shù)據(jù),方法或者其它類型,則不需要封裝。

錯誤二:不書寫文檔或者不正確的書寫文檔來注釋你的代碼

無可厚非,對于發(fā)布代碼來說最重要的是書寫很好的文檔。這是幫助你的使用者更好的了解代碼功能及其能夠?qū)崿F(xiàn)功能的而一個很好的方式。用戶可不愿意花大量時間研究你的代碼輸入輸出。

文檔書寫沒有什么強制的規(guī)則,理論來說你給的文檔越多,肯定越好。

這個過程包括了代碼內(nèi)部注釋說明及其外部的使用API文檔或者應用演示。

錯誤三:沒有提供足夠的靈活性和自定義

最受歡迎的插件提供了對于參數(shù)(即用戶使用的插件選項)完整的訪問。他們可以提供很多不同的配置,這樣可以應用到不同的場景中。例如,我們這里看看一個簡單幻燈插件??梢钥刂频倪x項包括了速度,類型和動畫的延遲。

比較好的實踐是提供用戶訪問class或者ID名稱。更好的話,你可能想調(diào)用幻燈過渡后的callback方法,或者是幻燈恢復到最初的狀態(tài)的callback。

你需要考慮所有插件的可能使用場景和需求。

這里我們在看看另外一個例子:一個調(diào)用API的插件應該提供對于返回對象的訪問??纯慈缦逻@個例子:

      $.fn.getFlickr = 
      
        function
      
      
        (opts) {
   
      
      
        return
      
      
        this
      
      .each(
      
        function
      
      (){ 
      
        //
      
      
         jQuery chainability
      
      
        var
      
       defaults = { 
      
        //
      
      
         setting your default options
      
      
         cb : 
      
        function
      
      
        (data){},
         flickrUrl : 
      
      
        //
      
      
         some default value for an API call
      
      
              }
       
      
      
        //
      
      
         extend the options from defaults with user's options
      
      
        var
      
       options = $.extend(defaults, opts ||
      
         {});
 
       
      
      
        //
      
      
         call the async function and then call the callback
      
      
        //
      
      
         passing in the api object that was returned
      
      
       $.ajax(flickrUrl, 
      
        function
      
      
        (dataReturned){
         options.cb.call(
      
      
        this
      
      
        , dataReturned);
      });
   });
}
      
    

這個插件允許我們執(zhí)行如下代碼行:

    $(selector).getFlickr(function(fdata){ // flickr data is in the fdata object });
  

另 外一個執(zhí)行類似公開化的方法是提供一個”hooks"作為選項。在jQuery1.7.1及其以上版本中,我們可以在插件調(diào)用后使 用.on(eventName, function(){})方法以便分開自己獨立的方法行為。例如,使用上面的插件,我們可以修改代碼如下:

      $.fn.getFlickr = 
      
        function
      
      
        (opts) {
   
      
      
        return
      
      
        this
      
      .each(
      
        function
      
      
        (i,el){
      
      
      
        var
      
       $
      
        this
      
       =
      
         el;
      
      
      
        var
      
       defaults = { 
      
        //
      
      
         setting your default options
      
      
         flickrUrl : "http://someurl.com" 
      
        //
      
      
         some default value for an API call
      
      
              }
       
      
      
        var
      
       options = $.extend(defaults, opts ||
      
         {});
 
       
      
      
        //
      
      
         call the async function and then call the callback
      
      
        //
      
      
         passing in the api object that was returned
      
      
       $.ajax(flickrUrl, 
      
        function
      
      
        (dataReturned){
         
      
      
        //
      
      
         do some stuff
      
      
         $
      
        this
      
      .trigger("callback"
      
        , dataReturned);
      }).error(
      
      
        function
      
      
        (){
            $
      
      
        this
      
      .trigger("error"
      
        , dataReturned);
         });
   });
}
      
    

這樣允許我們調(diào)用getFilckr插件并且鏈式其它行為的處理。

      $(selector).getFlickr(opts).on("callback", 
      
        function
      
      (data){ 
      
        //
      
      
         do stuff }).on("error", function(){ // handle an error });
      
    

你可以看到提供這種靈活方式是絕對重要的,插件擁復雜的操作越多,那么控制就會越復雜。

錯誤四:要求太多的配置

上面的錯誤三我們介紹了越復雜的插件,要求控制就越復雜。一個很大的錯誤在于,插件創(chuàng)建了太多的選項。例如,對于UI插件來說比較理想的方式是不設置缺省的選項。

      $(selector).myPlugin();
    

當然,有時候這不太現(xiàn)實(例如,插件中用戶需要指定RSS Feed來源)。在這里例子中,你應該盡量為用戶設置初始的選項。

例如你開發(fā)一個需要從Tweet取得內(nèi)容的插件。你可以要求用戶輸入一個用戶名,如下:

      $(selector).fetchTweets("gbin1"); 
    

你可以提供缺省的展示方法,例如,feed個數(shù),顯示在<p>標簽中。大多數(shù)的開發(fā)人員都希望是這樣的。

錯誤五:將外部的CSS和行內(nèi)的CSS混淆

如 果你處理UI的話,不可避免的需要在你的插件中包含CSS文件。一般來說,這是一個可接受的解決方式。多數(shù)的插件都帶有圖片和CSS。但是不要忘了錯誤 二,文檔需要包含如何使用這些CSS和圖片的內(nèi)容。開發(fā)人員可沒有時間來搜索你的代碼來找到答案(況且,很多人可能并不會真正開發(fā)jQuery代碼,特別 是在國內(nèi))。

無論如何,我們都需要保證插件能正常工作。

對于插件來說,最好的方式是使用基于Class/ID的CSS樣式或者行內(nèi)注入CSS(使用插件選項)。行內(nèi)CSS會覆蓋外部CSS,但是混合使用倆者會非常不舒服。開發(fā)人員可能會花一定時間來搞清楚為什么代碼中的樣式不好使。所以最好你自己決策如何處理這些問題。

作為一個規(guī)則來說,行內(nèi)的CSS非常不好 - 除非它影響非常小,不會干擾外部的CSS樣式定義。

錯誤六:沒有提供任何在線演示

這絕對是很惡心的一件事,開發(fā)人員必須自己動手才能看到效果,往往發(fā)現(xiàn)不是自己期望的那樣。其實作為插件開發(fā)來說,添加一些在線演示還是很簡單的,如下是一些不錯的演示模板:

A good template for examples:

  • A “hello world” example – usually the plugin call with the minimum configuration/options passed, and it’s accompanying html/css
  • A few more involved examples – usually with examples of full functionality of multiple options
  • An integration example – if someone might use another plugin with your plugin, here is where you can show how to do that. (This gets you bonus points in the open-source development world, too. Kudos.)

錯誤七:代碼沒有匹配正確的jQuery版本

jQuery 和其它的代碼類庫類似,也有不同的版本。大多數(shù)的方法即使被遺棄也會被保留。但是新的方法會被添加。一個非常典型的例子是.on方法。它是jQuery新 版本中事件處理的一個全新的all-in-one解決方案。如果你書寫使用到.on()方法的插件的話,需要使用到jQuery1.6或者以上版本。

一 個比較好的習慣是在你的文檔中說明,你要求的jQuery版本,例如,1.7或者以上,作為我個人來說,在使用jQuery插件中也有類似不愉快的體驗。 所以為了讓更多的開發(fā)人員喜歡你的插件,一定要很好的說明。并且提供一個不再支持的舊版本下載也是一個相當不錯的方法。

問題。

鼓勵大家使用新的jQuery類庫,但是不要讓你的插件失效的太頻繁了!提供一個不再支持的舊版本下載也是一個相當不錯的選擇。

錯誤八:找不到修正說明

除了保證你的jQuery版本的支持和兼容性,你還需要版本控制(例如, Github )。 如果你希望你開發(fā)的jQuery插件最后能夠公開發(fā)布的話,你最好保存在Github中。使用版本控制有諸多的好處,具體就不在這篇文章中詳細說明。但是 最重要的在于允許使用你的插件的開發(fā)人員看到相關的修改,提升或者兼容性的bug修正。這同時能夠幫助你擴展/提高你的插件的用戶體驗。

更多資源:

錯誤九:開發(fā)的插件并沒有人使用

這里我們得提一下,很多插件都很簡單,或者說是膚淺,沒有任何理由來稱之為插件。這個世界不再需要幻燈插件了!

我們不需要閉門造車,很多已經(jīng)存在的不錯的插件,為什么還需要再去開發(fā)呢?

這個世界不再需要幻燈插件了。

錯誤十:沒有提供一個壓縮最小化版本

這個問題非常簡單明顯,如果是一個可供使用的插件,意味著是ready to use的代碼,試問如何在產(chǎn)品環(huán)境中使用一個超大的js代碼呢?

請參考錯誤十三來尋找自動處理解決方案。

錯誤十一:把代碼寫的太“聰明”

當你書寫一個插件的時候,你是不是打算給別人使用的呢?如果你書寫的代碼晦澀難懂,大家如何能夠debug?

如果你給變量起名gbin1,x,y,z,你絕對犯了一個大錯。

錯誤十二:不需要使用jQuery

我 們都很喜歡使用jQuery,但是要知道它是一個類庫,肯定會有些性能代價的。一般來說,你不會太在意jQuery選擇器的性能。當然jQuery是被很 好的優(yōu)化過的。 但是如果你只需要一些簡單的DOM查詢的話,你可能可以考慮使用別的技術,例如,vanilla,Zepto。

不要為了jQuery而使用jQuery,如果你使用其它技術例如,vanilla javascript,你需要 注意兼容性 ,你有可能需要書寫一些polyfill來適應新API。

錯誤十三:沒有自動化整個過程

Grunt是一個基于任務的javascript命令行編譯工具。如果有興趣可以看看這篇文章。

      grunt init:jquery
    

運行這個命令,將會提示你一系列問題,例如,title,描述,版本,git repository,許可等。

Grunt功能不止于此。它可以幫助你自定義boilerplate代碼,并且內(nèi)建很多工具,例如, JSHint , Qunit 還有 PhantomJS

定期使用Grunt做編譯工作。

錯誤十四:沒有做過測試

你是不是認真測試過你的代碼?那你怎么保證代碼正常工作?只靠刷新瀏覽器嗎?還是考慮使用一些工具吧: QUnit , Jasmine , 或者 Mocha

如果測試jQuery插件對你來說比較新的話,可以考慮多留意一些測試工具和方法。

一些有用的資源

希望大家喜歡我們帶來的這篇文章,如果你有任何問題和意見,請給我們留言,謝謝!

via tutsplus

來源: 分享14個jQuery插件開發(fā)人員易犯的錯誤

分享14個jQuery插件開發(fā)人員易犯的錯誤


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久99久久99精品 | 国产综合精品一区二区 | 日本精品久久久久中文字幕8 | 色综合久久天天综合观看 | 色婷婷综合和线在线 | 国产精品99re | 亚洲综合套图 | 亚洲精品久久一区影院 | 久久香蕉久久 | 911国产视频 | 草久视频在线观看 | 久久.com| 视频一区色眯眯视频在线 | 国产精品99久久免费观看 | 国产精品入口麻豆午夜 | 九月婷婷天天澡天天添天天爽 | 亚洲视频二| 国产视频久久久 | 国产精品国内免费一区二区三区 | 九九热视频免费在线观看 | 精品视频在线观看 | 午夜私人影院在线观看 | 国产成人一区二区视频在线观看 | 国产欧美日韩综合一区二区三区 | 久久久精品久久视频只有精品 | 久久久久久久久中文字幕 | 日日网站 | 久久剧场| 天天狠狠色综合图片区 | 日韩欧美一区二区精品久久 | 一级毛片免费视频网站 | 91啪国自产在线高清观看 | 日韩免费福利视频 | 日日私人影院 | 热久久最新地址 | 天天爽夜夜爽人人爽 | 色婷婷精品综合久久狠狠 | 久久成人18 | 色久激情 | 日本高清精品 | 国产九九免费视频 |