javascript - label包裹着input,给label加点击事件会响应两次
伊谢尔伦
伊谢尔伦 2017-04-10 17:39:17
[JavaScript讨论组]

label包裹着input,给label加点击事件会响应两次

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <label for="innerIpt1">
 <input id="innerIpt1" type="checkbox"/>label1
</label>

<input id="innerIpt2" type="checkbox"/>
<label for="innerIpt2" id="label2">label2
</label>
<script>
    
    var label1 = document.querySelector("label");
var label2 = document.querySelector("#label2");
var input1 = document.querySelector("#innerIpt1");
var input2 = document.querySelector("#innerIpt2");

label1.addEventListener("click", function() {
  console.log("label1");
}, false);
input1.addEventListener("click", function(e) {
  // e.stopPropagation()
  console.log("input1");
}, false);

label2.addEventListener("click", function() {
  console.log("label2");
}, false);

input2.addEventListener("click", function(e) {
  e.stopPropagation()
  console.log("input2");
}, false);
    </script>
</body>
</html>

点击label1的时候,console输出:

label1
input1
lable1

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(7)
怪我咯

没必要用label包含input啊,label的for属性就是为了指定label是为谁说明的

ringa_lee

今天也碰到这个问题了,联想到label与其绑定元素的关系,就猜测当点击label时,浏览器会自动给被绑定元素也执行点击事件的行为,试了下用e.preventDefault(),发现果然阻止了这个默认行为。事件也就只被执行一次了

高洛峰

代码贴出来看看,

大家讲道理

我觉得是这样的 label 标签与 input 相关联,点击 label 就相当于点击了 input 标签。
然后流程是这样的
1.点击 label 执行本身的事件 输出 label1
2.因为点击 label 就相当于点击了 input 标签,所以执行 input 上的事件 输出 input1
3.因为 label 包含了 input,所以事件向上冒泡 执行 label事件 输出 label1

黄舟

你把 false改成true就可以了,这有关系到时间的捕获和冒泡

大家讲道理

为什么要用label包裹input?个人感觉画蛇添足了

高洛峰

貌似不单单是label,p也是会的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号