如何将不同的事件处理程序分配给元素及其父级
How do I assign different event handlers to elements and their parent
假设我有如下结构:
<ul id="a">text
<li id="b">text</li>
<li id="c">text</li>
</ul>
如何为a、b和c分配不同的事件处理程序(比如onclick监听器)?当我为<ul>
分配一个处理程序时,它将在单击任何<li>
时被触发。
与其为列表中的每个元素设置一个单独的处理程序,不如在父级上使用一个事件侦听器,并使用事件委派来检测用户单击的元素的id
$('ul').on('click', function(evt) {
id = evt.target.id;
switch (id) {
"a" : ... break;
"b" : ... break;
"c" : ... break;
default: ... ;
}
});
每当事件被触发时,它都会"冒泡"。这意味着它是在与它相关联的实际元素上调用的,但它也会为链中的每个父元素激发一次,一直到顶部。因此,在您的情况下,每当您单击b
或c
时,a
的事件也将触发。为了避免这种情况,你需要停止冒泡。
具体来说,在b和c的事件处理程序中,应该通过以下操作来停止事件冒泡:
if (event.stopPropagation) event.stopPropagation();
else event.cancelBubble = true;
大多数浏览器在事件上支持stopPropagation
来结束冒泡。旧版本的IE使用cancelBubble
属性。因此,以上内容应该是跨浏览器兼容的。
我知道你没有指定jQuery,但由于它非常流行,值得注意的是,如果你使用jQuery,这个条件隐藏在框架后面,所以你可以做:
event.stopPropagation()
每个事件都会在DOM树中弹出(或者至少是"应该",因为有IE)。你可能想停止这种冒泡,看看本·李的回答。但还有更好的方法:
只需检查触发侦听器的事件是否针对您正在观看的元素而被触发。然后执行处理程序,或者转义。
document.getElementById("a").addEventListener("click", function(e) {
var a = e.currentTarget; // reference to #a
var t = e.target; // this may be #b or #c or any of their children - or not
if (a != t)
return;
// else
// do what you wanted to do
}, false);
您可以使用它。
$('ul li#a').click(function(){
//some thing here...
});
$('ul li#b').click(function(){
//some thing here...
});
我在一个项目中也遇到了同样的问题。我首先声明了一个全局变量(用于标记和默认值false)。然后,我触发了所有子级上的onmouseover和onmouseout事件,并在光标位于子级上时将标志值更改为true(在离开子级时将其恢复为false)。因此,在为父级声明onclick函数时,只需设置一个条件来检查flag的值。
- 如何为动态创建的元素分配唯一的id-Javascript
- jQuery插件在为元素分配id时停止工作
- 有人能向我解释一下:将元素附加到目标与将元素分配到目标
- 如何为html元素分配本地存储值
- 为对象元素分配随机值
- 如何为类元素分配链接
- JS - 为每个 Dom 元素分配一个对象中的值
- 使用 JavaScript 为元素分配 ID
- JS:如何为新创建的HTML元素分配ID
- 为动态创建的元素分配唯一名称
- 将字符串与数组变量混合在一起,为javascript中的元素分配id
- 为表行的所有输入元素分配id和名称
- 为元素分配属性的自定义指令
- 应该为“容器”元素和“动画”元素分配什么位置属性?HTML CSS JavaScript.
- 如何在 javascript 循环中为动态创建的 HTML 表单元素分配不同的 ID
- 如何通过Selenium为元素分配id
- 在屏幕调整大小时为引导程序元素分配新类不起作用
- 解构赋值,为DOM元素分配样式
- 如何在Javascript中为元素分配webkit样式
- 使用全局变量为动态创建的元素分配唯一id和唯一名称