为什么jQuery:not选择器属性没有'不适用于这种情况
Why jQuery :not selector attribute doesn't work for this scenario?
我有以下代码,可以按预期工作:
第一种方法
$('ul').on('click', function(e) {
$(this).append('<li>foo</li>');
})
.on('click', 'li', function(e) {
e.stopPropagation();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
它的作用很简单:
- 它在单击任何项目符号时添加一个li元素
- 忽略li元素内部的任何单击
我很冷静,这是我想要的行为。使用这种方法,项目符号点似乎不是li元素的一部分,因为对项目符号点执行的任何单击都不会通过第二个函数。
我的问题出现了,因为我认为我可以对javascript代码进行一点重构,并在第一次调用中将":not(li)"选择器作为参数传递给它。
第二种方法:
$('ul').on('click', ":not(li)", function(e) {
$(this).append('<li>foo</li>');
});
但事实证明,它的行为是不同的,我不明白为什么不在点击要点后添加li元素。
第二种方法看起来更干净,但与我们在第一种方法中看到的相反,就像子弹点是li元素的一部分。
-为什么第二种方法表现不同?
这是因为ul :not(li)
将选择不是li
元素的ul
的任何后代。
由于ul
元素只包含li
元素,因此事件永远不会被激发。但是,如果li
元素包含span
元素,则在单击span
元素时会触发事件,但这不是所需的结果。
与其在单击li
元素时抑制事件,我只建议检查this
是否等于e.target
。这与您的第一个示例类似。
$('ul').on('click', function(e) {
if (this === e.target) {
$(this).append('<li>foo</li>');
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
</ul>
相关文章:
- html5 drawImage适用于firefox,而不是chrome
- Jquery Ajax POST不工作.适用于GET
- 如何调试遗留的javascript代码(适用于IE,但在Google Chrome中不正常)
- .load()适用于window,而不是ID
- 使用Jquery更改css样式适用于id's、 不在课堂上
- 提交按钮不会;不适用于Chrome或Firefox,但适用于Internet Explorer
- 为什么 javascript 中的“btoa”编码适用于 20 位字符串而不是 20 位整数
- Javascript String to Date适用于Chrome,而不是FF或Safari
- Onchange,向上,向下箭头键适用于FF和Chrome,但在IE中不起作用
- .load() 适用于 IE 和 dreamweaver 预览版,但不能使用 opera 和 chrome
- 找不到适用于 Highcharts 的 JSON 数组语法
- 为什么在jQuery中使用focusout适用于Firefox,而使用addEventListener则不适用;t
- jQuery选择菜单验证器适用于FF和Chrome,但不适用IE
- 单选按钮'onclick'适用于Chrome和Firefox,但不适用IE
- JQuery ScrollTop适用于chrome,但不适用firefox
- window.opener.location.href适用于IE,但不适用Chrome或Safari
- Frame Busting buster不完全适用于IE
- Jquery touch punch适用于Chrome和Firefox,但不适用IE
- 背景更改仅适用于chrome+$.预加载不适用;不起作用
- JavaScript window.location.replace适用于Firefox,但不适用IE或Chrome