中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

詳解JavaScript中的自定義事件編寫
來源:易賢網(wǎng) 閱讀:1144 次 日期:2016-07-01 15:00:52
溫馨提示:易賢網(wǎng)小編為您整理了“詳解JavaScript中的自定義事件編寫”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了JavaScript中的自定義事件編寫,自定義事件是在瀏覽器中編寫Web頁面操作功能的基本方式,需要的朋友可以參考下

我們可以自定義事件來實現(xiàn)更靈活的開發(fā),事件用好了可以是一件很強大的工具,基于事件的開發(fā)有很多優(yōu)勢(后面介紹)。

與自定義事件的函數(shù)有 Event、CustomEvent 和 dispatchEvent。

直接自定義事件,使用 Event 構造函數(shù):

var event = new Event('build');

// Listen for the event.

elem.addEventListener('build', function (e) { ... }, false);

// Dispatch the event.

elem.dispatchEvent(event);

CustomEvent 可以創(chuàng)建一個更高度自定義事件,還可以附帶一些數(shù)據(jù),具體用法如下:

var myEvent = new CustomEvent(eventname, options);

其中 options 可以是:

{

  detail: {

    ...

  },

  bubbles: true,

  cancelable: false

}

其中 detail 可以存放一些初始化的信息,可以在觸發(fā)的時候調用。其他屬性就是定義該事件是否具有冒泡等等功能。

內置的事件會由瀏覽器根據(jù)某些操作進行觸發(fā),自定義的事件就需要人工觸發(fā)。dispatchEvent 函數(shù)就是用來觸發(fā)某個事件:

element.dispatchEvent(customEvent);

上面代碼表示,在 element 上面觸發(fā) customEvent 這個事件。結合起來用就是:

// add an appropriate event listener

obj.addEventListener("cat", function(e) { process(e.detail) });

// create and dispatch the event

var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}});

obj.dispatchEvent(event);

使用自定義事件需要注意兼容性問題,而使用 jQuery 就簡單多了:

// 綁定自定義事件

$(element).on('myCustomEvent', function(){});

// 觸發(fā)事件

$(element).trigger('myCustomEvent');

此外,你還可以在觸發(fā)自定義事件時傳遞更多參數(shù)信息:

$( "p" ).on( "myCustomEvent", function( event, myName ) {

 $( this ).text( myName + ", hi there!" );

});

$( "button" ).click(function () {

 $( "p" ).trigger( "myCustomEvent", [ "John" ] );

});

JavaScript 自定義事件就是有別于如 click, submit 等標準事件的自行定制的事件,在敘述自定義事件有何好處之前,先來看一個自定義事件的例子:

<div id="testBox"></div>

// 創(chuàng)建事件

var evt = document.createEvent('Event');

// 定義事件類型

evt.initEvent('customEvent', true, true);

// 在元素上監(jiān)聽事件

var obj = document.getElementById('testBox');

obj.addEventListener('customEvent', function(){

  console.log('customEvent 事件觸發(fā)了');

}, false);

具體效果可以查看 Demo,在 console 中輸入 obj.dispatchEvent(evt),可以看到 console 中輸出“customEvent 事件觸發(fā)了”,表示自定義事件成功觸發(fā)。

在這個過程中,createEvent 方法創(chuàng)建了一個空事件 evt,然后使用 initEvent 方法定義事件的類型為約定好的自定義事件,再對相應的元素進行監(jiān)聽,接著,就是使用 dispatchEvent 觸發(fā)事件了。

沒錯,自定義事件的機制如普通事件一樣——監(jiān)聽事件,寫回調操作,觸發(fā)事件后執(zhí)行回調。但不同的是,自定義事件完全由我們控制觸發(fā)時機,這就意味著實現(xiàn)了一種 JavaScript 的解耦。我們可以把多個關聯(lián)但邏輯復雜的操作利用自定義事件的機制靈活地控制好。

當然,可能你已經(jīng)猜到了,上面的代碼在低版本的 IE 中并不生效,事實上在 IE8 及以下版本的 IE 中并不支持 createEvent(),而有 IE 私有的 fireEvent() 方法,但遺憾的是,fireEvent 只支持標準事件的觸發(fā)。因此,我們只能使用一個特殊而簡單的方法觸發(fā)自定義事件。

