study icon indicating copy to clipboard operation
study copied to clipboard

DOM 事件

Open cfour-hi opened this issue 6 years ago • 0 comments

绑定事件的三种方式

  1. html 内联绑定 onclick 属性

    <div onclick="console.log(1)"></div>
    
  2. js 内设置元素 onclick 属性

    element.onclick = function () {
        console.log(2)
    }
    
  3. 事件绑定规范方法 EventTarget.addEventListener()

    element.addEventListener('click', function () {
        console.log(3)
    }, true/false)
    

知识点

事件的执行顺序

事件的三个阶段:捕获、目标、冒泡

事件的目标元素只有目标阶段,其父元素才有捕获和冒泡阶段。 目标阶段事件的执行顺序是按照事件绑定的顺序执行,即先绑定限执行,其父元素才会遵循捕获和冒泡的阶段规则。 onclick 事件在冒泡阶段执行,与冒泡阶段的 addEventListener 事件执行顺序取决于二者在执行阶段绑定的顺序,即先绑定的先执行。

event.eventPhase 标识事件所处阶段:1 => 捕获阶段2 => 目标阶段3 => 冒泡阶段

阻止事件传播

event.stopPropagation()

event.stopPropagation() 在任何阶段都能够使用,常见的误区是以为只能阻止事件冒泡(向上)传播,但其实也可以在捕获阶段阻止事件(向下)传播。另外在目标阶段阻止事件传播只会阻止其父元素在冒泡阶段的事件执行,目标阶段的事件会全部执行。

阻止默认事件

event.preventDefault()

常见默认事件如 a 标签链接跳转,表单提交等。

兼容性

主要针对 IE 浏览器,IE9 以下使用 attachEvent() 绑定和 detachEvent() 绑定和解绑事件,同样也有事件捕获和冒泡,但无法通过代码控制。

event.targetevent.currentTarget 区别

event.target 表示事件触发的对象 event.currentTarget 表示事件绑定的对象

如下:

<div id="a">
    <div id="b">
      <div id="c">
        <div id="d"></div>
      </div>
    </div>
</div>

<script>
    document.getElementById('a').addEventListener('click', function(e) {
      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);
    });
    document.getElementById('b').addEventListener('click', function(e) {
      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);
    });
    document.getElementById('c').addEventListener('click', function(e) {
      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);
    });
    document.getElementById('d').addEventListener('click', function(e) {
      console.log('target:' + e.target.id + '&currentTarget:' + e.currentTarget.id);
    });
</script>

上面的事件绑定都处于冒泡阶段,当我们点击最里层的元素 d 的时候,会依次输出:

target:d&currentTarget:d
target:d&currentTarget:c
target:d&currentTarget:b
target:d&currentTarget:a

cfour-hi avatar Oct 17 '17 06:10 cfour-hi