Javascript 如何根据用户选择显示/排序特定的div

Javascript 如何根据用户选择显示/排序特定的div,javascript,jquery,html,css,Javascript,Jquery,Html,Css,抱歉,如果标题没有准确描述我正在尝试做什么。至少可以说,我是个新手!为了帮助您理解我试图实现的目标,请阅读下面的示例 我有一个div列表,每个div可能都有一系列我将称之为“tag”的标签。对于本例,我将使用红色、蓝色和绿色作为可能的标记。每个标记还有一个链接到它的按钮,用户可以单击该按钮来过滤显示的div。当按钮为“开”时,它将显示带有该特定标记的div,但当按钮为“关”时,它将隐藏带有该标记的内容。除非内容有另一个当前已打开的标记 瑞德:开 蓝色:关 格林:开 第一组:红色 第2组:蓝色

抱歉,如果标题没有准确描述我正在尝试做什么。至少可以说,我是个新手!为了帮助您理解我试图实现的目标,请阅读下面的示例

我有一个div列表,每个div可能都有一系列我将称之为“tag”的标签。对于本例,我将使用红色、蓝色和绿色作为可能的标记。每个标记还有一个链接到它的按钮,用户可以单击该按钮来过滤显示的div。当按钮为“开”时,它将显示带有该特定标记的div,但当按钮为“关”时,它将隐藏带有该标记的内容。除非内容有另一个当前已打开的标记

瑞德:开

蓝色:关

格林:开


第一组:红色

第2组:蓝色

第3组:绿色

第四组:红色、蓝色

第五组:蓝色、绿色

第六组:绿色、红色

由于蓝色标记已关闭,因此除DIV 2外,将显示每个DIV。它仍然显示DIV 4和DIV 5的原因是红色和绿色标记仍处于打开状态。如果要同时关闭红色标记,则只会显示div 3、5和6,因为只有绿色标记处于打开状态

我相信有一种更优雅的方式来解释上述内容,但希望它能让人明白这一点。我一直在寻找一个解决方案,以实现这一点,但尚未找到它。有很多列表过滤器使用搜索框,但这不适合我的需要


如果有人能给我指出正确的方向,我会很感激的

我认为最简单的方法是将“标记”直接实现为类。任何div都可以有多个类,因此class=“red-blue”没有问题

然后,如果合适的话,您只需要一些javascript就可以将类的display更改为none


查看javascript的getElementsByCassName()函数或jQuery的类选择器,以获得所有div,其中一个类等于刚刚更改的内容,并对其进行迭代,计算每个“display”样式属性的新值。

因此这里有一个逻辑或:

如果红色、蓝色或绿色未关闭,则显示div


因此,这意味着当您在div中循环时,每个标记都需要有一个内循环,当您偶然发现一个未关闭的标记时,该内循环可能会中断,这意味着将显示div。否则,如果在查看所有标记后没有发现任何未关闭的标记,则必须隐藏div。

我认为单用CSS无法解决此问题,因为您有一些具有多种颜色的div。您可以在CSS中模拟它,但它可能不是很优雅。我已经很长时间没有使用JavaScript了,或者根本没有使用JavaScript,因此解决方案可能需要一些整理,或者可能需要检查语法,但我认为我有一个潜在的框架可以使用

您可以设置三个颜色按钮,并将onClick(或jQuery等效项)设置为一个函数

<input type="button" id="buttonRed" name="buttonRed" onclick="theSwitch('red')" />
<input type="button" id="buttonGreen" name="buttonGreen" onclick="theSwitch('green')" />
<input type="button" id="buttonBlue" name="buttonBlue" onclick="theSwitch('blue')" />
理论上(因为我没有测试这个),我们将一个变量改为零,因为我们想要比较具有多种颜色的
div
s的值。我相信,这就是检查这两种颜色的方法:

if (redStatus === 0 && greenStatus === 0) {
    document.getElementById("divRedGreen").style.display = "none";
}
正如您在这里看到的,它需要在隐藏之前按下两个按钮,这是您想要的效果


你可以做很多不同的事情,这取决于你要做的事情或是最有条理的事情,但我认为这可能会有帮助,因为这是一个松散的基础。

下面是一个关于如何做到这一点的工作示例:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> 
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
   <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js"></script> 

   <script type="text/javascript"> 
   //<!--
      $(document).ready(function() {
         var buttons = {
            'red': $('<input type="button"></input>').val('RED: on'),
            'green': $('<input type="button"></input>').val('GREEN: on'),
            'blue': $('<input type="button"></input>').val('BLUE: on')
         };
         var tags = [];
         var _updateTaggedElements = function() {
            // somewhat optimized if...then...else
            if (0 == tags.length) {
               $('#taggedElements > .red,.green,.blue').hide();
            } else {
               $('#taggedElements')
                  .find('.' + tags.join(',.')).show().end()
                  .find(':not(.' + tags.join(',.') + ")").hide()
               ;
            }
         };

         $.each(buttons, function(c,el) {
            tags.push(c); // all tagged elements initially visible...
            $('#buttons').append(el.click(function() {
               var state = /off$/.test(el.val());
               var tagIndex = $.inArray(c, tags);
               el.val(c.toUpperCase() + ": " + (state ? 'on' : 'off'));

               if (state) {
                  if (-1 == tagIndex) {
                     tags.push(c);
                  }
               } else if (-1 != tagIndex) {
                  tags.splice(tagIndex, 1);
               }

               _updateTaggedElements();
            }));
         });

      });
   //-->
   </script>    
   <title>Button selector test</title>
