click事件不适用于内部标记元素

伊万·马琴科(Ivan Marchenko)

这是我正在使用的标记

<div class="checkout-row__form-column__billing">
  <div class="checkout-row__form-column__billing__title billing-collapse collapse-btn">
     <div class="checkout-row__form-column__billing__title__arrow">
       <i class="fa fa-chevron-right" aria-hidden="true"></i>
     </div>
   <h2>1. Billing Details</h2>
</div>
<div class="checkout-row__form-column__shipping__content shipping-collapse-content collapse-target"></div>
<div class="checkout-row__form-column__shipping">
  <div class="checkout-row__form-column__shipping__title shipping-collapse collapse-btn">
     <div class="checkout-row__form-column__shipping__title__arrow">
       <i class="fa fa-chevron-right" aria-hidden="true"></i>
     </div>
   <h2>2. Shipping Details</h2>
</div>
<div class="checkout-row__form-column__shipping__content shipping-collapse-content collapse-target"></div>

所有这些标记都用封装divcheckout-row__form-column因此,我要抓住父包装器,点击“我将目标与匹配” .collapse-btn然后我对同级的同级进行切换.collapse-target除了在问题上我无法超越之外,效果很好。如果单击内部元素,则不会发生该事件。

这是我的js

parent = document.querySelector('.checkout-row__form-column');
    parent.addEventListener('click', (e)=>{
      if (e.target.matches('.collapse-btn')) {
        e.stopPropagation();
        
        e.target.nextElementSibling.classList.toggle('hide');
      }
    });

使用这些代码,如果我不单击ielement或,就可以切换类h2我该如何编写JavaScript,如果我单击内的任意位置,将会触发该事件e.target

任何帮助都是同志们的赞赏。

优素福

您的代码仅检查元素是否event.target.collapse-btn您还需要检查clicked元素是否是该元素的后代.collapse-btn元素。

为获得所需的结果,可以使用两个条件来检查theevent.target.collapse-btn其后代还是任意后代。要检查后代元素,请使用通用选择器*

parent.addEventListener('click', (e) => {
  if (
       e.target.matches('.collapse-btn') || 
       e.target.matches('.collapse-btn *')
  ) {
     // code
  }
});

演示版

以下代码段显示了一个示例:

const parent = document.querySelector('.container');

parent.addEventListener('click', e => {  
  if (
      e.target.matches('.collapse-btn') ||
      e.target.matches('.collapse-btn *') 
  ) {
    parent.classList.toggle('active');
  }
});
.container {
  background: #eee;
  width: 120px;
  height: 120px;
}

.container.active {
  border: 2px solid;
}

.collapse-btn {
  background: #999;
  padding: 10px;
}

.collapse-btn span {
  background: #fc3;
  font-size: 1.3rem;
  cursor: pointer;
}
<div class="container">
  <div class="collapse-btn">
    <span>Click</span>
  </div>
</div>

您也可以将选择器放入数组中,然后使用.some()方法检查是否event.target与数组中的选择器匹配。

const selectors = ['.collapse-btn', '.collapse-btn *'];

parent.addEventListener('click', e => {
  if (selectors.some(s => e.target.matches(s))) {
    // code
  }
});

演示版

以下代码段显示了一个示例:

const parent = document.querySelector('.container');

parent.addEventListener('click', e => {
  const selectors = ['.collapse-btn', '.collapse-btn *'];

  if (selectors.some(s => e.target.matches(s))) {
    parent.classList.toggle('active');
  }
});
.container {
  background: #eee;
  width: 120px;
  height: 120px;
}

.container.active {
  border: 2px solid;
}

.collapse-btn {
  background: #999;
  padding: 10px;
}

.collapse-btn span {
  background: #fc3;
  font-size: 1.3rem;
  cursor: pointer;
}
<div class="container">
  <div class="collapse-btn">
    <span>Click</span>
  </div>
</div>

替代解决方案

而不是使用的.matches()方法,使用的组合Element.closest()Node.contains()方法,以检查是否event.target.collapse-btn元素或者是一个子元素.collapse-btn的元素。

为此,您需要执行两个步骤:

  1. 您首先需要获取,.collapse-btn它是的最接近的祖先event.target

  2. 之后,您需要检查是否event.target是在步骤1中选择的按钮的后代。

码:

parent.addEventListener('click', (e) => {
   const targetCollapseBtn = e.target.closest('.collapse-btn');

   if (targetCollapseBtn && targetCollapseBtn.contains(e.target)) {
       ...
   }
});

如果event.target.collapse-btn自己的话

e.target.closest('.collpase-btn')

将返回e.target,即.collapse-btn

targetCollapseBtn.contains(e.target)

也会返回true,因为.contains()即使作为参数传递给它的节点与.contains()调用方法的节点相同,该方法也返回true

因此.closest().contains()以这种方式使用方法涵盖了两个用例,即何时.collapse-btn单击或何时单击其任何后代元素。

演示版

以下代码段显示了一个简单的示例:

const parent = document.querySelector('.container');

parent.addEventListener('click', e => {
  const targetCollapseBtn = e.target.closest('.collapse-btn');

  if (targetCollapseBtn && targetCollapseBtn.contains(e.target)) {
    parent.classList.toggle('active');
  }
});
.container {
  background: #eee;
  width: 120px;
  height: 120px;
}

.container.active {
  border: 2px solid;
}

.collapse-btn {
  background: #999;
  padding: 10px;
}

.collapse-btn span {
  background: #fc3;
  font-size: 1.3rem;
  cursor: pointer;
}
<div class="container">
  <div class="collapse-btn">
    <span>Click</span>
  </div>
</div>

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Click事件不适用于动态生成的元素

来自分类Dev

jQuery click事件不适用于动态添加的元素

来自分类Dev

Click事件不适用于动态添加的子元素

来自分类Dev

jQuery下拉菜单-.click事件适用于<a>标记,但不适用于<a>内的<span>

来自分类Dev

Click事件不适用于SVG中路径的标记端

来自分类Dev

Click事件不适用于SVG中路径的标记端

来自分类Dev

点击事件不适用于附加到行尾的标记

来自分类Dev

单击事件不适用于锚标记

来自分类Dev

jQuery-动态添加的元素不适用于mouseleave,click事件

来自分类Dev

Click事件不适用于动态添加的按钮

来自分类Dev

jQuery lightbox(featherlight)不适用于click事件

来自分类Dev

jQuery函数.on()不适用于“ click”事件

来自分类Dev

jQuery-on('click')事件不适用于动态对象

来自分类Dev

Vue @click 事件不适用于显示模态

来自分类Dev

ng-click内部指令不适用于infowindow

来自分类Dev

jQuery事件不适用于动态附加的元素

来自分类Dev

点击事件不适用于新插入的元素

来自分类Dev

change事件不适用于动态生成的元素-jQuery

来自分类Dev

事件不适用于通过Ajax放入的元素

来自分类Dev

多个元素的AddEventListener不适用于“焦点”事件

来自分类Dev

jQuery事件不适用于新创建的元素

来自分类Dev

onclick事件不适用于svg元素

来自分类Dev

Jquery 事件不适用于 append() 中的元素

来自分类Dev

jQuery不适用于ng-view内部的元素

来自分类Dev

CSS:active不适用于<a>标记

来自分类Dev

标记不适用于16.04

来自分类Dev

onclick事件不适用于选项

来自分类Dev

preventDefault()不适用于更改事件

来自分类Dev

QuerySelectorAll不适用于onclick事件

Related 相关文章

热门标签

归档