JQuery:点击无处不在但有些元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JQuery:点击无处不在但有些元素相关的知识,希望对你有一定的参考价值。

我有一些我可以用.click()函数选择的元素,它们会突出显示。上面有菜单,有一些动作。我想点击任何元素而不是菜单时取消突出显示。

结构体:

<body>
    <div id="menu">
    </div>
    <div id="elements">
        /* selectable elements here */
    </div>
</body>

可执行示例

$().ready(function(){
	$("#elements a").click(function(){
  	$(this).css('color', 'red');
  	return false;
  });
  $(document).click(function(e) {
    if ( $(e.target).closest('#menu').length === 0 ) {
        $("#elements a").css('color', 'blue');
    }
	});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="menu">
        <a href="#">Menu 1</a>
        <a href="#">Menu 2</a>
        <a href="#">Menu 3</a>
    </div>
    <div id="elements">
        <a href="#">Element 1</a>
        <a href="#">Element 2</a>
        <a href="#">Element 3</a>
    </div>
    <div>
      Click any element to highlight it. Click anywhere to reset highlighting. Click menu to keep highlighting.
    </div>

Jsfiddle

我试图绑定$("body *").not("#menu").click(...);但是当我点击#menu然后身体的onclick事件也被解雇了因为#menu是身体的孩子。

答案
$(document).click(function(e) {
    if ( $(e.target).closest('#menu').length === 0 ) {
        // cancel highlighting 
    }
});

另一种解决方案是在#menu点击处理程序和元素点击处理程序的末尾调用stopPropagation()。这样,如果点击事件冒泡到文档对象,您就会知道菜单和元素都没有被点击,您可以安全地取消突出显示:

$('#menu').click(function(e) {
    // do stuff
    e.stopPropagation();
});

$('.element').click(function(e) {
    //do stuff
    e.stopPropagation();
});

$(document).click(function() {
    // cancel highlighting
});
另一答案

为此编写自己的委托处理程序的另一种方法是使用Ben Almans“外部事件”插件来实现此目的。几乎与ŠimeVidas提到的相同,但嘿 - 选择是件好事!

http://benalman.com/projects/jquery-outside-events-plugin/

所以这样的事情

$('#menu').bind("clickoutside", function(){
    // cancel highlighting
})
另一答案

你应该在click上处理body事件,然后检查是否$.contains($('#menu'), e.target)

另一答案

.closest将传播并检查其中一个父母是否是不可点击的元素。

$(document).on('click', '.clickable_parent', function(e){
  if(e.target.closest(".UnClickable_child") === null){
   //do stuff
  }
});
另一答案
$("body *:not(body #menu)").click()

不知道这是否有用,我不在我的电脑上......

以上是关于JQuery:点击无处不在但有些元素的主要内容,如果未能解决你的问题,请参考以下文章

几条jQuery代码片段助力Web开发效率提升

jquery怎样点击某个元素后获得另一个元素里的链接并跳转

jquery 对象的 heightinnerHeightouterHeight 的区别以及DOM 元素的 clientHeightoffsetHeightscrollHeightoffset(代码片段

仅当不在视图中时才滚动到元素 - jQuery

jquery 点击每个元素,但

根据条件排除点击事件?