我有这个导航条代码
<ul class="left">
<li><a href="#">First</a></li>
<li class="has-dropdown">
<a href="#">Support</a>
<ul>
<li><a href="#">First Sub</a></li>
<li><a href="#">Add</a></li>
</ul>
</li>
<li><a href="#">Add</a></li>
</ul>
我在js文件中有这个事件处理程序
$('ul.left li:not(:last-child), ul.dropdown li:not(:last-child)').click(function(e) {
e.stopPropagation();
var ul = this.parentNode;
ul.removeChild(this);
});
问题:ul.left中的Add没有绑定到click事件处理程序(并且它不能根据我的要求)。但是ul.dropdown中的Add绑定到了click事件处理程序,尽管我已经指定li的最后一个子节点不应绑定。因此,它会删除父项目,即“支持”。
答案 0 :(得分:2)
问题在于,您没有名为dropdown
的类,您有一个名为has-dropdown
的类,因此ul.dropdown li:not(:last-child)
选择器根本不起作用。最重要的是,您的第一个选择器ul.left li:not(:last-child)
将覆盖内部列表中的所有li元素,因此您还需要将第一个选择器更改为:ul.left > li:not(:last-child)
以便仅选择li作为第一个列表的直接后代的元素。
因此,如果您只更改js,请将选择器更改为:
'ul.left > li:not(:last-child), ul.has-dropdown > li:not(:last-child)'
答案 1 :(得分:1)
您需要“直接后裔”操作符>
才能直接在特定<li>
元素下指定<ul>
元素。
这里的问题是选择器的这一部分:ul.left li
匹配如下:
0:<li><a href="#">First</a></li>
1:<li class="has-dropdown">
<a href="#">Support</a>
<ul>
2: <li><a href="#">First Sub</a></li>
3: <li><a href="#">Add</a></li>
</ul>
</li>
4:<li><a href="#">Add</a></li>
所以:not(:last-child)
只会杀掉最后一个li(<li><a href="#">Add</a></li>
)
使用ul.left>li
,您只会获得匹配:
0:<li><a href="#">First</a></li>
1:<li class="has-dropdown">
<a href="#">Support</a>
<ul>
<li><a href="#">First Sub</a></li>
<li><a href="#">Add</a></li>
</ul>
</li>
2:<li><a href="#">Add</a></li>
您正在寻找的完整选择器是:
'ul.left > li:not(:last-child), ul.dropdown > li:not(:last-child)'
答案 2 :(得分:1)
如果我是你,我可能只会在add
按钮上添加一个课程。
HTML
<ul class="left">
<li><a href="#">First</a></li>
<li class="has-dropdown">
<a href="#">Support</a>
<ul>
<li><a href="#">First Sub</a></li>
<li class="add"><a href="#">Add</a></li>
</ul>
</li>
<li class="add"><a href="#">Add</a></li>
</ul>
的jQuery
$('ul.left li:not(.add)').click(function(e) {
e.stopPropagation();
var ul = this.parentNode;
ul.removeChild(this);
});