亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript的事件觸發器介紹的實現

2019-11-20 14:51:58
字體:
來源:轉載
供稿:網友

事件觸發器從字面意思上可以很好的理解,就是用來觸發事件的,但是有些沒有用過的朋友可能就會迷惑了,事件不是通常都由用戶在頁面上的實際操作來觸發的嗎?這個觀點不完全正確,因為有些事件必須由程序來實現,如自定義事件,jQuery的ajax框架的一些自定義事件就必須由事件觸發器來實現。當然,在一些特殊情況下,用事件觸發器來觸發事件比用戶的實際操作來觸發事件更方便。

對于實現事件觸發器,瀏覽器都有原生的方法來支持,但是在兼容性上又有很大的出入,這種兼容性的問題完全在意料之中,IE有自己的方法,其他標準瀏覽器也有一套方法,不說誰的方法好與不好,對于WEB開發者來說搞出幾套方法就是對開發人員的一種折磨。IE支持fireEvent方法來實現事件觸發,標準瀏覽器支持dispatchEvent來實現事件觸發,兩面派的IE9是兩者都支持。下面是出自prototype.js的源碼(其實我是從司徒正美的博客復制過來的):

復制代碼 代碼如下:

var fireEvent = function(element,event){
 if (document.createEventObject){
  // IE瀏覽器支持fireEvent方法
  var evt = document.createEventObject();
  return element.fireEvent('on'+event,evt)
 }
 else{
  // 其他標準瀏覽器使用dispatchEvent方法
  var evt = document.createEvent( 'HTMLEvents' );
  // initEvent接受3個參數:
  // 事件類型,是否冒泡,是否阻止瀏覽器的默認行為
  evt.initEvent(event, true, true); 
  return !element.dispatchEvent(evt);
 }
};

上面的方法可以兼容主流的瀏覽器以實現事件觸發器的功能。但是對于一些封裝好的事件處理系統,如jQuery的event模塊,就沒這么簡單了,只能通過模擬來實現了。我在之前寫過一個很簡單的事件處理系統,最近又碰到自定義事件的需求,于是在之前的事件系統的基礎上模擬了一個事件觸發器,代碼如下:

復制代碼 代碼如下:

/**
 * 事件觸發器
 * @param { Object } DOM元素
 * @param { String / Object } 事件類型 / event對象
 * @param { Array }  傳遞給事件處理函數的附加參數
 * @param { Boolean } 是否冒泡
 */
trigger : function( elem, event, data, isStopPropagation ){
 var type = event.type || event,
  // 冒泡的父元素,一直到document、window
  parent = elem.parentNode ||
   elem.ownerDocument ||
   elem === elem.ownerDocument && win,
  eventHandler = $.data( elem, type + 'Handler' );

 isStopPropagation = typeof data === 'boolean' ?
  data : (isStopPropagation || false);

 data = data && isArray( data ) ? data : [];

 // 創建自定義的event對象  
 event = typeof event === 'object' ?
  event : {
   type : type,
   preventDefault : noop,
   stopPropagation : function(){
    isStopPropagation = true;
   }
  };

 event.target = elem;  
 data.unshift( event );
 if( eventHandler ){
  eventHandler.call( elem, data );
 }
 // 遞歸調用自身來模擬冒泡
 if( parent && !isStopPropagation ){
  data.shift();
  this.trigger( parent, event, data );
 }
}


模擬的原理并不難,給某元素綁定一個事件處理函數,如果有觸發事件的實際操作就會執行相應的事件處理函數,所以要達到事件觸發器的功能只要獲取到相應的事件處理函數然后執行就差不多了,這是最基本的。

在實際的事件發生時瀏覽器會生成一個event對象,里面包含了一些事件發生時的屬性和信息。如果沒有實際的事件發生是沒有這個event對象的,所以上面的代碼也創建了一個event對象滿足最基本的功能。

還有事件冒泡,如果沒有實際的事件發生,自然也不會有冒泡的行為,那么如果要模擬冒泡的功能,就必須不斷的查找父元素并檢查是否綁定了相同類型的事件,直至到document和window為止,如果結構復雜,這種遞歸調用的方法性能估計會不怎么樣。

