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

首頁 > 語言 > JavaScript > 正文

Javascript添加監聽與刪除監聽用法詳解

2024-05-06 16:12:29
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Javascript添加監聽與刪除監聽用法,較為詳細的分析了javascript原理與用法,并補充說明了事件監聽的兼容性問題,非常具有實用價值,需要的朋友可以參考下
 
 

本文實例講述了Javascript添加監聽與刪除監聽的用法。分享給大家供大家參考。具體分析如下:

js中事件監聽就是利用addEventListener來綁定一個事件,這個用法在jquery中非常常用并且簡單,但在原生js中比較復雜,這里整理了addEventListener事件各方法的測試與例子供大家參考學習。

在前兩天做播放器的時候添加監聽后刪除監聽遇到了一點麻煩,刪不掉,后來看了一下才發現,參數需要完全對應,什么叫完全對應呢,換句話說:

復制代碼代碼如下:
$('.video')[0].addEventListener('timeupdate', currentTimeHandler, true);

比如這句,需要傳入三個參數,這樣才能夠刪除,為什么一定要這樣,沒錯,蛋疼的地方就在這里:
在add和remove時,第三個參數確實可以不寫,但此時他們的默認情況是不一樣的?。?

 

通常情況下addEventListener是false…
1、 添加自定義事件監聽

復制代碼代碼如下:
var eventHandlesCounter=1;//統計添加事件監聽的個數,0作為預留位
    function addEvent(obj,evt,fn){
       if(!fn.__EventID){ fn.__EventID=eventHandlesCounter++;}
       if(!obj.__EventHandles){ obj.__EventHandles=[]; }
       if(!obj.__EventHandles[evt]){
           obj.__EventHandles[evt]=[];
           if(obj["on"+evt] instanceof Function){
              obj.__EventHandles[evt][0]=obj["on"+evt];
              obj["on"+evt]=handleEvents;
           }
       }
       obj.__EventHandles[evt][fn.__EventID]=fn;
 
       function handleEvents(){
         var fns = obj.__EventHandles[evt];
         for (var i=0;i<fns.length;i++)
            fns[i].call(this);
       }
}

2、自定義刪除事件監聽
復制代碼代碼如下:
function delEvent(obj,evt,fn){
   if(!obj.__EventHandles || !obj.__EventHandles[evt] || !fn.__EventID){
      return false;
   }
   if(obj.__EventHandles[evt][fn.__EventID]==fn){
      delete obj.__EventHandles[evt][fn.__EventID];
   }
}

