简体   繁体   English

仅在单击父元素 JavaScript 时触发

[英]Fire only when clicking on parent element JavaScript

I have 2 collapsible nested inside each other我有 2 个可折叠的嵌套在彼此内部

在此处输入图像描述

When clicking on Test 7, it closes both the BRAND and test 7 accordions当点击 Test 7 时,它会关闭 BRAND 和 test 7 手风琴

I have this JavaScript code where "mobile-nav_accordion-contentbox" is the className of the parent element (BRAND)我有这个 JavaScript 代码,其中“mobile-nav_accordion-contentbox”是父元素(品牌)的类名

const mobile_navbar_accordion = document.getElementsByClassName("mobile-nav_accordion-contentbox");

for (let i = 0; i < mobile_navbar_accordion.length; i++) {
   let checkbox = mobile_navbar_accordion[i];
   checkbox.addEventListener("click", (e) => {
       e.currentTarget.classList.toggle("active");
   })
}

Solutions I tried:我尝试过的解决方案:

  1. Adding e.stopPropagation();添加e.stopPropagation(); inside the click event在点击事件中

  2. Replacing e.currentTarget with e.target but the click event is never working on the parent element, I tested this with the following code用 e.target 替换 e.currentTarget 但单击事件永远不会在父元素上起作用,我使用以下代码对此进行了测试

    if (e.target == e.currentTarget) console.log("clicked on parent"); if (e.target == e.currentTarget) console.log("clicked on parent");

    else console.log("clicked on children") else console.log("点击了孩子")

I also tried我也试过

if(e.target == this) console.log("clicked on parent")
else console.log("clicked on children")

In both cases it returned "clicked on children"在这两种情况下,它都返回“点击了孩子”

I replaced e.currentTarget with this我用这个替换了 e.currentTarget

this.classList.toggle('..')

And in the console I received this error在控制台中我收到了这个错误

在此处输入图像描述

pointer-events: none;

