代码之家  ›  专栏  ›  技术社区  ›  SuperCodeBrah

普通事件侦听器绑定顺序

  •  -1
  • SuperCodeBrah  · 技术社区  · 6 年前

    profileIcon div,下拉列表将按预期显示。但是,当我点击身体上的任何地方时,下拉列表就会隐藏起来。即使我试图阻止病毒的传播,这种情况也会发生 dropdown

    当我添加console语句时,我注意到body listener在dropdown listener之前被调用,基本上不管我做什么(例如,添加顺序、调用各种超时函数、将body listener更改为 document.getElementById("root") 等等)。

    document.getElementById("profileIcon").addEventListener("click", (e) => {
        document.getElementById("dropdown").style.visibility = "visible"        
    })
    
    document.getElementById("dropdown").addEventListener("click", (e) => {
        console.log("dropdown")
        e.stopPropagation()
        e.preventDefault()
        e.stopImmediatePropagation()
    })
    
    document.body.addEventListener('click', function() {
        console.log("body")
        document.getElementById("dropdown").style.visibility = "hidden"
    }, true)
    

    document.addEventListener("DOMContentLoaded")

    我真的不知道该怎么办。有什么想法吗?

    解决方案:

    我搬走了 true 侦听器:

    document.getElementById("profileIcon").addEventListener("click", (e) => {
        e.stopPropagation()
        dropdown.style.visibility = "visible"
    }, true)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Felix Kling    6 年前

    我注意到body侦听器在dropdown侦听器之前被调用

    true 作为第三个参数传递给 addEventListener ,处理程序在事件的捕获阶段执行,而不是冒泡阶段。

    看到了吗 What is event bubbling and capturing?

    别过去 是的