現(xiàn)在開始為 jQuery 編寫插件

jQuery 已經(jīng)是現(xiàn)在 Front-End 開發(fā)必備工具锋谐,本文將介紹如何為 jQuery 編寫一個 ColorButton 插件。

本文涉及:

  • jQuery plugin 基本結(jié)構(gòu)
  • 編寫一個簡單的 plugin
  • 引入封裝,完成 ColorButton
  • 為 plugin 編寫 Unit Test

編寫 jQuery 基本結(jié)構(gòu)

  1. 創(chuàng)建 plugin 代碼
  2. plugin 添加方法
  3. plugin 注冊到 jQuery
(function($) {

  // 1. 創(chuàng)建 plugin 代碼
  var ColorButton = function($select, options) {
    // 初始化
    this.$el = $select
    this.settings = $.extend({
      // 默認(rèn)參數(shù)
    }, options || {});

    // binding 事件
  };

  // 2. 為 plugin 添加方法
  $.extend(ColorButton.prototype, {
    // 這里定義方法
  });

  // 3. 將 plugin 綁定到 jQuery
  $.fn.colorbutton = function(options) {
    return this.each(function() {
      var $select = $(this)
      if (!$select.data('colorbutton')) {
        $select.data('colorbutton', new ColorButton($select, options));
      }
    });
  };

})(jQuery);

// 使用
$('.color-button').colorbutton();

JSFildder 代碼: https://jsfiddle.net/lvjian700/kn6qvmcz/1/

編寫一個簡單的 plugin

這里按照上述模板代碼做一個最小的插件:

  1. ColorButton 綁定到 button 上
  2. 當(dāng)點擊 button 時逾一,在控制臺輸出 clicked
  // 1. 創(chuàng)建 plugin 代碼
  var ColorButton = function($select, options) {
    // 組建初始化代碼
    this.$el = $select
    this.settings = $.extend({
      // 默認(rèn)參數(shù)
    }, options || {});

    // binding 事件
    this.$el.click(function() {
      console.log('clicked');
    });
  };

JSFildder 上的完整代碼:https://jsfiddle.net/lvjian700/kn6qvmcz/2/

引入封裝梯澜,完成 ColorButton

上篇我們在 plugin 初始化時進(jìn)行了事件綁定。現(xiàn)在我們實現(xiàn) ColorButton 的功能枕赵。當(dāng)用戶點擊 ColorButton 時改變 button 的背景色猜欺。

color-button.gif

步驟:

  1. 接收參數(shù),提供 colors 選項拷窜,并且為 colors 提供默認(rèn)參數(shù)
  2. 提供 getColor 方法提供當(dāng)前的背景色
  3. 提供 changeColor 方法改變顏色
  4. changeColor 班定到 click 事件
  var ColorButton = function($select, options) {
    this.$el = $select;
    this.colorIndex = 0;

    // 1. 接收參數(shù)开皿,提供 colors 選項,并且為 colors 提供默認(rèn)參數(shù)
    this.settings = $.extend({
      colors: ['#ff0', '#f0f', '#0ff']
    }, options || {});

    var that = this;
    this.$el.click(function(e) {
      e.preventDefault();
      // 4. 將 changeColor 綁定到 click 事件
      that.changeColor();
    });
  };

  $.extend(ColorButton.prototype, {
    // 3. 提供 changeColor 方法改變顏色
    changeColor: function() {
      this.$el.css({ backgroundColor: this.getColor() });
    },
    // 2. 提供 getColor 方法提供當(dāng)前的背景色
    getColor: function() {
      var currentIndex = this.colorIndex;
      this.colorIndex = (this.colorIndex + 1) % this.settings.colors.length;

      return this.settings.colors[currentIndex];
    }
  });

JSFildder 上的完整代碼:https://jsfiddle.net/lvjian700/kn6qvmcz/3/

為 plugin 編寫 Unit Test

Web 開發(fā)中我們一般使用 CucumberCapybara 對 UI 進(jìn)行測試篮昧。這個層級的測試屬于 UI Automattion Test赋荆,也可稱為 Acceptance Test。這類測試運行成本比較高懊昨。

所以這里采用 Unit Test 方式對 plugin 進(jìn)行測試窄潭。

工具:

  • mocha:提供類 RSpec 風(fēng)格的 Test Case
  • chai: 提供 assertion 和 matchers
  • chai-jquery:提供更好用的 assertion

更好的工具,但是本文沒有使用:

  • karma:當(dāng)然我們可以使用 karma 在命令行中運行測試酵颁,本文暫時沒有使用
  • sinon:可以做 sub嫉你、mock月帝、spy, mock network

如果你用的 Rails,可以使用 teaspoon 來運行測試幽污。

編寫測試的基本結(jié)構(gòu):

  describe('ColorButton', function () {

    beforeEach(function() {
        // 加載 fixture
        // 初始化 plugin
    });

    afterEach(function() {
        // remove fixture
    });

    describe('描述 Context', function() {
      beforeEach(function() {
        // 準(zhǔn)備 Context
      });
      it('assertion 描述', function() {
        // 我們期待 ...
      });
    });
    
    // 更多 Context ...
  });

ColorButton 的測試:

  describe('ColorButton', function () {

    beforeEach(function() {
      $('body').append('<a id="color-button" href="#">Button</a>');
      $('#color-button').colorbutton({
        colors: ['#ff0', '#f0f']
      });
    });

    afterEach(function() {
      $('#color-button').remove();
    });

    describe('when click button once', function() {
      beforeEach(function() {
        $('#color-button').click();
      });

      it('should change button color', function() {
        expect($('#color-button')).to.have.css('backgroundColor', 'rgb(255, 255, 0)')
      });
    });
    
    // 更多 Context ...
  });    

完整的代碼:https://github.com/lvjian700/color-button嚷辅,參考 readme 即可運行測試。

color-button-unittest.png

寫在最后

如果你的項目只想用簡單的 jQuery 并不想使用類似 Backbone.js油挥、Angular.js潦蝇、React.js 的框架,使用 jQuery plugin 模塊化 UI 組建也是一個不錯的選擇深寥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攘乒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惋鹅,更是在濱河造成了極大的恐慌则酝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闰集,死亡現(xiàn)場離奇詭異沽讹,居然都是意外死亡,警方通過查閱死者的電腦和手機武鲁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門爽雄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沐鼠,你說我怎么就攤上這事挚瘟。” “怎么了饲梭?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵乘盖,是天一觀的道長。 經(jīng)常有香客問我憔涉,道長订框,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任兜叨,我火速辦了婚禮穿扳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘国旷。我一直安慰自己矛物,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布议街。 她就那樣靜靜地躺著,像睡著了一般璧榄。 火紅的嫁衣襯著肌膚如雪特漩。 梳的紋絲不亂的頭發(fā)上吧雹,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音涂身,去河邊找鬼雄卷。 笑死,一個胖子當(dāng)著我的面吹牛蛤售,可吹牛的內(nèi)容都是我干的丁鹉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悴能,長吁一口氣:“原來是場噩夢啊……” “哼揣钦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漠酿,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冯凹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炒嘲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宇姚,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年夫凸,在試婚紗的時候發(fā)現(xiàn)自己被綠了浑劳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夭拌,死狀恐怖魔熏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啼止,我是刑警寧澤道逗,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站献烦,受9級特大地震影響滓窍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巩那,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一吏夯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧即横,春花似錦噪生、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春桨嫁,著一層夾襖步出監(jiān)牢的瞬間植兰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工璃吧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楣导,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓畜挨,卻偏偏與公主長得像筒繁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巴元,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容