JS 事件捕获与事件冒泡

事件捕获与事件冒泡

<script>
  function showTagName() {
    alert("事件捕获: " + this.tagName);
  }

  var elems = document.querySelectorAll("div, p, a");
  for (let elem of elems) {
	//addEventListener(event, function, useCapture);
	//useCapture :false冒泡(默认), true捕获
    elem.addEventListener("click", showTagName, true);
  }
</script>
<body>
    <div id="wrap">
        <p class="hint">
            <a href="#"></a>
        </p>
    </div>
</body>


点击a时, 同时触发p div
冒泡  触发事件顺序 a -> p -> div
捕获  触发事件顺序 div -> p -> a

阻止事件捕获和冒泡

1 event.stopPropagation(); [ˌprɒpəˈɡeɪʃən] 传递

会阻止事件捕获和事件冒泡,但是无法阻止标签的默认行为,例如点击链接任然可以打开对应网页。

  function showAlert(event) {
    alert("您点击了 "+ this.tagName + " 标签");
	//阻止事件捕获和冒泡
    event.stopPropagation();
  }

  var elems = document.querySelectorAll("div, p, a");
  for(let elem of elems) {
  elem.addEventListener("click", showAlert);
  }

2 event.stopImmediatePropagation() [ i mi: diət] 立刻的,之后的

阻止同一节点的同一事件的其它事件处理程序,例如为某个节点定义了多个点击事件,当事件触发时,这些事件会按定义顺序依次执行,如果其中一个事件处理程序中使用了 stopImmediatePropagation() 方法,那么剩下的事件处理程序将不再执行。

  function sayHi(event) {
    alert("事件处理程序 1");
    event.stopImmediatePropagation();
  }
  function sayHello() {
    alert("事件处理程序 2");
  }
  // 为 id 为 link 的标签定义多个点击事件
  var link = document.getElementById("link");
  link.addEventListener("click", sayHi);//阻止下面的点击事件sayHello
  link.addEventListener("click", sayHello);

3 event.preventDefault();

阻止默认操作, 某些事件具有与之关联的默认操作,例如当您单击某个链接时,会自动跳转到指定的页面

  var link = document.getElementById("link");
  link.addEventListener('click', function(event){
     event.preventDefault(); // 阻止链接跳转
  });
posted @ 2022-02-23 22:57  波吉国王  阅读(109)  评论(0编辑  收藏  举报