为什么 event.stopPropagation() 不会阻止

2024-05-26

SO 上也提出了与此类似的问题,但他们要么只关心解决其具体实现,要么没有明确提出这个问题。此外,所有答案都没有真正解决这个问题。

给出以下示例:

document.querySelector('span').addEventListener('click', function(event) {
  event.stopPropagation();
});
<label>
    <input type='checkbox'/>
    <span>Click Me!</span>
</label>

为什么这不足以防止单击跨度时检查复选框?

相反,有必要调用event.preventDefault()以防止标签选中(或取消选中)复选框。这似乎违反直觉。在此示例中,这意味着单击跨度本身会导致复选框切换,而不是单击然后冒泡到标签。


This is not very well specified and is actually platform specific (even though all major platforms/vendors combinations seem to act similarly here). specs https://html.spec.whatwg.org/multipage/forms.html#the-label-element - temp link https://html.spec.whatwg.org/multipage/forms.html#the-label-element:the-label-element-10

[标签元素的]激活行为可能是什么(如果有的话)应该与平台的标签行为相匹配

标签事实上的默认行为是将点击分派到其链接的<input>元素(“标记控件”),可能来自遗留预激活行为 https://dom.spec.whatwg.org/#eventtarget-legacy-pre-activation-behavior,在事件通过其路径实际分派之前触发(步骤 12here https://dom.spec.whatwg.org/#dispatching-events, 临时链接 https://dom.spec.whatwg.org/#ref-for-eventtarget-legacy-pre-activation-behavior%E2%91%A0).

因此,即使事件的传播在捕获阶段停止在文档层(DOM 中的第一个目标),触发事件的默认行为new click事件于<input>将会发生:

let block_at_capture = false;
const span = document.querySelector("span");
const label = document.querySelector("label");
const input = document.querySelector("input");

span.onclick = (evt) => {
  console.log("clicked the span");
};

input.onclick = (evt) => {
  console.log("clicked the input");
};

label.addEventListener( "click", (evt) => {
  console.log("clicked the label in capturing phase");
}, true );

label.addEventListener( "click", (evt) => {
  console.log("clicked the label in bubbling phase");
}, false );

document.addEventListener( "click", (evt) => {
  if( evt.target !== span ) { return; } 
  if( block_at_capture ) {
    console.log("blocking at document capture");
    evt.stopPropagation();
  }
  block_at_capture = !block_at_capture;
}, true );
<input id="inp" type="checkbox">
<label for="inp"><span>click me</span></label>

也就是说,除非默认行为被阻止或链接在分派事件时被破坏......

请注意,即使没有<label>:

// The click event won't get called
document.querySelector("input").onclick = (evt) => 
  console.log("clicked on input");
// even though the default behavior ("change") will still happen
document.querySelector("input").onchange = (evt) =>
  console.log("changed input"); // will get called

document.addEventListener("click",
  (evt) => evt.stopPropagation(),
  true
);
<input type="checkbox">
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 event.stopPropagation() 不会阻止

  • 悬停此元素时隐藏元素后的伪元素

    我的菜单垂直放置在页面左侧和菜单之间 li 我有一个 after那是一个分隔符 我想要的是当我悬停元素本身 如果它是第一个元素 时隐藏 after 元素 或者当它是中间元素时隐藏上面和底部的元素 如果它是最后一个子元素 则隐藏 after前
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • Angular - CSS - 自定义类型=文件输入,如何使用按钮而不是标签?

    我制作了一个类型为 file 的自定义输入字段 因为我不喜欢默认的输入字段 为了实现这一目标 我做了
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • Jquery 数据表列总和

    我只是参考一下这个链接 https datatables net examples advanced init footer callback html了解如何获取 jquery 数据表中的列总计 但我已经完成了一半的项目 我在html页面
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 不可勾选的单选按钮与专有的复选框

    从 UI 角度来看 是拥有一组具有取消选中功能的单选按钮更好 还是拥有一组独占的复选框 意味着一次只能选中一个 更好 Update 我没想到对此会有如此负面的反应 如果我给出一个更接近其使用方式的示例 也许会有所帮助 我有一个充满数据绑定内
  • 如何创建适合屏幕宽度的等宽/高框? [复制]

    这个问题在这里已经有答案了 我正在尝试建立一个网站 其中有很多宽度和高度相等的框 例如 我有一个页面 其中并排有两个相同大小的框 简单的解决方案是将宽度和高度设置为 50vw 这在出现滚动条之前效果很好 我已经用谷歌搜索了几个小时 但无法理
  • PHP 表单 - 带验证蜜罐

    我有以下内容 效果很好 但对垃圾邮件机器人开放 我想放入蜜罐 而不是验证码 下面的代码适用于验证姓名 电子邮件 消息 但我无法让它与蜜罐一起工作 任何人都可以查看 蜜罐 代码并告诉我如何修复它吗 我希望表单给出 success2 不允许垃圾
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • HTML 锚点,禁用样式

    我有一些 html 锚链接代码 与文档的其余部分不同 我希望它看起来不是链接 有没有一种简单的方法可以禁用由于将文本包装在锚标记中而引起的样式更改 而不必强行使其相同 即 如果我更改正文字体样式 我不必也更改其他一些 link东西 将颜色设
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项
  • CSS溢出文本显示在几行中,没有断字

    我有一些长文本显示在 div 中 该 div 具有固定的宽度和高度 我希望文本显示在几行上 作为 div 高度 并且句子单词不会中断 一行中的单词前缀和下一行中的继续 此外 我想在末尾添加省略号最后一句话 CSS white space n

随机推荐