JavaScript 捕获事件。

3

我有一个问题。我的DOM中有太多的事件。上层会捕获下层的事件。

简单的例子:

<!DOCTYPE html>
<html>
<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script>
        $(document).ready(function(){
            $("p").click(function(){
                $(this).hide();
            })
            $("#second").click(function(){
                alert("second.");
            });
            $("#first").click(function(){
                alert("first.");
            });
        });
    </script>
    <style type="text/css">
        #first{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        #second{
            width: 100px;
            height: 100px;
            background-color: green;
        }
    </style>
</head>
<body>

    <div id="first">
        <div id="second">

        </div>
    </div>

</body>
</html>

如果有人点击第一个div包含的第二个div,那么两个div都会捕获事件。在这种情况下,我如何只捕获第二个div的单击事件而不影响第一个div?
我了解到C#中有事件冒泡和事件隧道的概念,这就是问题所在。这个问题叫什么名字?我该如何使用JavaScript和jQuery解决这个问题?解决方案是否相同?

1
“C#中的隧道技术”?这和什么有关吗?你看过event.stopPropagation()函数吗? - Ravi Y
因为在C#中,您可以捕获冒泡或C#隧道事件。只是我不知道它在js中是如何工作的。 - Lajos
啊,好的。你的措辞让我有些困惑。下面的答案对你很有效。 - Ravi Y
1个回答

6

您只需要停止事件向父元素传播:

$("#second").click(function (e) {
    e.stopPropagation();

    alert("second.");
});

演示:http://jsfiddle.net/EXbdt/3/


@ryadavilli:谢谢。看起来Chrome在JSFiddle上有些问题。 - Blender
如果我想让第一个面板的父级不捕获事件,而是让父级的父级再次捕获事件,该怎么办呢?因此,事件从第二个div产生,冒泡到第一个div,在那里我设置了stopPropagation,但是接下来还有一个父级,我也想捕获该事件。这很复杂吗? - Lajos
1
@user1693057:听起来太复杂了。你为什么需要这样做? - Blender
我不必这样做,只是想知道你是否知道这个。也许将来我需要用到它。 - Lajos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接