所有在DOM中发生事件的相关信息都会补收集并存储在一个名为 event 的对象中。
信息包含

  • 基本信息
    • 导致事件元素
    • 发生事件类型
    • 可能与特定事件相关其它数据

      DOM 事件对象

      event对象是传给事件处理程序的唯一参数,无论DOM0 或 DOM2
      1. let btn = document.getElementById("myBtn");
      2. btn.onclick = function(event) {
      3. console.log(event.type); // "click"
      4. };
      5. btn.addEventListener("click", (event) => {
      6. console.log(event.type); // "click"
      7. }, false);

公共属性和方法
image.png
image.png
使用 event.type 可以让处理函数用于处理多种不同的事件

  1. let btn = document.getElementById("myBtn");
  2. let handler = function(event) {
  3. switch(event.type) {
  4. case "click":
  5. console.log("Clicked");
  6. break;
  7. case "mouseover":
  8. event.target.style.backgroundColor = "red";
  9. break;
  10. case "mouseout":
  11. event.target.style.backgroundColor = "";
  12. break;
  13. }
  14. };
  15. btn.onclick = handler;
  16. btn.onmouseover = handler;
  17. btn.onmouseout = handler;
  • 阻止默认行为
    • preventDefault()
  • 取消冒泡事件
    1. stopPropagation()
  • eventPhase 可以确定事件流当前所在阶段
    • 事件处理程序在捕获阶段被调用 1
    • 事件处理程序在目标上被调用 2
      • 此时 this、target 和 currentTaget 三者相等
    • 事件处理程序在冒泡阶段被调用 3

event对象只在事件处理程序执行期间存在,一旦执行完毕,就会被销毁

IE 事件对象

与DOM事件对象不同,IE事件对象可以基于事件处理程序被指定的方式以不同方式来访问。

  • 如果事件处理程序使用DOM0方式,则 event 对象中是 window 对象的一个属性。
  • 使用 attachEvent() 时,event对象仍然是 window 对象的属性对象,只是出于方便也将其作为参数传入。

公共属性和方法
image.pngimage.png

  • 阻止默认行为
    • window.event.returnValue = false;
  • 取消冒泡事件

    • window.event.cancelBubble = true

      跨浏览器事件对象

  • 取消默认事件

    1. 句柄方式 return false;
      1. 只能用于句柄方式,addEventListener不行
      2. 兼容性最好
    2. e.preventDefault();
      1. W3C标准
      2. IE9

    3. e.returnValue=false
      1. IE
  • 对于阻止a标签默认事件
    1. href=’#’
    2. href=’javascript:void(0);’
    3. href=’javascript:;’
    4. e.preventDefault
  • 事件源对象

    • target
      • FireFox / Chrome
    • srcElement
      • IE / Chrome
        1. function(e){
        2. var tar = e.target || e.srcElement
        3. }
  • event对象获取

    1. a.addEventListenter('click', function(ev){
    2. var e = ev || window.event;
    3. })


    取消冒泡事件

    1. function cancelBubble(ev){
    2. var e = ev || window.event;
    3. if(e.stopPropagation){
    4. e.stopPropagation();
    5. }else{
    6. e.cancelBubble = true;
    7. }
    8. }

    EventUtil

    1. var EventUtil = {
    2. addHandler: function(element, type, handler) {
    3. if(element.addEventListener) {
    4. element.addEventListener(type, handler, false);
    5. } else if (element.attachEvent) {
    6. element.attachEvent("on" + type, handler);
    7. } else {
    8. el["on" + type] = handler;
    9. }
    10. },
    11. getEvent: function(event) {
    12. return event ? event : window.event;
    13. },
    14. getTarget: function(event) {
    15. return event.target || event.srcElement;
    16. },
    17. preventDefault: function(event) {
    18. if (event.preventDefault) {
    19. event.preventDefault();
    20. } else {
    21. event.returnValue = false;
    22. }
    23. },
    24. removeHandler: function(element, type, handler) {
    25. if(element.removeEventListener) {
    26. element.removeEventListener(type, handler, false);
    27. } else if (element.dettachEvent) {
    28. element.dettachEvent("on" + type, handler);
    29. } else {
    30. el["on" + type] = null;
    31. }
    32. }
    33. stopPropagation: function(event) {
    34. if (event.stopPropagation) {
    35. event.stopPropagation();
    36. } else {
    37. event.cancelBubble = true;
    38. }
    39. }
    40. }