为什么jQuery子选择器以父选择器为目标
Why jQuery children selector is targeting the parent?
>我正在研究一个导航栏,该导航栏在单击时显示下拉菜单。该脚本只是切换类以显示它。
$(".dropdown-btn").click(function() {
$(this).children(".dropdown").toggleClass("expanded");
});
添加样式,它就可以工作。
.dropdown {
display: none;
}
.dropdown.expanded {
display: block;
}
当我添加嵌套下拉菜单时,问题就来了。当我单击嵌套的".dropdown-btn"时,脚本会切换子下拉列表的类(因为它应该(,但它也会切换父级的类!为了更好地解释我的意思,请检查这里的小提琴:http://jsfiddle.net/3rm3ny1j/
我有两个问题。这种行为的原因是什么?最好的解决方案是什么?
因为点击事件会冒泡 DOM 并触发其祖先上的点击事件。
添加.stopPropagation()
,您可以防止这种情况:
$(".dropdown-btn").click(function (e) {
e.stopPropagation();
$(this).children(".dropdown").toggleClass("expanded");
});
js小提琴示例
您的.dropdown
嵌套在.dropdown-btn
内,导致任何进一步的点击都会触发父事件。
通过将触发器和下拉列表分开,您可以阻止它们向上触发。
请参阅此更新的小提琴:http://jsfiddle.net/3rm3ny1j/2/
你已经嵌套了.dropdown-btn
元素,并且你没有stopPropagation
,所以点击一个也会点击它的所有祖先。
注意:为了回答这个问题,我必须点击一个外部网站的链接,这样我才能看到你所有的问题。堆栈溢出问题应该有自己的优点。SO现在甚至具有截图功能,它与JSFiddle执行相同的工作,但在本地。
相关文章:
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 在动态创建的元素上获取对特定选择器的引用
- AngularJS-在JSON选择器中使用变量名
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- jQuery最近父级的数据属性选择器
- 为什么不'在JQuery中找到第二个css选择器的工作
- 为什么 .focus() 不起作用,而 .css(“color”,“red”) 在同一个选择器上起作用
- jquery IE7中的第n个选择器
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- CSS3 目标选择器问题
- 在 jquery not 选择器中具有 2 个类的目标元素
- 具有 ID AND 类的 jQuery 选择器目标元素不起作用
- 为什么jQuery子选择器以父选择器为目标
- css 子选择器:第一个子选择器,但在目标选择器中选择所有子项
- jQuery:.load()方法替换目标选择器内容或将其附加到其中
- jQuery目标选择器的输入类型和表单名称
- CSS目标选择器
- 确定选择器的目标是否已被格式化为滑块
- 如何比较事件.目标到一个选择器