// type 為自定義事件,如 type = 'customEvent',callback 為開發(fā)者實際定義的回調函數(shù)

obj[type] = 0;

obj[type]++;

obj.attachEvent('onpropertychange', function(event){

  if( event.propertyName == type ){

    callback.call(obj);

  }

});

這個方法的原理實際上是在 DOM 中增加一個自定義屬性,同時監(jiān)聽元素的 propertychange 事件,當 DOM 的某個屬性的值發(fā)生改變時就會觸發(fā) propertychange 的回調,再在回調中判斷發(fā)生改變的屬性是否為我們的自定義屬性,若是則執(zhí)行開發(fā)者實際定義的回調。從而模擬了自定義事件的機制。

為了使到自定義事件的機制能配合標準事件的監(jiān)聽和模擬觸發(fā),這里給出一個完整的事件機制,這個機制支持標準事件和自定義事件的監(jiān)聽,移除監(jiān)聽和模擬觸發(fā)操作。需要注意的是,為了使到代碼的邏輯更加清晰,這里約定自定義事件帶有 'custom' 的前綴(例如:customTest,customAlert)。

/**

 * @description 包含事件監(jiān)聽、移除和模擬事件觸發(fā)的事件機制,支持鏈式調用

 *

 */

(function( window, undefined ){

var Ev = window.Ev = window.$ = function(element){

  return new Ev.fn.init(element);

};

// Ev 對象構建

Ev.fn = Ev.prototype = {

  init: function(element){

    this.element = (element && element.nodeType == 1)? element: document;

  },

  /**

   * 添加事件監(jiān)聽

   * 

   * @param {String} type 監(jiān)聽的事件類型

   * @param {Function} callback 回調函數(shù)

   */

  add: function(type, callback){

    var _that = this;

    if(_that.element.addEventListener){

      /**

       * @supported For Modern Browers and IE9+

       */

      _that.element.addEventListener(type, callback, false);

    } else if(_that.element.attachEvent){

      /**

       * @supported For IE5+

       */

      // 自定義事件處理

      if( type.indexOf('custom') != -1 ){

        if( isNaN( _that.element[type] ) ){

          _that.element[type] = 0;

        } 

        var fnEv = function(event){

          event = event ? event : window.event

          if( event.propertyName == type ){

            callback.call(_that.element);

          }

        };

        _that.element.attachEvent('onpropertychange', fnEv);

        // 在元素上存儲綁定的 propertychange 的回調,方便移除事件綁定

        if( !_that.element['callback' + callback] ){

          _that.element['callback' + callback] = fnEv;

        }

      // 標準事件處理

      } else {

        _that.element.attachEvent('on' + type, callback);

      }

    } else {

      /**

       * @supported For Others

       */

      _that.element['on' + type] = callback;

    }

    return _that;

  },

  /**

   * 移除事件監(jiān)聽

   * 

   * @param {String} type 監(jiān)聽的事件類型

   * @param {Function} callback 回調函數(shù)

   */

  remove: function(type, callback){

    var _that = this;

    if(_that.element.removeEventListener){

      /**

       * @supported For Modern Browers and IE9+

       */

      _that.element.removeEventListener(type, callback, false);

    } else if(_that.element.detachEvent){

      /**

       * @supported For IE5+

       */

      // 自定義事件處理

      if( type.indexOf('custom') != -1 ){

        // 移除對相應的自定義屬性的監(jiān)聽

        _that.element.detachEvent('onpropertychange', _that.element['callback' + callback]);

        // 刪除儲存在 DOM 上的自定義事件的回調

        _that.element['callback' + callback] = null;

      // 標準事件的處理

      } else {

        _that.element.detachEvent('on' + type, callback);

      }

    } else {

      /**

       * @supported For Others

       */

      _that.element['on' + type] = null;

    }

    return _that;

  },

  /**

   * 模擬觸發(fā)事件

   * @param {String} type 模擬觸發(fā)事件的事件類型

   * @return {Object} 返回當前的 Kjs 對象

   */

  trigger: function(type){

    var _that = this;

    try {

        // 現(xiàn)代瀏覽器

      if(_that.element.dispatchEvent){

        // 創(chuàng)建事件

        var evt = document.createEvent('Event');

        // 定義事件的類型

        evt.initEvent(type, true, true);

        // 觸發(fā)事件

        _that.element.dispatchEvent(evt);

      // IE

      } else if(_that.element.fireEvent){

        if( type.indexOf('custom') != -1 ){

          _that.element[type]++;

        } else {

          _that.element.fireEvent('on' + type);

        }

      }

    } catch(e){

    };

    return _that;

  }

}

Ev.fn.init.prototype = Ev.fn;

})( window );