3. 對上述方法進行修正
復制代碼代碼如下:
function addEvent(obj,evt,fn,useCapture){
    if(obj.addEventListener){//優先使用W3C事件注冊
       obj.addEventListener(evt,fn,!!useCapture);
    }else{
       if(!fn.__EventID){fn.__EventID = addEvent.__EventHandlesCounter++;}
       if(!obj.__EventHandles){ obj.__EventHandles=[];}
       if(!obj.__EventHandles[evt]){
           obj.__EventHandles[evt]=[];
           if(obj["on"+evt]){
              (obj.__EventHandles[evtype][0]=obj["on"+evtype]).__EventID=0;
           }
           obj["on"+evtype]=addEvent.execEventHandles;
       }
    }
}
addEvent.__EventHandlesCounter=1;
addEvent.execEventHandles = function(evt){
    if(!this.__EventHandles) {return true;}
    evt = evt || window.event;
    var fns = this.__EventHandles[evt.type];
    for (var i=0;i<fns.length;i++){
       if(fns[i] instanceof Function){
           fns[i].call(this);
       }
    }
};
function delEvent(obj,evt,fn,useCapture){
   if (obj.removeEventListener) {//先使用W3C的方法移除事件處理函數         
       obj.removeEventListener(evt,fn,!!useCapture);
   }else {
      if(obj.__EventHandles){
         var fns = obj.__EventHandles[evt];
         if(fns){delete fns[fn.__EventID];}
      }
}

4、標準化事件對象
復制代碼代碼如下:
function fixEvent(evt){
   if(!evt.target){
      evt.target = evt.srcElement;
      evt.preventDefault=fixEvent.preventDefault;
      evt.stopPropagation = fixEvent.stopPropagation;
      if(evt.type == "mouseover"){
         evt.relatedTarget = evt.fromElement;
      }else if(evt.type == "mouseout"){
         evt.relatedTarget = evt.toElement;
      }
      evt.charCode =(evt.type == "keypress")?evt.keyCode:0;
      evt.eventPhase = 2;
      evt.timeStamp = (new Date()).getTime();
   }
return evt;
}
fixEvent.preventDefault=function(){ this.returnValue=false;}
fixEvent.stopPropagation=function(){this.cancelBubble = true;};

 

fixEvent函數不是單獨執行的,它必須有一個事件對象參數,而且只有事件發生時它才被執行!最好的方法是把它整合到addEvent函數的execEventHandles里面。

復制代碼代碼如下:
addEvent.execEventHandles = function (evt) {//遍歷所有的事件處理函數并執行
if (!this.__EventHandles) {return true;}
evt = fixEvent(evt || window.event);//在這里對其進行標準化操作
var fns = this.__EventHandles[evt.type];
for (var i=0;i< fns.length;i++) {
if (fns[i] instanceof Function) {
fns[i].call(this,evt);//并且將其作為事件處理函數的第一個參數
//這樣在事件處理函數內部就可以使用統一的方法訪問事件對象了 } } };

 

上面是高手寫了,下面整理幾個實際的監聽事情的例子

復制代碼代碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>test6.html</title>
 <script type="text/javascript">
  function test(){
   window.alert("您投了一次票");
   document.getElementById("1").detachEvent("onclick",test);
  }
 </script>
  </head>
  
  <body>
    <input type="button" value="投票" id="1"/>
    <script type="text/javascript">
     document.getElementById("1").attachEvent("onclick",test);
    </script>
  </body>
</html>

這里使用document.getElementById("1").attachEvent("onclick",test);進行動態的事件綁定,使用
復制代碼代碼如下:

document.getElementById("1").detachEvent("onclick",test)
進行動態的時間的取消,這樣就實現了這個事件只能相應一次,下次再點擊這個按鈕的時候就不會再產生什么效果。 
下面再演示一個時時監聽鍵盤事件,判斷輸入的是否是數字,如果不是數字直接動態提示,然后拒絕其輸入
復制代碼代碼如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>test7.html</title>
 <script type="text/javascript">
  function test(event){
   //用戶每按下一個按鍵,就去判斷是不是數字
   if(event.keyCode<48 || event.keyCode > 57){
    window.alert("您輸入的不是一個數字");
    return false;
   }
  }
 </script>
  </head>
  
  <body>
    <input type="text" onkeypress="return test(event);" />請輸入數字
  </body>
</html>

這里的event就是一個事件對象,他能返回很多的信息,具體請參考相關文檔。
 
補充:事件監聽方面的兼容

 

1. IE使用attachEvent/detachEvent方法來添加和刪除事件監聽器;w3c使用addEventListener/removeEventListener方法。
2. IE對其事件使用onevent的命名方式,而w3c的是event的命名方式。
3. IE事件監聽器內使用的是一個全局的Event對象,而w3c是將event對象作為參數傳遞給監聽器。
4. 為了避免觸發默認的事件行為,IE的做法是要求程序員設置Event對象中的returnValue屬性值為false,而w3c的做法是執行preventDefault方法。
5. IE沒有提供對事件捕獲階段的支持。
6. 要停止事件的傳遞,IE的做法是設置event對象的cancelBubble為true,而w3c的做法是設置執行stopPropagation方法。
7. IE將事件監聽器當做一個獨立的函數來調用,而w3c中它是作為對象的方法來調用的,這表示在ie中事件監聽器中的this關鍵字指向的不是事件發生對象而是一個沒用的全局對象(window對象)。
8. IE在使用事件監聽器方面存在內存泄露問題。在IE瀏覽器中,如果要為某個元素創建一個事件監聽器,并且在監聽器中使用該元素,則在用戶進入其他頁面之前,該監聽器以及相關的DOM節點作占據的內存空間不會被釋放。

希望本文所述對大家的javascript程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久97| 欧美丰满少妇xxxx| 亚洲老板91色精品久久| 亚洲欧美成人一区二区在线电影| 欧美日韩中文在线观看| 亚洲欧美国产制服动漫| 国产成人精品a视频一区www| 国产精品亚洲视频在线观看| 尤物精品国产第一福利三区| 成人黄色免费在线观看| 亚洲国产成人精品电影| 亚洲无av在线中文字幕| 欧美中文字幕在线播放| 日本欧美国产在线| 性欧美办公室18xxxxhd| 91久久精品久久国产性色也91| 欧美日韩综合视频| 亚洲欧美日韩图片| 亚洲天堂男人的天堂| 国产成人精品日本亚洲专区61| 一区二区三区动漫| 欧洲亚洲在线视频| 亚洲国内精品视频| 78m国产成人精品视频| 久久精品视频在线播放| 国产日韩在线一区| 韩国国内大量揄拍精品视频| 成人a级免费视频| yw.139尤物在线精品视频| 成人精品一区二区三区电影黑人| 92裸体在线视频网站| 亚洲免费伊人电影在线观看av| www亚洲精品| 中文字幕日韩欧美在线视频| 曰本色欧美视频在线| 日本一区二区三区四区视频| 亚洲一区二区久久久久久久| 91国在线精品国内播放| 日韩影视在线观看| 麻豆乱码国产一区二区三区| 亚洲四色影视在线观看| 欧美日韩国产精品专区| 欧美性xxxxx极品| 中文字幕亚洲自拍| 精品精品国产国产自在线| 一本大道亚洲视频| 欧美电影院免费观看| 日韩免费观看网站| 在线视频日本亚洲性| 国产美女久久精品| 欧美国产日韩一区二区| 97国产在线观看| 亚洲视频999| 亚洲最大在线视频| 色综合色综合久久综合频道88| 日韩天堂在线视频| 一区二区三区动漫| 色悠悠国产精品| 国产精品夜色7777狼人| 亚洲日本中文字幕免费在线不卡| 欧美亚洲视频在线看网址| 欧美大片va欧美在线播放| 精品国产一区二区三区久久久| 九九久久精品一区| 美女福利精品视频| 久久精品视频在线| 成人精品在线视频| 亚洲图中文字幕| 日韩电影免费在线观看中文字幕| 亚洲国产欧美一区二区三区久久| 国产亚洲精品久久久久久牛牛| 国产一区二区丝袜高跟鞋图片| 亚洲社区在线观看| 91在线无精精品一区二区| 欧美精品18videos性欧| 国产在线拍偷自揄拍精品| 国产精品pans私拍| 日韩亚洲欧美中文在线| 国产成人aa精品一区在线播放| 欧美性xxxx极品hd欧美风情| 亚洲国产私拍精品国模在线观看| 怡红院精品视频| 日本一区二区在线播放| 丝袜一区二区三区| 日韩免费在线观看视频| 午夜精品久久久久久久99热浪潮| 欧美—级高清免费播放| 插插插亚洲综合网| 中文字幕日韩有码| 97色在线视频| 精品无码久久久久久国产| 日韩欧美福利视频| 亚洲男人天堂古典| 国产精品视频一区二区三区四| 欧美肥老太性生活视频| 亚洲综合在线中文字幕| 黄色成人av网| 97婷婷大伊香蕉精品视频| 久久av资源网站| 亚洲成人黄色网址| 国内伊人久久久久久网站视频| 日韩午夜在线视频| 日韩在线欧美在线国产在线| 国产精品高潮视频| 国产精品久久久久久超碰| 精品国产依人香蕉在线精品| 日韩女优人人人人射在线视频| 亚洲亚裔videos黑人hd| 欧洲亚洲在线视频| 亚洲成人av中文字幕| 91精品久久久久久久久中文字幕| 亚洲国产欧美久久| 欧美在线免费看| 久久影院中文字幕| 富二代精品短视频| 亚洲自拍偷拍一区| 黑人极品videos精品欧美裸| 欧美激情手机在线视频| 精品自拍视频在线观看| 日韩精品免费在线播放| 中文字幕精品久久久久| 日本不卡免费高清视频| 亚洲精品自拍视频| 国模私拍视频一区| 国产精品高清网站| 性夜试看影院91社区| 精品国产精品三级精品av网址| 亚洲人成电影网站色xx| 亚洲香蕉成视频在线观看| 久久九九有精品国产23| 亚洲国产精品999| 久久视频在线直播| 国产欧亚日韩视频| 亚洲国产成人精品一区二区| 日韩欧美一区二区三区| 欧亚精品在线观看| 九九精品视频在线| 91精品久久久久久久久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久电影观看| 国产成人鲁鲁免费视频a| 久久久久久久色| 成人黄色影片在线| 91久热免费在线视频| 日本精品久久久久久久| 亚洲国产91精品在线观看| 欧美一级淫片丝袜脚交| 国产亚洲精品综合一区91| 久久久久久久91| xvideos成人免费中文版| 亚洲精品自拍视频| 欧美—级高清免费播放| 97在线视频精品| 色偷偷88888欧美精品久久久| 国产91免费看片| 久久成年人视频| 精品亚洲va在线va天堂资源站| 亚洲女同性videos| 日韩在线中文字幕| 中文字幕精品在线视频| 久久影视三级福利片| 欧美日韩黄色大片| 国产午夜精品全部视频播放| 亚洲高清一区二|