事件流-事件冒泡/捕获-普通事件与事件绑定的区别

事件流

从页面中接受事件的顺序
事件流-事件冒泡/捕获-普通事件与事件绑定的区别_第1张图片

普通事件

<div onclick="clicked" id="dom">testdiv>
dom.onclick = () => {}

非针对dom元素的事件,就是直接触发事件

  • 不支持 DOM 事件流
  • 事件捕获阶段目标元素阶段=>事件冒泡阶段
  • 重复绑定时,后者会覆盖前者

事件绑定

<div onclick="clicked" id="dom">testdiv>
dom.addEventListener('click', function(){}, true/false)

针对dom元素的事件,绑定在dom元素上,可以在一个元素上监听同一事件多次

  • 重复绑定:所有的绑定将会依次触发
  • 支持 DOM 事件流
  • 第三个参数:useCapture:true:事件捕获阶段触发;false:默认,事件冒泡阶段触发

事件冒泡

<p>冒泡p>
    <div class="wrapper" onclick="wrapper_click()">
        wrapper
        <div class="inner" onclick="inner_click()">
            inner
            <div class="in" onclick="in_click()">indiv>
        div>
    div>
    <div class="result_wrapper">冒泡结果:<span id="result">span>div>
  1. 点击 in时,所触发的事件
    事件流-事件冒泡/捕获-普通事件与事件绑定的区别_第2张图片
    我们可以看到,当事件绑定使用冒泡阶段触发时:
    会从in节点开始触发,从最里面的节点,逐级向上冒泡
    先打印:普通事件,在打印事件绑定事件,可以得出普通事件优先级高于事件绑定,

事件捕获

    <p>捕获p>
    <div class="wrapper" onclick="wrapper_click_1()">
        wrapper1
        <div class="inner" onclick="inner_click_1()">
            inner1
            <div class="in" onclick="in_click_1()">in1div>
        div>
    div>
    <div class="result_wrapper_1">捕获结果:<span id="result1">span>div>
  1. 点击 in时,所触发的事件
    事件流-事件冒泡/捕获-普通事件与事件绑定的区别_第3张图片
    当事件绑定使用捕获阶段触发时:
    打印结果是从最外围向内部触发,事件绑定:wrapper - inner - in
    在目标阶段,也就是in节点时:还是先触发了普通事件,在触发事件绑定事件

事件代理

页面事件绑定过多时,占用内存也会过多。
事件委托利用事件冒泡,只指定一个事件处理程序即可,就可以管理某一个类型的所有事件

你可能感兴趣的:(前端,JavaScript)