简体   繁体   English

EventListener 不适用于所有元素

[英]EventListener doesnt work for all elements

My problem is that I'm stuck on trying to make several elements move onclick .我的问题是我一直试图让几个元素移动onclick When I click on any of my tags only the first one actually moves.当我点击我的任何标签时,只有第一个标签实际移动。 I know I've probably made a mistake somewhere in the code but I can't find it, would be great if you guys can help me:) My code basically looks something like this:我知道我可能在代码的某个地方犯了一个错误,但我找不到它,如果你们能帮助我会很棒:) 我的代码基本上看起来像这样:

    var my_atag0 = document.createElement('a');
    my_atag0.classList.add('nav_button');
    
var my_atag1 = document.createElement('a');
    my_atag1.classList.add('nav_button');   

var my_atag2 = document.createElement('a');  
    my_atag2.classList.add('nav_button'); 

var my_atag3 = document.createElement('a');
    my_atag3.classList.add('nav_button');


function navToggle() {
    var navStatus = false;
    
    if (navStatus == false){
        document.querySelector(".nav_button").style.marginTop = "100px";
        navStatus = true;
    } 
    else if (navStatus == true) {
        document.querySelector(".nav_button").style.marginTop = "0px";
        navStatus = false;
        
    }
}

document.querySelectorAll(".nav_button").forEach(a => {a.addEventListener("click", function() {
    navToggle()
})})
if (navStatus == false){
        document.querySelector(".nav_button").style.marginTop = "100px";
        navStatus = true;
    } 
    else if (navStatus == true) {
        document.querySelector(".nav_button").style.marginTop = "100px";
        navStatus = false;
        
    }

here, you are using queryselector to target all the elements.在这里,您使用 queryselector 来定位所有元素。 im sure it doesnt work because using querySelector to target a class will return an array containing the elements我确定它不起作用,因为使用querySelector来定位 class 将返回一个包含元素的数组

try using querySelectorAll and loop through them to change the styles instead尝试使用querySelectorAll并遍历它们以更改 styles

const navButtons = document.querySelectorAll(".nav_button");
let navStatus = false;
if (navStatus === false){
        for (var i = 0; i < navbuttons.length; i++) {
          navbuttons[i].style.marginTop = 100px;
        }
        navStatus = true;
    } 
    else if (navStatus === true) {
        for (var i = 0; i < navbuttons.length; i++) {
          navbuttons[i].style.marginTop = 100px;
        }
        navStatus = false;
        
    }

sidenote: its not good to use var , use const and let instead旁注:使用var不好,改用constlet

and put let navStatus = false;let navStatus = false; outside the function because sometimes putting it in the function doesn't work在 function 之外,因为有时将其放入 function 不起作用

querySelector method can get only first element of selected ones. querySelector 方法只能获取所选元素的第一个元素。
querySelectorAll can get NodeList object of selected elements. querySelectorAll 可以获得被选元素的NodeList object。
this is an example for you这是给你的一个例子

if(...){
  document.querySelectorAll(".nav_button").forEach(x => x.style.marginTop = "100px");
  navStatus = true;
}

and in extra, you can use this way instead of setting value in if ~ else scope此外,您可以使用这种方式而不是在 if ~ else scope 中设置值

if(boolean){
  ...
  // when true
}else {
  ...
  // when false
}

boolean = !boolean;
// toggles true and false

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

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