事件冒泡、事件捕获、事件代理

2020-10-22  本文已影响0人  不退则进_笑

1,背景

2,例子:

<div id="outer" onClick={()=>{}}>
    <p id="inner" onClick={()=>{}}>Click me!</p>
</div>

3,事件冒泡

4,事件捕获

5,addEventListener 的第三个参数

6,冒泡的案例

<div id="s1">s1
    <div id="s2">s2</div>
</div>
<script>
    s1.addEventListener("click",function(e){
        console.log("s1 冒泡事件");
    },false);
    s2.addEventListener("click",function(e){
        console.log("s2 冒泡事件");
    },false);
</script>

// s2 冒泡事件
// s1 冒泡事件

7,捕获的案例

<div id="s1">s1
    <div id="s2">s2</div>
</div>
<script>
    s1.addEventListener("click",function(e){
        console.log("s1 捕获事件");
    },true);
    s2.addEventListener("click",function(e){
        console.log("s2 捕获事件");
    },true);
</script>

// s1 捕获事件
// s2 捕获事件

8,事件捕获和事件冒泡,一起存在

<div id="s1">s1
    <div id="s2">s2</div>
</div>
<script>
s1.addEventListener("click",function(e){
        console.log("s1 冒泡事件");
},false);
s2.addEventListener("click",function(e){
        console.log("s2 冒泡事件");
},false);

s1.addEventListener("click",function(e){
        console.log("s1 捕获事件");
},true);

s2.addEventListener("click",function(e){
        console.log("s2 捕获事件");
},true);
</script>

8.1 执行顺序
8.2 总结

8,选择冒泡还是捕获?

9,IE 浏览器兼容

10,事件代理(事件委托)

<ul id="myLinks">
      <li id="goSomewhere">Go somewhere</li>
      <li id="doSomething">Do something</li>
      <li id="sayHi">Say hi</li>
    </ul>
    <script>
      var item1 = document.getElementById('goSomewhere')
      var item2 = document.getElementById('doSomething')
      var item3 = document.getElementById('sayHi')

      item1.onclick = function () {
        location.href = 'http://www.baidu.com'
      }
      item2.onclick = function () {
        document.title = '事件委托'
      }
      item3.onclick = function () {
        alert('hi')
      }
    </script>

如果在一个复杂的 Web 应用程序中,对所有可单击的元素都采用这种方式,那么结果就会有数不 清的代码用于添加事件处理程序。此时,可以利用事件委托技术解决这个问题。使用事件委托,只需在 DOM 树中尽量最高的层次上添加一个事件处理程序,

 <script>
      var allItems = document.getElementById('myLinks')
      allItems.addEventListener('click', function (event) {
        var target = event.target
        switch (target.id) {
          case 'doSomething':
            document.title = '事件委托'
            break
          case 'goSomewhere':
            location.href = 'http://www.baidu.com'
            break
          case 'sayHi':
            alert('hi')
            break
        }
      })
    </script>
上一篇 下一篇

猜你喜欢

热点阅读