javascript - 父节点上的事件监听器也在所有子节点上触发

标签 javascript ecmascript-6 addeventlistener getelementsbyclassname stoppropagation

我正在从头开始用 vanilla js 编写一个可拖动类(这与 jQuery 可拖动无关),并且它工作得很好,只有我的监听器在所选节点的子节点上触发。我试过e.stopPropagation()但它似乎并没有改变结果。

这是该类的代码片段:

setListeners() {

    const targets = document.getElementsByClassName("-jsDraggable");

    [...targets].forEach(elem => {

        elem.addEventListener("mousemove", e => this.handleMouseMove(e));
        elem.addEventListener("mousedown", e => this.handleMouseDown(e));
        elem.addEventListener("mouseup", e => this.handleMouseUp(e));

    });
}

...例如:

<ul class="-jsDraggable">
    <li>No drag</li>
    <li>No drag</li>
    <li class="-jsDraggable">Can drag this item</li>
    <li>No drag</li>
</ul>

在这种情况下,我想要 <ul class="-jsDraggable">...</ul>受到影响还单例<li class="-jsDraggable">...</li>在里面,从其他列表项之一拖动只需拖动主 <ul class="-jsDraggable">...</ul>元素。

但是,无论我与哪个子节点交互,无论它与具有该类的节点相比在 DOM 中的位置有多远,它都会触发处理程序。

任何帮助将不胜感激!

编辑:另一个需要澄清的例子:

<article class="-jsDraggable">
    <header>
        <h1>Heading</h1>
    </header>
    <main>
        <p>...</p>
    </main>
</article>

无论我将这个 <article> 拖到哪里元素,它应该将整个 HTML 组作为一个整体拖动(因为它的父级都有该类)。然而,目前它的行为更像是这样:

<article class="-jsDraggable">
    <header class="-jsDraggable">
        <h1 class="-jsDraggable">Heading</h1>
    </header>
    <main class="-jsDraggable">
        <p class="-jsDraggable">...</p>
    </main>
</article>

...每个子级也在移动,而它只应该移动附加了该类的父容器。

最佳答案

我解决了它,它不起作用,因为我将当前元素设置为 this.elem = e.target 而不是 this.elem = e.currentTarget 。此后,mousedown 中的 e.stopPropagation() 按预期工作。

感谢您让我了解 e.currentTarget,在阅读此线程中的帮助之前我并不知道它。

关于javascript - 父节点上的事件监听器也在所有子节点上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54563490/

相关文章:

javascript - 单击按钮时增加 CSS 属性

node.js - Webpack 在 linux 上找不到 lodash 子模块,但在 macOS 上可以正常工作

reactjs - 为什么不能根据 Prop react 设置初始状态

javascript - 查找此元素内的文本

javascript - "addEventListener is not a function"问题

javascript - 无法获取 JavaScript 对象的属性

javascript - 使用javascript动态删除表单元素

javascript - 页面向下滚动时更改标题颜色

javascript - JavaScript 中函数返回结果后如何处理函数中的意外错误?

javascript - 按钮不工作的事件监听器 - vanilla JavaScript