jQuery編寫插件

引言:

  在項目中不同頁面經常要用到已經寫好的交互,比如彈窗,比如下拉菜單,比如選項卡,比如刪除...

此時如果每次都把代碼copy一份無疑是一件比較麻煩并且無趣的事情,而且個人認為有些low了,我們可是要追尋

高大上的90后有為青年呢~可是該如何高大上呢?這時jQuery自定義插件開發來了,第一次聽到插件開發覺得如此happy,

遂動手網上查找資料進行學習,如下,我用自己的語言將插件開發的程序步驟寫出來,如有錯誤,歡迎指正。

?

1:jQuery插件開發分為類級別開發對象級別開發,因為類級別開發在真實項目中幾乎不用,下面只對象級別進行探究。

?

a , 首先準備好一個架子,如下:

;$(function($){})(jQuery);

b, 這個架子是你編寫插件代碼要寫入的空間,下面簡單解釋一下這個架子:

1)在jQuery環境下封裝自己的插件,首先為避免與其他庫的沖突,需要在插件的后面傳一個jQuery參數進去,對應的函數里面的參數寫入$

2)未避免出現問題,需在插件的前后加入分號(分號的增加并不會影響程序的運行)

?

2:再上一個架子

?

復制代碼
;(function($){$.fn.tab = function(options){var defaults = {//各種參數,各種屬性}var options = $.extend(defaults,options);this.each(function(){//各種功能});return this;}})(jQuery);
復制代碼

這個架子是個什么東西呢?原來他是jQuery官方提供的一個標準化的開發模式,這里簡單地介紹一下,不作詳要說明,細節有興趣的童鞋可以自己百度一下。

$.fn.tab ?這個tab是你這個功能插件的名字,可任意改變名字,你自己知道就好了。

?

var options = $.extend(defaults,options);? 這個是利用extend方法把?defaults對象的方法屬性全部整合到?options里,

也就是options繼承了defaults對象的方法以及屬性。這個defaults和options名字是可以隨意更改的,只要是滿足js的命名規范。

?

this.each(function(){});就不介紹了,下面會通過一個實例表現它,這里你只需要知道他是實現功能代碼的地方就可以啦~

至于return this; 就留到實例結束后面再說,這樣做肯定是有原因的啦,別心急~

?

3:心細的girls or boys 肯定知道這個實例是什么啦,沒錯,是tab選項卡~

下面以tab選項卡的方式來explore這個插件的編寫。

?

a: 先備好html,

復制代碼
<div class="tab">

  <ul class="tab_nav">
    <li class="current">html</li>
    <li>css</li>
    <li>js</li>
  </ul>

  <div class="tab_content">
    <div style="display:block;">html</div>
    <div>css</div>
    <div>js</div>
  </div>
</div>

復制代碼

b,頁面是這樣的:

?

c,ok,頁面已經準備就緒,現在可以來寫插件了,先上代碼

復制代碼
;(function($){
    $.fn.tab = function(options){var defaults = {//各種參數,各種屬性}var options = $.extend(defaults,options);this.each(function(){//各種功能  //可以理解成功能代碼var _this = $(this);_this.find('.tab_nav>li').click(function(){$(this).addClass('current').siblings().removeClass('current');var index = $(this).index();_this.find('.tab_content>div').eq(index).show().siblings().hide();});});return this;}})(jQuery);
復制代碼

?

d,這個時候只需要看this.each下的功能代碼,學過jQuery的同學都知道代碼實現,這里主要就調用插件和配置參數這一塊來進行探究。

?

4,在html代碼里我們只需要:

<script>$(function(){$('.tab').tab();});
</script>

a,找到外部容器,并調用你所寫的tab方法(就是你所寫的插件名字):

$.fn.tab = function(options){}

?

b,敏感的童鞋肯定發現了功能代碼里面的class元素以及事件是被寫死的,要是我們在另外一個頁面寫的class和事件需求和這個插件的不同,

除了改插件源碼之外這個插件就沒法用用了,作為可擴展性的插件我們怎么可以把它寫死呢?嗯哼?當然不可以啦~

?

好,就讓我們一起來解決它吧:

1)請看下圖:

?

2) 沒錯,就在這里配置它,我們可以看到哪些東西被寫死了呢?下圖:

3) 現在我們可以在default對象里面繪畫你的小空間啦~見下圖:

?

3)有的同學可能會疑惑為什么用options調用呢?其實上面已經說過啦,因為extends將default對象的屬性以及方法都整合到了options里。

這時候只需要用options調用就可以了。

4)同樣的如果需求是把click事件改為mouseover事件,此時我們需要用到on() or bind() ,這樣就方便我們改事件參數啦,如下:

_this.find(options.tabNav).on('click',function(){}

此時只要在default里寫入相應的代碼

eventType:'click'

而后同樣的變化

_this.find(options.tabNav).on(options.eventType,function(){}

5)此時因為需求是mouseover,這是就不需要改插件源碼啦,直接在html里的js代碼(or你自己的js總文件里)進行相應的變化就ok啦,如下:

1
2
3
4
5
6
7
8
9
<script>
????????$(function(){
????????????$('.tab').tab({
????????????????currentClass:'current123',
????????????????eventType:'mouseover'
????????????????????????????????.....
????????????});
????????});
</script>

*此時在這里更改class和事件就很方便啦,溫馨提示,class改變雖好,可別忘了改對應的css樣式名字哦,要成雙成配呢~

?

好了,到這里基本上就要結束啦,哦,對了,return this;還沒說呢,寶寶是不會忘記的~

5:jQuery最強大的特性之一莫過于鏈式操作啦,此時如果你在$('.tab').tab()后面追加操作,你會發現無法實現,如下:

$('.tab').tab().find('.tab_nav>li').css('background','red');

但是當你return this把對象返回出去的時候你會發現又重新實現了~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webstorm中nodejs代碼提示

preferences->languages&frameworks->Node.js and Npm中選擇一個本地的node版本 preferences->languages&frameworks->JavaScript->Libraries 勾選node.js Core 回到代碼

9012教你如何使用gulp4開發項目腳手架

本文將會介紹如何使用gulp4來搭建項目腳手架&#xff0c;如果您還在使用gulp3或更老的版本&#xff0c;您也以通過本文的一些思想將之前的項目進行完善&#xff0c;更新。如果gulp不是你們團隊的重點&#xff0c;也可以移步我的另一篇文章:用 webpack 4.0 擼單頁/多頁腳手架 (j…

nodejs模塊

nodejs模塊遵循commonJS規范&#xff0c;但并不是完全實現規范&#xff0c;主要使用require引入模塊、使用exports導出模塊。 導出屬性或方法 使用exports mouduleA.js&#xff1a; var say function(world){console.info("say: "world); }var sing function(wo…

Array.prototype.slice.call(arguments)

Array.prototype.slice.call(arguments)能將具有length屬性的對象轉成數組&#xff0c;除了IE下的節點集合&#xff08;因為ie下的dom對象是以com對象的形式實現的&#xff0c;js對象與com對象不能進行轉換&#xff09;如&#xff1a;1 var a{length:2,0:first,1:second}; 2 Ar…

動態內存分配導致內存泄漏之處

摘要&#xff1a;舉了幾個動態內存分配過程中&#xff0c;發生內存泄漏的例子 1. 分配了內存&#xff0c;卻沒有及時刪除,導致泄漏 1: void doSomething() 2: { 3: int *pnValue new int; 4: } 2. 為指針變量分配了一個內存&#xff0c;然后又讓指針變量指向其他的值,導致…

nodejs常用模塊-url

URL nodejs中針對url的常用方法。 node下打印url&#xff0c;結果&#xff1a; 引入url模塊 var url require(url) 1、parse方法 將url解析成對象&#xff0c;parse方法原型&#xff1a; url.parse(urlStr[, parseQueryString][, slashesDenoteHost]) 可傳遞三個參數…

常用的javascript設計模式

請堅持 什么是設計模式 百度百科&#xff1a; 設計模式&#xff08;Design pattern&#xff09;是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問&#xff0c;設計模式…

express項目創建

1、安裝項目生成器 cnpm i express-generator -g express4.0以后&#xff0c;express與express-generator包分離&#xff0c;全局使用express命令生成項目骨架時應該安裝express-generator包。 2、生成項目骨架 express server 默認使用的是jade模板&#xff0c;使用ejs模…

設置Jexus開機啟動

把jexus做成系統服務&#xff0c;就像windows服務一樣&#xff0c;可以設置開機啟動就可以了。 第一、進入目錄 /lib/systemd/system/ 第二、新建文件 vi jexus.service 文件內容 [Unit] Descriptionjexus Afternetwork.target[Service] Typeforking ExecStart/usr/jexus/jw…

iOS警告-This block declaration is not a prototype

關于警告 我們定義一個不帶參數的block,通常是如下的方式 1typedefvoid (^UpdateSwichBtnBlock)();在xcode9中會提示一個警告 12This block declaration is not a prototypeInsert ‘void解決方式可以是如下的幾種 1typedefvoid (^UpdateSwichBtnBlock)(void);但是這樣,很多第三…

mac環境mongodb安裝與配置

一、安裝 MAC環境安裝mongodb有兩種方式&#xff0c;一種方式是通過下載安裝包&#xff0c;另一種方式是通過homebrew。 1、安裝包方式 從mongodb官網可以下載MAC安裝包&#xff1a;https://www.mongodb.com/download-center#community 或者使用curl下載 # 進入 /usr/loca…

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型...

以下為借鑒 var stack1 [], stack2[]; function push(node){stack1.push(node);}function pop(){if(stack2.length){return stack2.pop();}else{if(stack1.length){var len stack1.length;for(var i0;i<len;i){stack2.push(stack1.pop());}return stack2.pop()}else{retur…

使用CocoaPods導入百度地圖SDK所遇到的坑

執行pod install遇到的問題:解決方安:百度了下,發現pod install命令被墻了,換成pod install --verbose --no-repo-update

NSTimer不準確與GCDTimer詳解

NSTimer不準&#xff0c;scheduleTimer放在runloop里面&#xff0c;受runloop模式影響會不準// [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(nonnull id)#> selector:<#(nonnull SEL)#> userInfo:<#(nullable id)#> r…

flex的12個屬性

容器&#xff08;父元素&#xff09;的屬性&#xff1a; flex-direction屬性決定主軸的方向 flex-wrap 屬性決定項目在一行排不下的情況下是否換行 flex-flow flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式&#xff0c;默認值為row nowrap。 jstify-content …

vue圖片懶加載插件vue-lazyload

插件地址&#xff1a;https://github.com/hilongjw/vue-lazyload demo&#xff1a;http://hilongjw.github.io/vue-lazyload/ 1、安裝 cnpm i vue-lazyload -S 2、使用 main.js import VueLazyLoad from vue-lazyloadVue.use(VueLazyLoad, {error:/static/error.png,loadin…

IT需求過程管理

IT部門就是為其他業務、內勤部門提供信息化手段的&#xff0c;所以在實施信息化系統的時候首先要做的就是需求調研&#xff0c;但是針對于絕大多數業務部門的人員而言&#xff0c;信息系統是很不熟悉的&#xff0c;我們會經常聽到這樣的回復“這個應該很快就可以實現吧”、“當…

maskView與CAGradientLayer詳解

#maskView基本原理 - png圖片透明像素的原理 - maskView可類比于多張png圖片的疊加遮罩&#xff0c;原理類似 - maskView是iOS8以上才有的&#xff0c;如果要考慮兼容低版本&#xff0c;用maskLayer替代 //使用maskView的情況 property (nonatomic, strong)UIImageView *addIma…

nodejs的啟動方式

1、原始node命令 直接命令行中使用node命令 node xxx.js 或者安裝nodemon&#xff0c;使用nodemon啟動方便在開發階段熱部署代碼改動 npm i nodemon -G nodemon xxx.js 2、webstorm方式 webstorm中&#xff0c;需要執行的文件的上&#xff0c;右鍵->run&#xff0c;右…

win7rc 序列號- 10/21之前

安裝介紹&#xff1a;http://www.microsoft.com/china/windows/windows-7/download.aspx 注冊獲得序列號&#xff1a;http://technet.microsoft.com/zh-cn/evalcenter/dd353205.aspx?ITPIDmscomsc在 2009 年 10 月 21 日之前&#xff0c;您仍可以通過注冊來獲取產品密鑰或查找…