最后是瀏覽器的默認行為,我覺得這個要去模擬相當麻煩,麻煩到不知如何去實現,比如a標簽默認的跳轉,我測試了jQuery的trigger,也沒有實現,但是一些其他的行為貌似又在API手冊中有介紹。畢竟這個功能不是很重要,暫時也沒做過多的深究。

 

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩高清欧美高清| 欧美放荡办公室videos4k| 国产欧美一区二区| 国产精品流白浆视频| 日韩欧美999| 国产精品99久久久久久人| 欧美大片网站在线观看| 成人网在线免费看| 久久久久久尹人网香蕉| 国产精品v日韩精品| 国产精品一二三视频| 丝袜亚洲欧美日韩综合| 2019中文字幕全在线观看| 亚洲第一区中文99精品| 色一情一乱一区二区| 一区二区三区www| 亚洲a区在线视频| 国产精品美女在线| 亚洲一区二区三区在线免费观看| 欧美激情喷水视频| 亚洲男人天堂网站| 国产精品91久久| 欧美日韩一区二区在线播放| 成人黄色片在线| 亚洲美女精品成人在线视频| 亚洲精品一区二区三区不| 奇米四色中文综合久久| 夜夜狂射影院欧美极品| 日韩欧美国产网站| 色老头一区二区三区在线观看| 欧美大胆在线视频| 久久91亚洲精品中文字幕奶水| 国产+人+亚洲| 91精品国产91久久久久久最新| 成人久久久久爱| 国产成人激情视频| 97热精品视频官网| 国产日韩欧美在线观看| 精品视频久久久久久久| zzijzzij亚洲日本成熟少妇| 亚洲男人av电影| 97欧美精品一区二区三区| 日韩中文有码在线视频| 国产一区二区动漫| 97超碰色婷婷| 性夜试看影院91社区| 高清视频欧美一级| 国产精品6699| 日韩麻豆第一页| 国产一区二区三区在线观看视频| 91精品国产精品| 欧美一级bbbbb性bbbb喷潮片| 亚洲视频欧洲视频| 国产精品www| 国产视频自拍一区| 欧美日韩国产限制| 欧美一级黄色网| 欧美视频中文字幕在线| 国产精品久久中文| 久久成人18免费网站| 国产日韩在线免费| 日韩电视剧在线观看免费网站| 欧美一级淫片丝袜脚交| 国产亚洲视频在线观看| 91产国在线观看动作片喷水| 亚洲香蕉在线观看| 欧美高清电影在线看| 色无极影院亚洲| 欧美在线免费看| 欧美日韩国产中文精品字幕自在自线| 国产精品96久久久久久又黄又硬| 色偷偷av亚洲男人的天堂| 深夜精品寂寞黄网站在线观看| 午夜精品久久久久久久久久久久| 亚洲人成在线观看网站高清| 亚洲精品720p| 成人深夜直播免费观看| 亚洲国产精品中文| 欧美一级视频免费在线观看| 美女国内精品自产拍在线播放| 久久精品视频中文字幕| 欧洲成人午夜免费大片| 久久影院资源站| 欧美亚洲国产日本| 国产精品自拍小视频| 精品免费在线观看| 国产一区二区三区在线免费观看| 北条麻妃在线一区二区| 成人福利视频在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美日本在线视频中文字字幕| 欧美大成色www永久网站婷| 在线精品国产欧美| 欧美精品生活片| 亚洲精品自产拍| 日韩经典一区二区三区| 午夜精品久久久久久久久久久久| 亚洲精品网址在线观看| 夜夜躁日日躁狠狠久久88av| 国产精品白丝jk喷水视频一区| 俺去啦;欧美日韩| 69影院欧美专区视频| 亚洲mm色国产网站| 久久影视三级福利片| 亚洲大胆美女视频| 久久免费国产精品1| 国产视频精品自拍| 激情久久av一区av二区av三区| 色yeye香蕉凹凸一区二区av| 久久久最新网址| 欧美主播福利视频| 色综合老司机第九色激情| 亚洲深夜福利视频| 91精品国产免费久久久久久| 亚洲第一精品久久忘忧草社区| 91香蕉国产在线观看| 日韩国产欧美精品一区二区三区| 91精品国产综合久久香蕉最新版| 欧美日韩国产专区| 日本道色综合久久影院| 91沈先生作品| 国产欧美日韩视频| 精品视频—区二区三区免费| 国产精品一区av| 欧美激情极品视频| 国产亚洲欧美日韩美女| 自拍偷拍亚洲精品| 色婷婷av一区二区三区久久| 亚洲一区二区久久久久久| 97精品国产97久久久久久| 亚洲人精选亚洲人成在线| 国产九九精品视频| 在线成人一区二区| 亚洲人成电影在线播放| 亚洲精品狠狠操| 精品爽片免费看久久| 粉嫩av一区二区三区免费野| 久久久久久久久久久久av| 欧美日韩高清在线观看| 亚洲第一页中文字幕| 久久久久久成人精品| 久久精品国产综合| 亚洲久久久久久久久久| 97精品欧美一区二区三区| 日韩欧美在线视频观看| 成人乱人伦精品视频在线观看| 国产一区二区三区18| 欧美成人黑人xx视频免费观看| 欧美黑人一区二区三区| 日韩美女免费观看| 亚洲成人亚洲激情| 91色琪琪电影亚洲精品久久| 欧美中文字幕视频在线观看| 在线观看日韩欧美| 久久久综合免费视频| 欧美专区中文字幕| 精品久久久久久久久久| 97久久精品视频| 96pao国产成视频永久免费| 亚洲品质视频自拍网| 亚洲人成电影网站色xx| 国产在线不卡精品| 国产一区二区三区在线播放免费观看| 欧美日韩免费观看中文|