【问题标题】:How can I use jQuery to determine if a click event fires within a specific element?如何使用 jQuery 来确定是否在特定元素中触发点击事件?
【发布时间】:2010-12-13 18:12:55
【问题描述】:

我正在使用以下代码为块设置动画。在我的代码中,div_animate() 实质上隐藏了带有指定选择器的<div>(如果它当前可见)。

$(document).click(function(event){
    div_animate("#container");
});

我需要确定用户是否点击了#container 的子项,如果是,则为return false;——据我所知,此代码看起来像这样:

$(document).click(function(event){
    if ( /* the event's target has a parent of #container */ ) {
        return false;
    } else {
        div_animate("#container");
    }
});

有什么想法吗?

【问题讨论】:

  • 这和我给你this linkyour previous question是同一个问题吗?
  • @patrick 这与我上一个问题不同,但它是相关的——当我添加上一个问题的解决方案时出现了这个问题。虽然您的链接与我最初的问题相似,但我认为它没有用。

标签: javascript jquery html events


【解决方案1】:

最简单的事情是:

if ($(event.target).is('#container *, #container')) // edited - thanks @gnarf
  // is a child
else
  // is not a child

您可以做出不同的选择来检测它是否是目标(或非目标)容器的子容器;那只是一个。另一种选择:

if ($(event.target).closest('#container').length)

【讨论】:

  • 那不会自己找到#container...也许$(event.target).closest('#container').length.is('#container, #container *')
  • 这正是我想要的。感谢您的快速回答!
  • @gnarf 啊,是的,你是对的 - 我也已经添加了“最接近”的替代方案,但我会修复第一个。
  • @Jazzerus 确保您注意到我根据 gnarf 的评论所做的轻微修改,并注意尼克的回答
  • $(anotherselector).trigger(event) 在相关选择器中被激活时,这将无法正常工作。示例:$(something).click(function(){ $(anotherselector).trigger(event); }); 完成此操作后,$(document).click(function(e){ if(e.target).is(something) { } }); 将始终将 anotherselector 读取为事件的目标,而不是 something
【解决方案2】:

如果点击源自#container 或在#container 中,您可以阻止该操作,如下所示:

$(document).click(function(event){
    var c = $("#container")[0];
    if (event.target == c || $.contains(c, event.target)) {
        return false;
    } else {
        div_animate("#container");
    }
});

第一个检查是它是否来自#container 本身,第二个是它是否来自一个孩子,即#container $.contains()。另一种更简单的方法是在单击#container 时阻止气泡达到document,如下所示:

$("#container").click(function(e) {
  e.stopPropagation();
});
$(document).click(function() {
  div_animate("#container");
});

【讨论】:

  • 这是我责备你没有缓存“#container”查找的黄金机会,但我敢打赌,当我完成输入此评论时,你会编辑它:-)
  • 不,我的意思是缓存在处理函数或其他东西周围的闭包中,尽管大多数时候我只是在开玩笑。
  • @Pointy - 是的,你可以,虽然你假设在这种情况下它没有改变或移动;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多