Javascript 如果单击事件冒泡到绑定到同一单击处理程序的元素,如何隔离单击的初始目标?
我正在使用一个嵌套的treeview菜单,有3层嵌套。(每层的)每个列表项负责在单击时将一些新内容加载到页面上:Javascript 如果单击事件冒泡到绑定到同一单击处理程序的元素,如何隔离单击的初始目标?,javascript,jquery,Javascript,Jquery,我正在使用一个嵌套的treeview菜单,有3层嵌套。(每层的)每个列表项负责在单击时将一些新内容加载到页面上: $('li', '#navigation').click(function(event) { // this targets all three layers of nested menu items event.preventDefault(); // prevents click from making new server request var url =
$('li', '#navigation').click(function(event) { // this targets all three layers of nested menu items
event.preventDefault(); // prevents click from making new server request
var url = $("a", this).attr("href");
loader.load(url);
});
问题是,当您单击一个嵌套列表项(向下一层或两层)时,“单击”会在其上方的每个列表项中弹出,导致所有三个都运行指定的事件处理程序loader.load()
方法。依次,单击任何嵌套列表项将加载顶级列表项的内容
因此,当事件触发时,我想检查导致事件处理程序执行的是否是单击的发起人。Event.target(以及任何告诉我当前列表项的内容)将不起作用,因为它们告诉我当前正在启动的项,而不是发起者
最后,event.stopPropogation()将不起作用,因为它将停止所有嵌套元素的传播,因为它们包含在更高级别的元素中
关于如何确定点击事件的发起人,有什么想法吗
更新:这是JSFiddle:我认为这与您的选择器有关? $(“a”,this)将触发所有标记。
我可能错了 返回false;似乎做到了这一点:
只需绑定到锚,而不是
li
。为什么首先要绑定到li
$('#navigation').on('click', 'a', function(event) {
event.preventDefault();
var url = $(this).attr('href');
// whatever else your code does
});
也许可以快速创建一个包含html的JSFIDLE?就可以了。谢谢你的建议。刚刚添加了一个:事实上,我不确定我是否理解你对事件原因的解释。stopPropagation();不起作用。我认为我下面的答案是一样的。@BryceJohnson
return false
与event.preventDefault()
和event.stopPropagation()是一样的。(如果使用的是return false
,则不需要第一行)我明白了。。。虽然现在,在我的整个项目中这样做也会导致它阻止UI事件。。。我将用一个例子来复制。@BryceJohnson看到我的答案;你不只是处理锚上的点击有什么原因吗?“你根本不应该去管理那些冒泡的事件。”Mathletics回应你的回答说:“老实说,我不知道我们为什么要受li的约束。”。我正在使用其他人的代码。这似乎暂时有效。谢谢
$('#navigation').on('click', 'a', function(event) {
event.preventDefault();
var url = $(this).attr('href');
// whatever else your code does
});