I have a small piece of javascript to add a css class to a button element that already contains two classes under the top level of a menu when clicking outside that menu.
I understood that writing the two classes as below should select only elements that have both classes. It does what has been asked on the element I specify, BUT, it’s also changing the css class of buttons at a lower level.
Here is my code (EDITED as the top line was in my draft but not showing here:)
document.getElementById("myId").addEventListener("click", addClass); function addClass(event) { // the click is triggered outside the menu if(event.target.type != 'button') { // these are top level buttons only var buttons = document.getElementsByClassName('btn-level-1 clicked'); for (var i = 0; i < buttons.length; i++) { buttons[i].classList.add('not-clicked'); buttons[i].classList.remove('clicked'); } } }
It’s adding the ‘not-clicked’ class to lower (child) level buttons with the css class 'btn-level-2 clicked'
as well.
Also, having added the ‘not-clicked’ class it does not remove the ‘clicked’ class.
No jQuery, please. I’m using vanilla JS only.
Thank you.
UPDATE: It works, so please add your answer so I can accept it! Many thanks.
Advertisement
Answer
Change your class selector to querySelectorAll.
document.getElementById("myId").addEventListener("click", addClass); function addClass(event) { if(event.target.type != 'button') { var buttons = document.querySelectorAll('.btn-level-1.clicked'); for (var i = 0; i < buttons.length; i++) { buttons[i].classList.add('not-clicked'); buttons[i].classList.remove('clicked'); } } }