[英]Javascript click event triggers twice
在以下代码段中,为什么divClicked()
在单击<label>
时触发两次,而在单击<input>
时仅触发一次?
function divClicked(_index) { console.log("div click event"); } function inputClicked(_index) { console.log("input click event"); }
<div class="option" onclick="divClicked(1)"> <input id="1_1" name="group_1" type="radio" value="1" onclick="inputClicked(1)" /> <label for="1_1">label</label> </div>
注意:我想知道为什么会发生这种情况,而不是“快速修复”,例如:将 onclick() 放在 label 上。
这是因为 HTML 规范在4.10.4 中的描述:
例如,在单击复选框标签检查复选框的平台上,单击以下代码段中的
label
可能会触发用户代理在input
元素上运行合成点击激活步骤,就好像元素本身已被用户触发一样:<label><input type=checkbox name=lost> Lost</label>
在其他平台上,行为可能只是为了集中控制,或者什么都不做。
这意味着当点击<label>
,浏览器会在关联的<input>
元素上创建第二个“合成”点击事件,以切换其状态。
divClicked
被触发两次的原因是因为来自<label>
的第一个事件冒泡到<div>
,第二个合成点击事件冒泡到<div>
。
这通常是click
事件bubbling
原理的原因:
当一个事件发生在一个元素上时,它会在它、它的关联元素、它的父元素和其他祖先元素上运行。
现在,关系是当您单击label
,有两个事件会在此处冒泡:
1)点击div(你期望的)
2)点击输入(这也是预期的)
2.1) 当点击
input
被触发时,这里也会再次触发对div
点击
您可以使用event.bubbles
道具确认此行为。
编辑:
label
和input
之间连接的原因:(我知道这绝对不是必需的,因为它无处不在)
<label>
可以通过将控件element inside the <label>
元素内or by using the for
属性与控件相关联。 这样的控件称为标签元素的标记控件。 一个输入可以与多个标签相关联。
摘自:https ://developer.mozilla.org/en-US/docs/Web/HTML/Element/label
这意味着在标签上放置for
引用输入元素的id
将刺激行为,就好像元素在label
。 这会将input
上的事件bubble
到label
就像child
到parent
任何事件一样
在某些时候,还要检查 javascript 文件资产是否没有加载两次......它不应该发生,但你永远不知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.