jquery插件開發

来源:http://www.cnblogs.com/puyongsong/archive/2016/10/22/5987609.html
-Advertisement-
Play Games

今天周六,玩了一上午lol了,趁等飯點的時間淺談一下jquery插件開發,望大神指教鞭策! 在軟體開發過程中需要一定的設計模式來指導開發,有了模式,我們便能更好的組織我們的代碼,並從前人的經驗中學到更好的實踐。根據《jQuery高級編程》中的描述,jQuery插件開發方式重要有三種: 通常我們使用第 ...


今天周六,玩了一上午lol了,趁等飯點的時間淺談一下jquery插件開發,望大神指教鞭策!

在軟體開發過程中需要一定的設計模式來指導開發,有了模式,我們便能更好的組織我們的代碼,並從前人的經驗中學到更好的實踐。
根據《jQuery高級編程》中的描述,jQuery插件開發方式重要有三種:

  1. 通過$.extend()來擴展jQuery
  2. 通過$.fn向jQuery添加新的方法
  3. 通過$.widget()應用jQuery UI的部件工廠方式創建(這種方式暫時很少用,估計你們也很少見吧!呵呵……)

  通常我們使用第二種方法來進行簡單的插件開發,說簡單是相對於第三種方式。第三種方式是用來開發更高級的jQuery部件的,該模式開發出來的部件帶有很多jQuery內建的特性,比如插件的狀態信息自動保存,各種關於插件的方法等,都非常的細緻。
而第一種方法又太簡單,僅僅是在jQuery命名空間或者可以理解在jQuery自身添加一個靜態的方法而已。所以我們在調用通過$.extend()添加的方法時,直接通過$符號調用$.myFunction()而不需要選中DOM元素$().myFunction()。

方式一、$.extend()

//定義插件
    $.extend({
      goTop:function(){
        $('html,body').animate({scrollTop:0}, 500);
      }
    });
//調用
  $('.gotop').click(function(){
    $.goTop();
  });

  上面的代碼中通過$.extend()方法向jQuery添加了一個goTop方法,然後通過$直接調用。到此已完成了一個簡單的jQuery插件。
  如你所見,通過此種方法來定義一些輔助類的方法是比較方便的,定義一次後,可以通過jQuery在程式中任何需要的地方調用它。

方式二、$.fn

  第一種種方法,並不能使用jQuery強大的選擇器,要處理DOM元素以及將開發的插件運用到所選的元素上,還是要使用第二種方法。我所見到和使用的插件大多也是通過$.fn的方式創建的,至少目前是。

  第二種方式的語法示例:

$.fn.mypluginName = function(){
  //代碼內容 
}

  往$.fn上面添加一個方法,名字是我們插件的名稱,然後我們的插件代碼在這個方法中展開。
  比如我們將頁面中某元素背景顏色改為紅色,則寫成:

//定義插件
$.fn.pluginBg = function(){
        this.css('backgroundColor','red'); //在這裡,this指用jQuery選中的元素,即:this = $(element),this用法再此不過多介紹
    }
//調用
$(elment).pluginBg();

  傳參插件

  一個強勁的插件是可以讓使用者隨意定製的,這便要求我們在開發插件是考慮的更加全面些,儘量提供合適的參數。在處理插件參數的接收上,通常使用jQuery的extend方法,上面也有提到過,但那是給extend方法傳遞單個對象的情況下,這個對象會合併到jQuery身上,所以我們就可以在jQuery身上調用新合併對象里包含的方法了。當給extend方法傳遞多個對象時,它會將所有參數對象合併到第一個裡。同時,如果對象中存在同名的屬性,合併時後面的會覆蓋前面的。利用這一點,我們可以在插件中定義一個保存插件參數預設值的對象,同時將接收來的參數對象合併到預設對象上,最後就實現了用戶指定了值得參數使用指定值,未指定參數時使用插件的預設值。  

  我們舉個例子,允許用戶調用插件的時候設置color,代碼如下:

