【问题标题】:Why is javascript sending an element to my event handler, when that element has no event?当该元素没有事件时,为什么 javascript 将元素发送到我的事件处理程序?
【发布时间】:2010-10-27 17:11:10
【问题描述】:

这个html:

<span id="mySpan"><img src="images/picture.png" alt="Some nice alt text" />
 Link text</span>

此 javascript 获取包含图像和文本的跨度,然后使其可点击:

spanVar = document.getElementById("mySpan");
spanVar.addEventListener("click", myEvent, false);

function myEvent(e){
 var obj = e.target;
}

如果我点击“链接文本”,那么 myEvent() 中的 obj 就是跨度。如果我点击图片,那么 obj 就是图片元素!图像本身没有事件。那么为什么不总是传递给事件处理程序的 span 呢?

顺便说一下,为了简单起见,它已被精简,因此仅在 Firefox 中有效。

另外,如果您可以更连贯地表述我的问题标题,请随时编辑我的问题标题。

【问题讨论】:

    标签: javascript dom javascript-events event-handling


    【解决方案1】:

    事件被有效继承。

    当一个事件处理程序被添加到一个元素时,所有的子元素也会受到该事件处理程序的影响,因为它们都在元素内部。所以你必须小心处理事件。

    在你的情况下,你只是想检查一下 myEvent 中点击了什么:

    spanVar = document.getElementById("mySpan");
    spanVar.addEventListener("click", myEvent, false);
    
    function myEvent(e){
        if (e.target === spanVar) // This will make the img non clickable
            var obj = e.target;
    }
    

    Try it out with this jsFiddle


    如果您想检索最初附加了点击处理程序的元素,则只需使用this

    spanVar = document.getElementById("mySpan");
    spanVar.addEventListener("click", myEvent, false);
    
    function myEvent(e){
        var obj = this;  // This is the object that had the click handler attached
    }
    

    Try it out with this jsFiddle


    问题真的不在于事件冒泡。这是父元素的所有子元素有效地接收其父元素的事件处理程序。如果孩子和父母附加了不同的处理程序,事件冒泡就会发挥作用,但您只想触发孩子的处理程序。

    另一种解决方案是更改您的 HTML:

    <div>
        <img src="images/picture.png" alt="Some nice alt text" />
        <span id="mySpan">Link text</span>
    </div>
    

    【讨论】:

    • 为什么你喜欢你的“试用”链接这么大?
    • @Roatin - 因为剩下的只是说说而已。我喜欢走路;)
    • 所以我必须为每一个触发它的元素创建一个新版本的 myEvent() 吗? javascript真的那么烂吗?
    • @randomable - 你是什么意思?不需要。您只需为&lt;span&gt; 创建一个事件处理程序。如果您不希望孩子拥有相同的处理程序,那么您可以简单地使用if(e.target === spanVar)。孩子在他们的父母之内,所以你必须处理它,就像你必须在 CSS 等中处理它一样。 ----- 也许如果你描述了你是如何尝试使用它的,那就会成功更清晰。
    • @Peter Ajtai,我只想获取我设置为可点击的东西的 e.target,而不是获取我从未为其设置事件的子元素。我开始讨厌javascript。 >_
    【解决方案2】:

    您需要阅读event bubbling

    【讨论】:

    • 这是什么...?这怎么可能?!看看我的回答,59 秒后...
    • 啊,一个不错的关键字查找。这些答案是如此含糊,却又如此有帮助。谢谢。 :-)
    • 啊啊,我在谷歌上搜索“javascript events bubbling”,还添加了一个链接到一篇解释冒泡基础知识的文章,这是第一个出现的...
    • @Harmen,我一定是在您打开问题之后,但在您点击提交之前提交了我的答案。
    • 可怜的哈门。现在我应该选择谁的答案?
    【解决方案3】:

    你应该看看 Peter-Paul Koch 在 Quirksmode 上的this article,它正在详细回答你的问题

    【讨论】:

    • 不确定文章是否回答了 OP 的问题。这篇文章正在讨论孩子和父母附加了不同的处理程序的情况。 OP 试图理解为什么事件会被子元素继承。
    猜你喜欢
    • 2016-03-15
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多