js事件監聽,捕獲及冒泡


一,監聽相關:

1.綁定HTML元素屬性:

<input type="button" value="clickMe" onclick="check(this)">

 

2.綁定DOM

document.getElementById("xxx").onclick

 

3.IE中的監聽方法:

[object].attachEvent("事件類型","處理函數");//添加監聽
[object].detachEvent("事件類型","處理函數");//取消監聽

如:

window.onload=function(){//當整個HTML文檔加載好之后就會觸發onload事件
   document.getElementById("test1").attachEvent("onclick",show);//給第一個按鈕注冊了onclick事件
       document.getElementById("test2").onclick=function(){//解除第一個按鈕的onclick事件
       document.getElementById("test1").detachEvent("onclick",show);
   }
};

4.標准DOM中的事件監聽方法:

[object].addEvent("事件類型","處理函數","冒泡事件或捕獲事件");
[object].removeEvent("事件類型","處理函數","冒泡事件或捕獲事件");

 

addEventListener()方法特點:

  1. element.addEventListener(event, function, useCapture)中的第三個參數可以控制指定事件是否在捕獲或冒泡階段執行。true - 事件句柄在捕獲階段執行。false- 默認- 事件句柄在冒泡階段執行。

  2. addEventListener() 可以給同一個元素綁定多個事件,不會發生覆蓋的情況。如果給同一個元素綁定多個事件,那么采用先綁定先執行的規則。

  3. addEventListener() 在綁定事件的時候,事件名稱之前不需帶 on

  4. 注意該方法的兼容性,如果要兼容 IE6-8 ,不能使用該方法。下面三會有介紹。

  5. 可以使用 removeEventListener() 來移除之前綁定過的事件。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>DOM事件監聽</title>

  </head>
  <body>
    <input type="button" id="test1" value="測試1">
    <button type="button" id="test2"><b>測試2</b></button>

    <script type="text/javascript">
      function show(){
        alert("hello");
      }

      window.onload=function(){
        var test1=document.getElementById("test1");
        var test2=document.getElementById("test2");
        test1.addEventListener("click", show, false);//給第一個按鈕注冊了onclick事件
        /*test2.onclick=function(){//解除第一個按鈕的onclick事件(方法一)
          test1.removeEventListener("click", show, false);
        }*/
        test2.addEventListener("click", function(){//解除第一個按鈕的onclick事件(方法二)
          test1.removeEventListener("click", show, false);
        }, false);
      }
    </script>

  </body>
</html>

參考:https://www.jianshu.com/p/2c2d0b8f210f

 

二,工具集:

// event(事件)工具集,來源:github.com/markyun markyun.Event = { // 頁面加載完成后 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = fn; } else { window.onload = function() { oldonload(); fn(); }; } }, // 視能力分別使用dom0||dom2||IE方式 來綁定事件 // 參數: 操作的元素,事件名稱 ,事件處理程序 addEvent : function(element, type, handler) { if (element.addEventListener) { //事件類型、需要執行的函數、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function() { handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent : function(element, type, handler) { if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else if (element.datachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,因為IE不支持事件捕獲) stopPropagation : function(ev) { if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默認行為 preventDefault : function(event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, // 獲取事件目標 getTarget : function(event) { return event.target || event.srcElement; }, // 獲取event對象的引用,取到事件的所有信息,確保隨時能使用event; getEvent : function(e) { var ev = e || window.event; if (!ev) { var c = this.getEvent.caller; while (c) { ev = c.arguments[0]; if (ev && Event == ev.constructor) { break; } c = c.caller; } } return ev; } };

 

三,on和addEventListener的使用與不同

1.on事件會被后面的on的事件覆蓋

以onclick為例:

//obj是一個dom對象,下同
//注冊第一個點擊事件
obj.onclick(function(){
alert("hello world");
});
//注冊第二個點擊事件
obj.onclick(function(){
alert("hello world too");
});

最終會只有彈框輸出:
hello world too
 
2.addEventListener 則不會覆蓋

//注冊第一個點擊事件
obj.addEventListener("click",function(){
alert("hello world");
}));
//注冊第二個點擊事件
obj.addEventListener("click",function(){
alert("hello world too");
}));

這樣會連續輸出:
hello world
hello world too
 
addEventListener注意事項:
1.特別說明addEventListener不被 IE9以下兼容,IE9以下用使用 attachEvent()
obj.attachEvent(event,funtionName);
參數:
event:事件類型(需要寫成“onclick”前面加on,這個與addEventListener不同)
funtionName:方法名(要參數是也是需要使用匿名函數來傳參)
 
四.事件集合:
1.鼠標事件:
  • click(單擊)
  • dbclick(雙擊)
  • mousedown(鼠標按下)
  • mouseout(鼠標移走) 
  • mouseover(鼠標移入)
  • mouseup(鼠標彈起)
  • mousemove(鼠標移動)
2.鍵盤事件:
  • keydown(鍵按下)
  • keypress(按鍵)
  • keyup(鍵起來)
3.HTML事件:
  • load(加載頁面) 
  • unload(卸載離開頁面)
  • change(改變內容)
  • scroll(滾動)  
  • focus(獲得焦點)
  • blur(失去焦點)

參考:http://www.cnblogs.com/Ry-yuan/p/6865632.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM