javascript - addEventListener 随机工作,我不知道为什么

标签 javascript html css

我是 javascript 的新手,我试图在按下按钮时显示不同类型的元素。 html 按钮显示 html 元素,与 bootstrap 按钮和 wordpress 按钮相同。事情是脚本随机工作。如果我有 4 个不同的元素,只有其中 2 个是 html 元素时才有效。如果我添加更多元素,有时行得通有时行不通。

<div class="botones">
    <div class="todos">
        <p>TODOS</p>
    </div>

    <div class="ht">
        <p>HTML</p>
    </div>

    <div class="wp">
        <p>WORDPRESS</p>
    </div>

    <div class="bt">
        <p>BOOTSTRAP</p>
    </div>
</div>               

<div class="content-proyec">
    <div class="sample wp-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-cocinero.jpg"></a>
        </div>
    </div>

    <div class="sample bt-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-woocommerce.jpg"></a>
        </div>
    </div>

    <div class="sample bt-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-justicia.jpg"></a>
        </div>
    </div>

    <div class="sample ht-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-jane.jpg"></a>
        </div>
    </div>
</div>

var ht = document.querySelectorAll(".ht-pro");
    var wordpress = document.querySelectorAll(".wp-pro");
    var bootstrap = document.querySelectorAll(".bt-pro");
    var proyectos = document.querySelectorAll(".sample");


document.querySelectorAll(".botones div").forEach(div => {
    div.addEventListener('click', function() {
        if (div.className == "todos"){
            for (var i = 0; i <= proyectos.length; i++){
                ht[i].style.display = "block";  
                wordpress[i].style.display = "block";           
                bootstrap[i].style.display = "block";
            }
        }

        else if(div.className == "ht"){
            for (var i = 0; i <= proyectos.length; i++){
                ht[i].style.display = "block";
                wordpress[i].style.display = "none";                
                bootstrap[i].style.display = "none";
            }
        }

        else if(div.className == "wp") {
            for (var i = 0; i <= proyectos.length; i++){
                ht[i].style.display = "none";
                wordpress[i].style.display = "block";                       
                bootstrap[i].style.display = "none";
            }
        }

        else if(div.className == "bt") {
            for (var i = 0; i <= proyectos.length; i++){
                ht[i].style.display = "none";
                wordpress[i].style.display = "none";
                bootstrap[i].style.display = "block";           
            }
        }
    });
});

最佳答案

遍历所有 div 以隐藏和显示它们的代码无法维护和冗余,所有条件语句也是如此,这很快就会导致代码变得冗长。

您可以减少很多所需的 javascript 代码,并使用 CSS 来显示/隐藏您的 block

var btt = document.querySelector('.botones');
var cnt_proyec = document.querySelector('.content-proyec');

btt.addEventListener('click', function(ev) {
  if (ev.target.matches('button')) {
    cnt_proyec.dataset['current'] = ev.target.className;
  }
})
.sample {
  display: none;
}

[data-current="ht"] .ht-pro,
[data-current="wp"] .wp-pro,
[data-current="bt"] .bt-pro,
[data-current="todos"] .sample {
  display: block  ;
}
<div class="botones">
  <button class="todos">
    TODOS
  </button>

  <button class="ht">
    HTML
  </button>

  <button class="wp">
    WORDPRESS
  </button>

  <button class="bt">
    BOOTSTRAP
  </button>
</div>



<div class="content-proyec">
    <div class="sample wp-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-cocinero.jpg" alt="wp-pro"></a>
        </div>
    </div>

    <div class="sample bt-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-woocommerce.jpg" alt="bt-pro"></a>
        </div>
    </div>

    <div class="sample bt-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-justicia.jpg" alt="bt-pro"></a>
        </div>
    </div>

    <div class="sample ht-pro">
        <div class="sample-img">
            <a href=""><img src="img/proyectos/proyecto-jane.jpg" alt="ht-pro"></a>
        </div>
    </div>
</div>

首先,你应该使用真正的<button>元素而不是 div(当然,还可以根据您的喜好设置样式)也是为了可访问性。

然后您只需要在按钮包装器元素上捕获点击事件并检测被点击按钮的类名即可。

将该类名用作 data-current proyec 元素上的属性,并使用该属性通过 CSS 正确隐藏和显示 block 。

关于javascript - addEventListener 随机工作,我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57181025/

相关文章:

javascript - 检查具有相同类名的多个元素的值

javascript - 在youtube iFrame中访问 'Stats for nerds'数据

javascript - 通过原始 Javascript 获取 HTML 属性值

javascript - 如何垂直居中绝对定位的缩放元素?

html - 当父 div 值为 table 或 flex 时,如何给两个 div 之间的空间?

css - Mozilla FF 滚动条问题与 ember-scrollable 插件

javascript - 将 javascript 弹出函数链接到超链接标记

javascript - 寻找一个可以下载 HTML 和所有资源的应用程序

javascript - 是否有足够智能的 jquery 上下文菜单插件来处理窗口边框?

javascript - event.target.result 是空的?