当“ label”元素包含子“ span”时,单击标签会在子而不是父上触发

丹尼尔·布雷迪

在这个例子中,我创建了一个带有标题的标签组,并试图将一个点击监听器附加到每个标签上。我最终希望input每个内部都有一个label,但没有必要说明我不理解的行为。

根据是否将标签文本包装在标签中,我看到了不同的行为span

  • 单击没有孩子的标签时span,事件处理程序在label元素上被调用一次,正如我期望的那样
  • 单击带有子项a的标签span,事件处理程序仍仅被调用一次,但这一次是子项span 而不是父项label

在第二种情况下,我希望事件处理程序触发两次:一次触发父事件,一次触发label子事件span有人可以解释为什么添加此span元素似乎阻止事件处理程序传播给父级label吗?

var settingsGroup = document.getElementById("settings");
settingsGroup.querySelectorAll('.setting').forEach(function(setting) {
  var options = setting.querySelectorAll('label');

  options.forEach(function(option) {
    option.addEventListener("click", function(ev) {
      console.log(`${this.id} clicked: ${ev.target.tagName}`);
    });
  });
});
<div id="settings">
  <div class="setting" role="group">
    <div id="header">
      <em>
        A setting
      </em>
    </div>

    <label id="option-a">
      Option A
    </label>

    <label id="option-b">
      <span>
        Option B
      </span>
    </label>
  </div>
</div>

TJ人群

这很正常。e.target是作为事件目标的元素(span在情况下为)<label><span>...</span></label>事件目标span,然后事件传播(冒泡)到其父对象label,由事件处理程序在其父对象处进行处理。

如果要查看label,则按this原样id使用或使用e.currentTarget(事件当前传递到的元素)。

旧的DOM3事件规范中的此图非常有助于理解事件流:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在React上单击父元素时如何触发子元素?

当<a>包含子元素时,如何使用javascript获取<a>标签的'aria-label'属性

在单击子元素时,如何避免在父元素上触发事件?

单击父级时触发子级元素

新的子元素包含父元素

CSS:子元素不会在父元素上触发悬停

防止子元素在子菜单项单击上触发父事件

angular keyup事件不会在子组件上触发,而只会在父组件上触发

父Div小于其中包含的子元素

Javascript 单击侦听器,但不会在子元素上触发?

jQuery创建包含子元素的元素

xaml 引用包含其子元素的元素

子元素单击也会触发父元素-React.js

Angular4 /子元素未触发父(单击)事件

在使用jQuery Mobile的iOS和Android中,单击事件未在标签的子元素上触发

单击子视频元素而不影响视频控件时,防止触发<a>标签

on:click 父元素在任何子元素也被点击时被触发

单击其子级之一时,未在IE11中使用display flex的可聚焦父HTML元素上触发焦点事件

如何在单击子元素时隐藏父元素

animationend 事件也会在子元素的动画结束时触发?

如果单击子元素,则单击时不会触发

如何用元素包含的子元素替换元素?

防止在单击子元素时触发其父元素的click事件

父控制器上的$ scope。$ watch不会在子ng-select上触发

如何获取包含div的子元素的宽度?

更改子元素CSS包含活动类

NumPy - 删除包含相同元素的子数组

无法为 Label 元素的子元素设置样式

未捕获的HierarchyRequestError:无法在“节点”上执行“ insertBefore”:新的子元素包含父元素