</head> 
<body> 
   <div id="buttons"></div>

   <div id="taggedElements">
      <div class="red">DIV 1: Red</div>
      <div class="blue">DIV 2: Blue</div>
      <div class="green">DIV 3: Green</div>
      <div class="red blue">DIV 4: Red, Blue</div>
      <div class="blue green">DIV 5: Blue, Green</div>
      <div class="green red">DIV 6: Green, Red</div>
   </div>

</body> 
</html>

//
按钮选择器测试
第一组:红色
第2组:蓝色
第3组:绿色
第四组:红色、蓝色
第五组:蓝色、绿色
第六组:绿色、红色

当然,可以根据您的需要修改它,但是正如您所看到的,它非常容易实现,而且很小。使用
标记
数组,你可以拥有你想要的任意多个标记组合。

使用类是我最初尝试的,尽管我承认我只是使用CSS而没有使用Javascript(这是一种概念证明)。我遇到的问题是,如果蓝色是关闭的,绿色是打开的,“蓝绿色”是关闭的。如果我们使用上面的例子,只有div1、3和6会显示,因为它们没有蓝色作为标记。我想CSS就是这样处理的。我查看了GetElementsByCassName,它快把我逼疯了:)document.getElementById()可以工作,但document.getElementsByCassName()不能。续。。。。。。我正在使用此处提供的.getElementsByClassName的代码:如果我使用document.getElementsByClassName(“红色”).style.display=“无”;使用上面的代码为我提取类名,它不应该工作吗?这对我来说只是千头万绪中的一个。@Edvard D:我实际上不是一个javascript专家,但我认为您必须迭代从getElementsByClassName返回的内容,而不仅仅是尝试.style.display返回的数组。(如果我错了,请纠正我)。如果我理解正确,JavaScript函数应该像我有标记一样分成多个部分,因此在上面的示例中,有三个部分。每个标签中都应该有一个循环来遍历所有可能的组合,例如红色标签(红色、红蓝色、蓝红色、红绿色、绿红色)。对于我添加的每个标签,我需要为其他标签添加另一种可能性,因此如果添加了新的黄色标签,我需要两种新的组合(红-黄,黄-红)。这是正确的还是我完全没有听清你的解释?我记得你的标签收集在一个对象{}中(即标签['Blue']-真/假)。无论何时打开或关闭标记,您都会调用一个在div中迭代的函数,对于每个div,您都会调用一个返回true/false的函数,具体取决于其中是否至少有一个标记未关闭。假设您的div中有“tagname”对象,那么这个内部函数将调用div.querySelectorAll(
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> 
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
   <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js"></script> 

   <script type="text/javascript"> 
   //<!--
      $(document).ready(function() {
         var buttons = {
            'red': $('<input type="button"></input>').val('RED: on'),
            'green': $('<input type="button"></input>').val('GREEN: on'),
            'blue': $('<input type="button"></input>').val('BLUE: on')
         };
         var tags = [];
         var _updateTaggedElements = function() {
            // somewhat optimized if...then...else
            if (0 == tags.length) {
               $('#taggedElements > .red,.green,.blue').hide();
            } else {
               $('#taggedElements')
                  .find('.' + tags.join(',.')).show().end()
                  .find(':not(.' + tags.join(',.') + ")").hide()
               ;
            }
         };

         $.each(buttons, function(c,el) {
            tags.push(c); // all tagged elements initially visible...
            $('#buttons').append(el.click(function() {
               var state = /off$/.test(el.val());
               var tagIndex = $.inArray(c, tags);
               el.val(c.toUpperCase() + ": " + (state ? 'on' : 'off'));

               if (state) {
                  if (-1 == tagIndex) {
                     tags.push(c);
                  }
               } else if (-1 != tagIndex) {
                  tags.splice(tagIndex, 1);
               }

               _updateTaggedElements();
            }));
         });

      });
   //-->
   </script>    
   <title>Button selector test</title>
</head> 
<body> 
   <div id="buttons"></div>

   <div id="taggedElements">
      <div class="red">DIV 1: Red</div>
      <div class="blue">DIV 2: Blue</div>
      <div class="green">DIV 3: Green</div>
      <div class="red blue">DIV 4: Red, Blue</div>
      <div class="blue green">DIV 5: Blue, Green</div>
      <div class="green red">DIV 6: Green, Red</div>
   </div>

</body> 
</html>