为什么jQuery无法匹配":not(#menu *)"
Why does jQuery fail to match ":not(#menu *)"
我设计了一个基于Javascript的导航栏(我希望它是点击式的,而不是悬停式的,以方便移动设备)。我已经尝试使HTML, CSS和Javascript尽可能简单。
我在正文上放了一个监听器,如果你点击网站上的其他任何地方,就会关闭菜单栏。我正试图过滤侦听器,以便它不会触发,如果你点击菜单栏的任何部分。这是为了防止当你点击下拉菜单中的一个元素时下拉菜单回滚。
我希望下面的匹配器只匹配顶层菜单元素的后代项。如果你能告诉我为什么这样不行,我将不胜感激。
编辑:我明白你可以使用任意函数来评估即将出现的气泡,并决定是否应该对其采取行动,但我更感兴趣的是为什么下面的。on()选择器没有按我期望的方式工作。
$("body").on("click", ":not(#menu *)", function (e) {
$("#menu a").next().slideUp(DROP_DOWN_TIME);
});
http://jsfiddle.net/auKzt/16/HTML <body>
<div>HEADER</div>
<ul id="menu" class="cf">
<li><a href="#">FooafsdasiuhfauhfuahsdfFooaf sdasiuhfauhfuahsdfFooafsdasiuhfauhfuahsdf</a>
<ul>
<li><a href="#">Subitem asdasdasd 1 sadad</a>
</li>
<li>Subitem 2</li>
<li>Subitem 3</li>
</ul>
</li>
<li><a href="#">Bar</a>
<ul>
<li>Subitem 1</li>
<li>Subitem 2</li>
<li>Subitem 3</li>
</ul>
</li>
<li>Qux</li>
</ul>
<div>CONTENT</div>
<div>FOOTER</div>
</body>
JAVASCRIPT $(document).ready(function () {
var DROP_DOWN_TIME = 200;
//Setup hidden dropdowns
$("#menu > li > a").next().toggle();
//Hide or unhide dropdowns onclick
$("#menu > li > a").click(function (e) {
$("#menu a").next().not($(e.target).next()).slideUp(DROP_DOWN_TIME);
$(e.target).next().slideToggle(DROP_DOWN_TIME);
e.stopPropagation();
});
$("body").on("click", ":not(#menu *)", function (e) {
$("#menu a").next().slideUp(DROP_DOWN_TIME);
});
});
CSS #menu {
width: 900px;
padding: 0;
margin: 0;
}
/* Top level menu container */
#menu li {
background-color: aqua;
border: 1px solid black;
padding: 2px;
}
/* Top level menu items */
#menu > li {
display: inline-block;
float: left;
position: relative;
}
/* Submenu container */
#menu > li > ul {
position:absolute;
padding: 0;
margin: 0;
top: 100%;
left: -1px;
}
/* Submenu Items */
#menu > li > ul > li {
display: block;
float: none;
white-space: nowrap;
}
.cf:before, .cf:after {
content:" ";
/* 1 */
display: table;
/* 2 */
}
.cf:after {
clear: both;
}
失败是因为点击被菜单元素捕获了。里面的内容被捕捉到了。
还需要添加菜单元素
$("body").on("click", ":not(#menu, #menu *)", function (e) {
^^^^^^
试试这个
$("body").on("click", function (e) {
if( e.taget.id !== 'menu' && !$(e.target).closest('#menu').length) {
$("#menu a").next().slideUp(DROP_DOWN_TIME);
}
});
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- jQuery is not loaded
- AngularJS JSON not arriving php
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- $rootScope not working
- reactRedux is not defined
- jQuery document.ready not working
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- Javascript/Jquery Blob not showing Chrome PDF
- ReferenceError: not defined
- "“;变量未引用正确的对象
- JavaScript/jQuery - "$ is not defined- $function()"
- How do i formulate "if this.children.has.not.class"