測試用例1(自定義事件測試)

// 測試用例1(自定義事件測試)

// 引入事件機制

// ...

// 捕捉 DOM

var testBox = document.getElementById('testbox');

// 回調函數(shù)1

function triggerEvent(){

    console.log('觸發(fā)了一次自定義事件 customConsole');

}

// 回調函數(shù)2

function triggerAgain(){

    console.log('再一次觸發(fā)了自定義事件 customConsole');

}

// 封裝

testBox = $(testBox);

// 同時綁定兩個回調函數(shù),支持鏈式調用

testBox.add('customConsole', triggerEvent).add('customConsole', triggerAgain);

完整的代碼在 Demo。

打開 Demo 后,在 console 中調用 testBox.trigger('customConsole') 自行觸發(fā)自定義事件,可以看到 console 輸出兩個提示語,再輸入 testBox.remove('customConsole', triggerAgain) 移除對后一個監(jiān)聽,這時再使用 testBox.trigger('customConsole') 觸發(fā)自定義事件,可以看到 console 只輸出一個提示語,即成功移除后一個監(jiān)聽,至此事件機制所有功能正常工作。

更多信息請查看網(wǎng)絡編程
易賢網(wǎng)手機網(wǎng)站地址:詳解JavaScript中的自定義事件編寫

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網(wǎng)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美激情网友自拍| 久久久久网址| 国产午夜精品久久| 国产欧美日韩伦理| 激情丁香综合| 亚洲天堂av在线免费| 欧美亚洲在线播放| 欧美风情在线| 国产精品日韩欧美一区| 在线精品高清中文字幕| 亚洲香蕉视频| 欧美极品aⅴ影院| 在线精品亚洲| 久久疯狂做爰流白浆xx| 欧美日韩综合一区| 日韩视频二区| 欧美二区在线观看| 亚洲激情综合| 久久精品视频免费播放| 国产女人水真多18毛片18精品视频| 亚洲国产日韩一区二区| 久久精品日韩欧美| 国产亚洲精品福利| 欧美自拍偷拍| 国产一区二区av| 香蕉久久夜色精品国产使用方法| 欧美三级日本三级少妇99| 伊人色综合久久天天| 欧美日韩一级黄| 免费成人高清视频| 国产一区二区三区日韩欧美| 欧美一区二区私人影院日本| 国内精品模特av私拍在线观看| 亚洲欧美一区在线| 一区二区三区在线不卡| 久久久久9999亚洲精品| 亚洲国产精品悠悠久久琪琪| 欧美成人午夜激情视频| 亚洲一区二区三区视频| 国产亚洲精品福利| 欧美成人久久| 午夜久久久久久| 亚洲日本理论电影| 国产模特精品视频久久久久| 欧美成人激情视频免费观看| 亚洲伊人久久综合| 亚洲国产精品悠悠久久琪琪| 欧美三级小说| 欧美男人的天堂| 久久免费一区| 欧美国产在线电影| 亚洲视频专区在线| 一本色道久久88综合亚洲精品ⅰ | 亚洲精品社区| 国产精品成人一区二区网站软件| 一区二区三区**美女毛片| 欧美日韩亚洲综合一区| 午夜久久电影网| 中文高清一区| 一本色道久久综合亚洲精品不| 欧美日韩综合视频| 日韩视频二区| 国产精品高清在线观看| 一区二区三区不卡视频在线观看| 国产综合色在线视频区| 亚洲乱码精品一二三四区日韩在线 | 牛牛影视久久网| 亚洲影视综合| 一区二区三区精品国产| 亚洲精品少妇30p| 亚洲高清在线观看一区| 国产欧美一区二区三区国产幕精品 | 欧美三级乱人伦电影| 欧美日韩午夜| 久久精品欧美日韩精品| 久久婷婷丁香| 欧美日韩中文| 国内精品久久久久久久影视蜜臀| 在线观看日韩av电影| 亚洲激情在线播放| 亚洲小说春色综合另类电影| 亚洲欧美激情在线视频| 久久免费黄色| 欧美日韩国语| 亚洲黄色免费电影| 国产精品网曝门| 亚洲精品偷拍| 欧美另类一区二区三区| 国产精品日韩欧美一区| 在线免费日韩片| 亚洲主播在线播放| 亚洲一区三区视频在线观看| 欧美日韩1区2区| 国内精品久久国产| 国产日韩欧美自拍| 亚洲精品国产精品国自产在线| 一区二区三区四区五区在线| 免费看av成人| 欧美日产一区二区三区在线观看 | 亚洲欧美日韩国产精品| 性欧美大战久久久久久久久| 欧美日韩激情小视频| 欧美色123| 在线一区日本视频| 欧美视频中文在线看| 午夜精品一区二区三区电影天堂 | 午夜免费久久久久| 欧美三级午夜理伦三级中文幕| 一区二区三区国产| 欧美性猛交xxxx乱大交蜜桃| 一区电影在线观看| 欧美视频成人| 欧美一区二区三区免费大片| 国产精品看片资源| 亚洲午夜极品| 国产在线精品一区二区夜色| 久久久精品一区二区三区| 国产一区二区三区在线观看网站| 亚洲一区二区av电影| 国产欧美精品日韩区二区麻豆天美| 性欧美1819sex性高清| 在线电影一区| 欧美色123| 老司机免费视频一区二区三区| 日韩一级精品| 国产一区二区三区丝袜| 美女亚洲精品| 午夜一级在线看亚洲| 亚洲免费av网站| 国产精品亚洲美女av网站| 欧美一区激情视频在线观看| 亚洲激情在线播放| 国产一区二区三区四区在线观看| 久久综合激情| 欧美一区二区三区喷汁尤物| 99综合在线| 日韩视频中文字幕| 亚洲高清免费在线| 久久久久国内| 亚洲自拍啪啪| 一区二区三区高清不卡| 亚洲区国产区| 在线观看日产精品| 一区在线观看| 国产亚洲一级高清| 国产亚洲精品资源在线26u| 国产欧美69| 国产区在线观看成人精品| 欧美性猛片xxxx免费看久爱| 欧美精品色综合| 欧美色图五月天| 国产一区二区三区久久久| 国产精品网站在线| 国产精品每日更新在线播放网址| 欧美精品一区在线播放| 欧美成人亚洲成人| 欧美高清视频在线播放| 欧美大片免费看| 欧美激情一区二区在线 | 中文一区字幕| 亚洲精品国产精品国自产在线| 一区二区亚洲欧洲国产日韩| 在线成人亚洲| 亚洲激情一区二区| 夜夜嗨一区二区| 欧美一级视频| 美女视频黄a大片欧美| 欧美日韩在线第一页| 国产日韩欧美成人| 91久久国产综合久久91精品网站| 亚洲精品无人区| 亚洲免费网站| 欧美激情亚洲| 红桃视频欧美| 亚洲一区二区黄| 欧美高清免费| 黄色成人免费观看| 国产精品99久久久久久宅男 | 久久久久久亚洲精品杨幂换脸| 久久国内精品自在自线400部| 欧美阿v一级看视频| 狠狠色丁香久久婷婷综合丁香| 亚洲视频在线观看一区| 久久久一二三| 国产一区二区你懂的| 亚洲综合导航| 欧美精品亚洲一区二区在线播放| 国产欧美亚洲视频| 欧美影院成年免费版| 国产精品日韩一区二区| 最新日韩在线| 久久婷婷激情| 一区二区视频免费完整版观看| 欧美中文字幕精品| 国产伊人精品| 久久九九全国免费精品观看| 国产伦精品一区二区三区视频黑人 | 亚洲高清不卡| 久久综合影视| 亚洲国产欧洲综合997久久|