//定義插件
$.fn.pluginStyle = function(opt){
  var defaults = {
    'color' : 'red',
  };
  var settings = $.extend(defaults,opt);
    return this.css({
      'color': settings.color,
    })
}

//不傳參調用,則color設置為預設值red                
$(elm).pluginStyle();
//傳參調用,則color設置為blue
$(elm).pluginStyle({'color':'blue'});

  到此,插件可以接收和處理參數後,就可以編寫出更靈活的插件了。

面向對象插件

  問:

  若要編寫一個複雜的插件,代碼量會很大,如何組織代碼就成了一個需要面臨的問題,沒有一個好的方式來組織代碼,整體感覺會雜亂無章,同時也難以維護,怎麼辦呢?

  答:

  我們將插件的所有屬性包裝到一個對象上,用面向對象的思維來進行開發,那麼,一切將迎刃而解!

  我們將上面的例子美化一下,代碼如下:

//定義Nick對象的構造方法
  var Nick = function(ele, opt){
    this.$element = ele,
      this.defaults = {
        'color': 'red'
      },
      this.options = $.extend(this.defaults,opt);
  }
  //定義對象的方法
  Nick.prototype = {
    handsome:function(){
      return this.$element.css({
        'color': this.options.color
      });
    }
  }
  //在插件中使用對象
  $.fn.myPlugin = function(options){
    //創建實體
    var me = new Nick(this, options);
    //調用其方法
    return me.handsome();
  }

  //不傳參調用,則color設置為預設值red
  $(elm).pluginStyle();
  //傳參調用,則color設置為blue
  $(elm).pluginStyle({'color':'blue'});

  寫到這裡我感覺已經完美了,但是在吃飯完後準備發佈的時候,看了看--哎呀!好像還有進步空間吖!

匿名函數的用處到了

  不僅是jQuery插件的開發,我們在寫任何JS代碼的時都應該註意不要污染全局命名空間,因為隨著代碼量的增加,如果有意無意在全局範圍內定義一些變數的話,最後很難維護,也會和別人寫的代碼發生衝突。
  一個好的做法是始終使用自調用匿名函數包裹你的代碼,這樣就可以完全安全、放心的用到任何地方,絕對不會發生衝突問題。
在Javascript中無法使用花括弧方便的創建作用域,但函數卻可以形成一個作用域,域內的代碼是無法被外界訪問的,如果我們將自己的代碼放入到函數中,那麼就不會污染全局命名空間,同時也不會和別的代碼發生衝突。所以我們將所有代碼用自調用匿名函數包裹。
  最後的將上面的插件代碼用一個匿名函數包裹起來,大功告成!

  結束時,還是那句話--望大神指教鞭策我!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文檔目錄 本節內容: 簡介 一個快速示例 其它特性 啟動模板 如何使用 簡介 我們總是對不同的需求開發不同的應用。但至少在某些層面上,一次又一次地重覆實現通用的和類似的功能。如:授權,驗證,異常處理,日誌,本地化,資料庫連接管理,設置管理,審核日誌等功能。所以我們創建架構和最佳實踐,如分層和模塊架構 ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <script type="text/javascript"> //方法一: var max=1; for(var ...
  • 測試環境:Windows7 主要測試:IE6、IE7、IE8、Fire Fox3.5.6 次要測試:Chrome4.0、Opera10.10、Safari4.04、360瀏覽器3.1為了能夠讓多個Hack在同一個例子里,現對實例頁面做如下要求是: <!DOCTYPE html PUBLIC "-// ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .stage{ width: 210px; height: 250px; margin: 50px auto; } ...
  • 因為做項目,用到跳轉回上級頁面,這裡設置定時3秒跳轉到目標頁面 ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="test" id="n1" value="" /> <input type="test" id="n2" ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <script type="text/javascript"> var year=prompt("請輸入年份");/ ...
  • 今天碰到了這樣一個問題,我在javascript中動態創建了一個button, 然後我想給改button添加click事件,綁定的function想要傳入一個變數參數, 一開始我想直接通過函數傳參傳進來,然而不知道為什麼,click事件無法正常響應, 最後發現可以這麼做,將需要傳入的參數加入butt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...