【问题标题】:Hide/Show many elements on single click by jQuery通过jQuery单击隐藏/显示许多元素
【发布时间】:2016-08-03 08:51:03
【问题描述】:

我已经为 Hide/Show 编写了几行 jQuery 代码,只需单击一下即可实现许多元素。但问题是;我有更多的图像类项目,所以我的脚本会很长,我的问题是如何简化或缩短我的脚本,我的意思是任何替代方案或任何新想法?请建议

HTML:

<div id="choose-color">
<span>
 <i class="images-red" style="">Red Image</i>
  <i class="images-blue" style="display: none;">Blue Image</i>
   <i class="images-pink" style="display: none;">Pink Image</i>
 <!-- many many images -->
</span>

 <button class="red">Red</button>
  <button class="blue">Blue</button>
   <button class="pink">Pink</button>

</div>

JS: live demo >

$("button.red").click(function(){
    $(".images-red").show();
    $(".images-blue, .images-pink").hide();
});
$("button.blue").click(function(){
    $(".images-red, .images-pink").hide();
    $(".images-blue").show();
});
$("button.pink").click(function(){
    $(".images-red, .images-blue").hide();
    $(".images-pink").show();
});

请建议我的脚本的简短代码。谢谢。

【问题讨论】:

    标签: javascript jquery html show-hide


    【解决方案1】:

    您可以通过在这些按钮上添加一个常见的class 来做到这一点,

    var iTags = $("#choose-color span i");
    $("#choose-color button.button").click(function(){
        iTags.hide().eq($(this).index("button.button")).show();
    });
    

    代码背后的概念是使用公共类为按钮绑定点击事件。现在在事件处理程序中,隐藏所有已缓存的i 元素,并显示与单击按钮具有相同索引的元素。

    DEMO

    更多详情:.eq().index(selector)

    如果您的元素顺序不同,i 和按钮的顺序都不同。然后你可以使用 javascript 的dataset 功能来解决这个问题。

    var iTags = $("#choose-color span i");
    $("#choose-color button.button").click(function(){
        iTags.hide().filter(".images-" + this.dataset.class).show()
    });
    

    为了实现这一点,您必须向按钮添加数据属性,例如,

    <button data-class="red" class="button red">Red</button>
    

    DEMO

    【讨论】:

    • 有效,eq 的任何使用文档是什么?
    • @Aariba 其实eq 将帮助您以索引方式访问元素集合。就像一个数组。我已在答案中附上了文档。看看吧。
    【解决方案2】:

    这行得通

      $("#choose-color button").click(function(){
            var _class = $(this).attr('class');
            $("#choose-color i").hide();
            $(".images-"+_class).show();
        });
    

    https://jsfiddle.net/455k1hhh/5/

    【讨论】:

      【解决方案3】:

      我知道这可能不是最漂亮的解决方案,但它应该可以完成这项工作。

      $("button").click(function(){
          var classname = $(this).attr('class');
          $("#choose-color span i").hide();
          $(".images-"+classname).show();
      });
      

      【讨论】:

        【解决方案4】:

        您可以使用data-* 属性执行以下操作,因为当您有更多相同颜色的元素时,使用按钮的索引将不起作用。如果您将来必须向按钮添加更多类,那么简单地使用整个 class 属性将不起作用。

        $("button").click(function() {
          var color = $(this).data('color');
          var targets = $('.images-' + color);
          targets.show();
          $("span i").not(targets).hide();
        });
        .hidden {
          display: none
        }
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <br/>
        <br/>
        <div id="choose-color">
          <span>
        <i class="images-red">Red Image</i>
        <i class="images-blue hidden">Blue Image</i>
        <i class="images-pink hidden">Pink Image</i>
        <!-- Many many image -->
        </span>
          <br/>
          <br/>
          <button data-color="red">Red</button>
          <button data-color="blue">Blue</button>
          <button data-color="pink">Pink</button>
        
        </div>

        【讨论】:

          【解决方案5】:

          让所有图像共享一个类是有意义的(例如.image)。然后,您只需为按钮和图像使用共享类;在此示例中,我使用了颜色名称。现在,当单击任何按钮时,您可以获取要显示的图像的类名。

          试试这个:

          $("button").click(function(){
              $(".image").hide();
              var className = $(this).attr("class");
              $("." + className).show();
          });
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
          <br/><br/>
          <div id="choose-color">
          <span>
          <i class="image red" style="">Red Image</i>
          <i class="image blue" style="display: none;">Blue Image</i>
          <i class="image pink" style="display: none;">Pink Image</i>
          <!-- Many many image -->
          </span>
          <br/><br/>
          <button class="red">Red</button>
          <button class="blue">Blue</button>
          <button class="pink">Pink</button>
          
          </div>

          【讨论】:

            【解决方案6】:

            由于依赖类名,您在这种方式下使未来的可扩展性有点困难,但这将解决您的迫切需求:

            <div id="myImages">
              <i class="images-red" style="">Red Image</i>
              <i class="images-blue" style="display: none;">Blue Image</i>
              <i class="images-pink" style="display: none;">Pink Image</i>
              <!-- Many many image -->
            </div>
            <div id="myButtons">
              <button class="red">Red</button>
              <button class="blue">Blue</button>
              <button class="pink">Pink</button>
            </div>
            
            $("#myButtons button").click(function(){
                    var color = $(this).attr("class");
                var imageClass = ".images-"+color;
                $('#myImages').children("i").each(function () {
                    $(this).hide();
                });
                $(imageClass).show();
            });
            

            这是JSFiddle

            编辑:请注意我是如何将按钮和图像包装在父 div 中的,以便您仅隔离要使用的按钮/图像。

            【讨论】:

              【解决方案7】:

              你可以试试这个:

              <div id="choose-color">
              <span>
              <i class="images-red" style="">Red Image</i>
              <i class="images-blue" style="display: none;">Blue Image</i>
              <i class="images-pink" style="display: none;">Pink Image</i>
              <!-- Many image -->
              </span>
              <br/><br/>
              <button class="colour red" onclick="myFunction(this)">Red</button>
              <button class="colour blue" onclick="myFunction(this)">Blue</button>
              <button class="colour pink" onclick="myFunction(this)">Pink</button>
              
              </div>
              

              JS:see here

              $(".colour").click(function(){
                  var colors = ["red", "blue", "pink"];
                  for (i = 0; i < colors.length; i++) {
                      if($(this).hasClass(colors[i])){
                          $(".images-"+colors[i]).show();
                      }else{
                          $(".images-"+colors[i]).hide();
                      }
                  }
              });
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-03-30
                • 1970-01-01
                • 2017-08-11
                • 2013-02-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多