41

假设我有一个父元素,它内部有很多嵌套的子元素:

<div id="p">
    <div id="c1">
        <div id="c2"></div>
        <div id="c3"></div>
    </div id="c4">
        <div id="c5"></div>
    </div>
</div>

我已经click在父级上绑定了一个事件:

$('#p').bind('click', function() {
    alert($(this).attr('id'));
});

因为事件被分配给父元素,所以我总是看到父 id,但是,我想知道是否有任何可能的方法来找出哪些子元素已被点击?

我也无法将任何事件分配给子元素或从父 div 中删除事件侦听器。

4

3 回答 3

57

您需要将事件对象传递给函数以获取触发事件的项目, event.target 将为您提供源元素。

现场演示

 $('#p').bind('click', function(event) {
    alert(event.target.id);
 });

或者

现场演示

$('#p').bind('click', function(event) {
    alert($(event.target).attr('id'));
});

编辑

第一种方法在性能、简单性和可读性event.target.id方面优于第二种方法。$(event.target).attr('id')

于 2012-10-06T09:34:48.323 回答
7

你可以试试下面的代码。也尝试使用 jsfiddle(演示)。

$('#p').on('click', function(event) {
    alert(event.target.id);
});​

试用演示

第二个问题的答案是您可以将事件分配给孩子并从其父母中删除。看一下这个。

.stopPropagation(); 

防止事件在 DOM 树中冒泡,防止任何父处理程序收到事件通知。阅读更多

如果您希望仅执行特定事件并且不允许触发其他事件,请使用以下代码

event.stopImmediatePropagation()

阻止其余的处理程序被执行,并防止事件在 DOM 树中冒泡。阅读更多

我希望这能解决你的问题。如果您有任何问题,请随时提问。谢谢

于 2012-10-06T09:41:38.053 回答
1

如果您的元素有孙子,则有更好的方法来获取子元素。注意大于号。

$('.parent > .child').click(function() {
    // This will be the child even if grandchild is clicked
    console.log($(this));
});
于 2017-05-30T22:15:53.563 回答