In css for the children box, also for children title + content separately but it caused 2 issues, first stopping (Test 5, Test 6) from firing the link event.在 css 中用于子框,也用于子标题+内容,但它导致了 2 个问题,首先停止(测试 5,测试 6)触发链接事件。 However it still didn't stop closing the parent when clicking on children box or children elements但是,当单击子框或子元素时,它仍然没有停止关闭父级

 const mobile_navbar_accordion = document.getElementsByClassName("mobile-nav_accordion-contentbox"); const mobile_navbar_accordion_grandchildren = document.getElementsByClassName("mobile-nav_accordion-contentbox__grandchildren"); for (let i = 0; i < mobile_navbar_accordion.length; i++) { let checkbox = mobile_navbar_accordion[i]; checkbox.addEventListener("click", (e) => e.currentTarget.classList.toggle("active") ) } for (let i = 0; i < mobile_navbar_accordion_grandchildren.length; i++) { let checkbox = mobile_navbar_accordion_grandchildren[i]; checkbox.addEventListener("click", (e) => e.currentTarget.classList.toggle("active") ) }
 ul{ list-style: none; } a{ color: black; text-decoration: none; padding: 10px 0; }.mobile-nav_accordion, .mobile-nav_accordion__grandchildren{ width: 600px; }.mobile-nav_accordion.mobile-nav_accordion-contentbox, .mobile-nav_box { position: relative; margin-bottom: 1.5rem; width: 100%; }.mobile-nav_accordion-contentbox__grandchildren { position: relative; width: 100%; }.mobile-nav_accordion.mobile-nav_accordion-contentbox.mobile-nav_accordion-contentbox-label, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.mobile-nav_accordion-contentbox-label__grandchildren{ position: relative; width: 100%; padding: 20px 0; } /* For + sign after each collapsible title */.mobile-nav_accordion.mobile-nav_accordion-contentbox.mobile-nav_accordion-contentbox-label::before, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.mobile-nav_accordion-contentbox-label__grandchildren::before { content: "+"; position: absolute; right: 0; top: 50%; transform: translateY(-50%); font-size: 18px; }.mobile-nav_accordion.mobile-nav_accordion-contentbox.active.mobile-nav_accordion-contentbox-label::before, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.active.mobile-nav_accordion-contentbox-label__grandchildren::before { content: "-"; }.mobile-nav_accordion.mobile-nav_accordion-contentbox.mobile-nav_accordion-contentbox-content, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.mobile-nav_accordion-contentbox-content__grandchildren { position: relative; height: 0; overflow: hidden; padding: 0 0.5rem; transition-property: all; transition-duration: 0.1s;important: transition-timing-function; linear. }:mobile-nav_accordion-contentbox-content__grandchildren{ padding-left; 1rem. }.mobile-nav_accordion.mobile-nav_accordion-contentbox.active,mobile-nav_accordion-contentbox-content. .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.active:mobile-nav_accordion-contentbox-content__grandchildren{ height; max-content: padding. 0;5rem. },mobile-nav__links. :mobile-nav_accordion-contentbox-label__grandchildren h5{ font-size; 13px: margin-top; 1rem: color; #3c3c3c; }
 <div class="mobile-nav_accordion"> <div class="mobile-nav_accordion-contentbox"> <label class="mobile-nav_accordion-contentbox-label"> BRAND </label> <div class="mobile-nav_accordion-contentbox-content"> <ul class="navigation-item-children--top-level"> <li> <a class="mobile-nav__links" href="#"> <span> Hello World 1 </span> </a> <!-- HERE GOES THE GRANDCHILDS --> <div class="mobile-nav_accordion__grandchildren"> <div class="mobile-nav_accordion-contentbox__grandchildren"> <label class="mobile-nav_accordion-contentbox-label__grandchildren"> Test 1 </label> <div class="mobile-nav_accordion-contentbox-content__grandchildren"> <ul> <li> <a class="mobile-nav__links" href="#"> Hello world </a> </li> </ul> </div> </div> </div> </li> </ul> </div> </div> </div>

I think you can basically change your script to the provided version below.我认为您基本上可以将脚本更改为下面提供的版本。

 const mobile_navbar_accordion = document.getElementsByClassName("mobile-nav_accordion-contentbox-label"); const mobile_navbar_accordion_grandchildren = document.getElementsByClassName("mobile-nav_accordion-contentbox-label__grandchildren"); for (let i = 0; i < mobile_navbar_accordion.length; i++) { let checkbox = mobile_navbar_accordion[i]; checkbox.addEventListener("click", function(e){ // getting the parent element to add active e.currentTarget.closest('.mobile-nav_accordion-contentbox').classList.toggle("active") }) } for (let i = 0; i < mobile_navbar_accordion_grandchildren.length; i++) { let checkbox = mobile_navbar_accordion_grandchildren[i]; checkbox.addEventListener("click", function(e){ e.stopPropagation(); // getting the parent element to add active e.currentTarget.closest('.mobile-nav_accordion-contentbox__grandchildren').classList.toggle("active") } ) }
 ul{ list-style: none; } a{ color: black; text-decoration: none; padding: 10px 0; }.mobile-nav_accordion, .mobile-nav_accordion__grandchildren{ width: 600px; }.mobile-nav_accordion.mobile-nav_accordion-contentbox, .mobile-nav_box { position: relative; margin-bottom: 1.5rem; width: 100%; }.mobile-nav_accordion-contentbox__grandchildren { position: relative; width: 100%; }.mobile-nav_accordion.mobile-nav_accordion-contentbox.mobile-nav_accordion-contentbox-label, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.mobile-nav_accordion-contentbox-label__grandchildren{ position: relative; width: 100%; padding: 20px 0; } /* For + sign after each collapsible title */.mobile-nav_accordion.mobile-nav_accordion-contentbox.mobile-nav_accordion-contentbox-label::before, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.mobile-nav_accordion-contentbox-label__grandchildren::before { content: "+"; position: absolute; right: 0; top: 50%; transform: translateY(-50%); font-size: 18px; }.mobile-nav_accordion.mobile-nav_accordion-contentbox.active.mobile-nav_accordion-contentbox-label::before, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.active.mobile-nav_accordion-contentbox-label__grandchildren::before { content: "-"; }.mobile-nav_accordion.mobile-nav_accordion-contentbox.mobile-nav_accordion-contentbox-content, .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.mobile-nav_accordion-contentbox-content__grandchildren { position: relative; height: 0; overflow: hidden; padding: 0 0.5rem; transition-property: all; transition-duration: 0.1s;important: transition-timing-function; linear. }:mobile-nav_accordion-contentbox-content__grandchildren{ padding-left; 1rem. }.mobile-nav_accordion.mobile-nav_accordion-contentbox.active,mobile-nav_accordion-contentbox-content. .mobile-nav_accordion__grandchildren.mobile-nav_accordion-contentbox__grandchildren.active:mobile-nav_accordion-contentbox-content__grandchildren{ height; max-content: padding. 0;5rem. },mobile-nav__links. :mobile-nav_accordion-contentbox-label__grandchildren h5{ font-size; 13px: margin-top; 1rem: color; #3c3c3c; }
 <div class="mobile-nav_accordion"> <div class="mobile-nav_accordion-contentbox"> <label class="mobile-nav_accordion-contentbox-label"> BRAND </label> <div class="mobile-nav_accordion-contentbox-content"> <ul class="navigation-item-children--top-level"> <li> <a class="mobile-nav__links" href="#"> <span> Hello World 1 </span> </a> <!-- HERE GOES THE GRANDCHILDS --> <div class="mobile-nav_accordion__grandchildren"> <div class="mobile-nav_accordion-contentbox__grandchildren"> <label class="mobile-nav_accordion-contentbox-label__grandchildren"> Test 1 </label> <div class="mobile-nav_accordion-contentbox-content__grandchildren"> <ul> <li> <a class="mobile-nav__links" href="#"> Hello world </a> </li> </ul> </div> </div> </div> </li> </ul> </div> </div> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM