jquery編寫插件的方法

来源:http://www.cnblogs.com/yuqingfamily/archive/2016/08/28/5813270.html
-Advertisement-
Play Games

版權聲明:作者原創,轉載請註明出處! 編寫插件的兩種方式: 1.類級別開發插件(1%) 2.對象級別開發(99%) 類級別的靜態開發就是給jquery添加靜態方法,三種方式 1.添加新的全局函數 2.使用$.extend(obj) 3.使用命名空間 類級別開發插件(用的非常少,1%) 分別舉例: 調 ...


編寫插件的兩種方式:

  1.類級別開發插件(1%)

  2.對象級別開發(99%)

類級別的靜態開發就是給jquery添加靜態方法,三種方式

  1.添加新的全局函數

  2.使用$.extend(obj)

  3.使用命名空間

類級別開發插件(用的非常少,1%)

  分別舉例:

//1.直接給jquer添加全局函數
jQuery.myAlert=function (str) {
    alert(str);
};

//2.用extend()方法。extend是jquery提供的一個方法,把多個對象合併起來,參數是object
jQuery.extend({
    myAlert2:function (str1) {
        alert(str1);
    },
    myAlert3:function () {
        alert(11111);
    }
});

//一定要註意兩種類級別編寫插件方式書寫的區別。

//3.使用命名空間(如果不使用命名空間容易和其他引入的JS庫裡面的同名方法衝突)
jQuery.yuqing={
    myAlert4:function (str) {
        alert(str);
    },
    centerWindow:function (obj) {
        obj.css({
            'top':($(window).height()-obj.height())/2,
            'left':($(window).width()-obj.width())/2
        });
        //必須進行返回對象的操作,否則就不能繼續往下進行鏈式操作了。。
        return obj;
    }
};

調用部分:

  //調用自定義插件方法
  $('#btn').click(function () {
      $.myAlert('我是調用jquery編寫的插件彈出的警告框');
      $.myAlert2('我是調用jquery的extend()方法編寫的插件彈出的警告框');
      $.myAlert3();
      $.yuqing.myAlert4("調用使用了命名空間編寫的插件方法");
  });
 $.yuqing.centerWindow($('#div1')).css('background','red');

註意:jquery文件要一併引入。

對象級別開發插件(常用99%)

jquery官方給了一套對象級別開發插件的模板:

;(function ($) {
    $.fn.plugin=function (options) {
        var defaults={
            //各種參數、各種屬性
        };
//options合併到defaults上,defaults繼承了options上的各種屬性和方法,將所有的賦值給endOptions
var endOptions=$.extend(defaults,options); this.each(function () { //實現功能的代碼 }); }; })(jQuery);

模板要點:

1.函數全部放在閉包里,外面的函數就調用不到裡面的參數了,比較安全
2.前面加分號,避免不必要的麻煩

舉個慄子:

  需求:開發一個插件,要求奇數行顏色是yellow,偶數行顏色是green,滑鼠移到的行變為blue,移除變為原來的顏色

   HTML佈局:

<table id="tab">
    <tr>
        <th>姓名</th>
        <th>年齡</th>
        <th>身高</th>
        <th>體重</th>
    </tr>
    <tr>
        <td>張三</td>
        <td>22</td>
        <td>178cm</td>
        <td>79kg</td>
    </tr>
    <tr>
        <td>美美</td>
        <td>34</td>
        <td>167cm</td>
        <td>60kg</td>
    </tr>
    <tr>
        <td>小青</td>
        <td>23</td>
        <td>170cm</td>
        <td>55kg</td>
    </tr>
    <tr>
        <td>張三</td>
        <td>22</td>
        <td>178cm</td>
        <td>79kg</td>
    </tr>
    <tr>
        <td>美美</td>
        <td>34</td>
        <td>167cm</td>
        <td>60kg</td>
    </tr>
    <tr>
        <td>小青</td>
        <td>23</td>
        <td>170cm</td>
        <td>55kg</td>
    </tr>
    <tr>
        <td>張三</td>
        <td>22</td>
        <td>178cm</td>
        <td>79kg</td>
    </tr>
    <tr>
        <td>美美</td>
        <td>34</td>
        <td>167cm</td>
        <td>60kg</td>
    </tr>
    <tr>
        <td>小青</td>
        <td>23</td>
        <td>170cm</td>
        <td>55kg</td>
    </tr>
</table>
View Code

  css樣式

table{
    width: 100%;
    border-collapse: collapse;
    border: 1px solid palevioletred;
}
th,td{
    height: 30px;
    text-align: center;
    border: 1px solid deeppink;
}
.evenRow1{background: yellow;}
.oddRow1{background: green;}
.curRow1{background: blue;}
View Code

  jquery調用代碼:

$('#tab').table({
    evenRowClass:'evenRow1',
    oddRowClass:'oddRow1',
    curRowClass:'curRow1',
    eventType1:'click'
});

 jquery插件代碼:

 1 ;(function ($) {
 2     $.fn.table=function (options) {
 3         var defaults={
 4             //各種參數、各種屬性
 5             evenRowClass:'evenRow',
 6             oddRowClass:'oddRow',
 7             curRowClass:'curRow',
 8             eventType1:'mouseover',
 9             eventType2:'mouseout'
10         };
11         
12         var endOptions=$.extend(defaults,options);
13         
14         this.each(function () {
15             var _this = $( this );
16             _this.find('tr:even').addClass(endOptions.evenRowClass);
17             _this.find('tr:odd').addClass(endOptions.oddRowClass);
18 //滑鼠移入和移出,但實際開發中不直接使用mouseover這種方法 19 /*$(this).find('tr').mouseover(function () { 20 $(this).addClass(endOptions.curRowClass); 21 }).mouseout(function () { 22 $(this).removeClass(endOptions.curRowClass); 23 });*/ 24 25 //實際開發中要用bian()方法綁定 26 //因為用bind()方法綁定非常靈活,事件可以自己定義 27 //mouseover mouseout...事件底層都是用bind()去實現的,mouseout 等只是快捷方式 28 _this.find('tr').bind(endOptions.eventType1,function () { 29 $(this).addClass(endOptions.curRowClass); 30 }); 31 _this.find('tr').bind(endOptions.eventType2,function () { 32 $(this).removeClass(endOptions.curRowClass); 33 }) 34 }); 35 }; 36 })(jQuery);

插件註釋:

15行:var _this = this;  變數存儲,因為很多地方用到$(this);所以將其存儲為變數使用更加的方便,也提高了運行效率。

19-23行與28-33行實現的功能是相同的,但是推薦使用28-33行的寫法,使用bian()進行事件的綁定,因為使用會非常的靈活。

可變的地方,如樣式名稱等最好寫在defaults里,方便用戶自行配置。

 

再來一個對象級別實現jquery插件的慄子(⊙o⊙)哦!!實現選項卡功能~~

HTML佈局

<div id="tab">
    <ul id="nav">
        <li class="active">HTML</li>
        <li>CSS</li>
        <li>JAVASCRIPT</li>
    </ul>
    <div id="cont">
        <div style="display: block;">HTML</div>
        <div>CSS</div>
        <div>JAVASCRIPT</div>
    </div>
</div>

css樣式:

* {
    margin: 0;
    padding: 0;
}

#nav li {
    list-style: none;
    float: left;
    height: 25px;
    line-height: 25px;
    border: 1px solid #0000FF;
    border-bottom: none;
    padding: 5px;
    margin: 10px;
    margin-bottom: 0;
}

#cont div {
    width: 210px;
    height: 150px;
    border: 1px solid #0000FF;
    margin-left: 10px;
    clear: both;
    display: none;
}

.active {
    background: #AFEEEE;
}

調用的JS代碼

<script type="text/javascript">
    $('#tab').tab({
        tabType: 'mouseover'
    });
</script>

註意哦:不要忘記先引入jquery.js文件喔,然後在引入我們編寫的插件tab.js,才能正確調用到tab()方法。。。

插件tab.js

;(function($) {
    $.fn.tab = function(options) {
        var defaults = {
            tabActiveClass: 'active',
            tabNav: '#nav>li',
            tabCont: '#cont>div',
            tabType: 'click'
        };

        var endOptions = $.extend(defaults, options);
        $(this).each(function() {
            var _this = $(this);
            _this.find(endOptions.tabNav).bind(endOptions.tabType, function() {
                $(this).addClass(endOptions.tabActiveClass).siblings().removeClass(endOptions.tabActiveClass);
                var index = $(this).index();
                _this.find(endOptions.tabCont).eq(index).show().siblings().hide();
            });
        });
    };
})(jQuery);

這個小慄子和上一個表格插件的慄子相似度是很高的,多敲幾遍,理解意思,其實jquery擴展插件並不難哦~~

 

如有不對的地方,還請各路大神賜教!

 


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

-Advertisement-
Play Games
更多相關文章
  • 最近做webapp項目過程中,發現坑還是挺多的,一方面時對這方面開發的接觸還不是很深,另外就是基礎知識不扎實了,移動web開發在相容性方面的問題還是挺多的,以下是網路收集一些開發中的常見問題及知識彙總,以便查閱,慢慢更新:)。 meta 基礎知識 H5頁面視窗自動調整到設備寬度,並禁止用戶縮放頁面 ...
  • 圖片延遲載入 jQuery插件:jQuery.lazyload <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> body{ margin: 0 auto; } .pg-hea ...
  • 一,定義和用法 <hr /> 標簽在 HTML 頁面中創建一條水平線。 水平分隔線(horizontal rule)可以在視覺上將文檔分隔成各個部分。 二,HTML 與 XHTML 之間的差異 在 HTML 中,<hr> 標簽沒有結束標簽。 在 XHTML 中,<hr> 必須被正確地關閉,比如 <h ...
  • 0、JavaScript的簡單數據類型包括數字、字元創、布爾值(true/false)、null和undefined值,其它值都是對象。 1、JavaScript只有一個數字類型,它在內部被表示為64位的浮點數。沒有分離出整數,所以1和1.0的值相同。 ...
  • 函數的一些理論知識 1. 函數: 執行一個明確的動作並提供一個返回值的獨立代碼塊。同時函數也是javascript中的一級公民(就是函數和其它變數一樣)。 2.函數的聲明方式: 1> 函數聲明:在函數里,必須手動去聲明函數的返回值,如果返回值沒有申明,則此函數返回值為undefined,,retur ...
  • 我們不要去糾結神馬是內建對象,神馬是內建構造器。到後來你們便會發現其實她們都是對象。 Array()是一個構建數組的內建構造器函數: 與下麵的是等效的: 無論數組是以神馬方式創建的,我們都可以照常向裡面添加元素。 當我們使用構造器函數Array()創建數組時,也可以通過傳值的方式為其添加元素: 如果 ...
  • 除了使用new操作符調用構造函數以外,我們也可以拋開new操作符,只用一般函數來創建對象,這樣就能執行某些預備工作,並已對象為返回值的函數。、 然後我們調用her()來生成對象: 實際上構造函數也是可以返回對象的,只不過this的值使用上將會有所不同。 在這裡,構造其函數不是返回包含屬性name的t ...
  • 我們可以通過構造器函數(簡稱構造函數)來創建對象: 為了使用該函數來創建對象,我們需要使用new操作符,例如: 使用構造函數創建對象的好處就是她可以接受一些參數,下麵我們就來修改一下上面的例子: 現在,我們就能利用同一個構造函數創建不同的對象了: 按照慣例,我們應該將構造函數的首字母大寫,以便區分一 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...