首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当所单击的元素已从DOM中移除时,是否会检测何时在元素之外的任何位置单击?

当所单击的元素已从DOM中移除时,是否会检测何时在元素之外的任何位置单击?
EN

Stack Overflow用户
提问于 2015-07-20 07:06:49
回答 2查看 50关注 0票数 1

我有一个通知下拉菜单,当你点击它之外的任何地方时,它应该被关闭。在我遇到新情况之前,下面的代码一直运行得很好:

代码语言:javascript
复制
$(document).click(function(e) {
    var target = e.target;

    if (!$(target).is('.notification-area') && !$(target).parents().is('.notification-area')) {
        $('.notification-area .flyout').removeClass('flyout-show');
    }
});

然而(如果相关的话,我使用Backbone ),一些元素会导致菜单的一部分重新呈现。也就是说:移除并重建DOM的一部分。

显然,如果一个元素已经被删除了,你就不能知道它在DOM中的什么位置。所以现在,如果单击会导致视图的一部分重新呈现,那么检查元素的parents()的代码将不会返回父级。

然后我想我也许可以通过检查parents()的长度是否大于0来解决它。

代码语言:javascript
复制
...
if (!$(target).is('.notification-area') 
    && !$(target).parents().is('.notification-area')
    && $(target).parents().length > 0)
...

这是有效的,但我想知道它会有什么副作用。这是最好的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 07:16:51

希望我没弄错你的问题。您需要一些简单的方法来避免在单击通知区域时将其关闭。但是当点击body时关闭它吗?

做这类事情的一种方法有点像这样。

代码语言:javascript
复制
mouseOverArea = false; // This will be globally set, right away

$('.notification-area').mouseenter(function(){
    mouseOverArea = true;
}).mouseleave(function(){
    mouseOverArea = false;
});

然后当你点击body或其他东西时,你只需检查mouseOverArea ==是否为false...如果是,关闭通知框,否则返回false、e.preventDefault();或适合您的代码的任何内容。

票数 1
EN

Stack Overflow用户

发布于 2015-07-20 07:26:22

您可以使用closest()来简化这一过程,因为它同时包括目标和祖先。

它会变成:

代码语言:javascript
复制
!$(target).is('.notification-area') && !$(target).parents().is('.notification-area')

变得更容易阅读:

代码语言:javascript
复制
!$(target).closest('.notification-area').length

参考:closest() docs

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31506871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档