3

http://blog.movalog.com/a/javascript-toggle-visibility/

这是一个页面,其中包含一些代码和一个脚本,我在我的网站中使用了一个图片库,但是当尝试切换多个 div 的可见性时,它只适用于第一个。有人可以修复它以使用多个 div,我不知道 js :)

这是javascript

<script type="text/javascript">
<!--
    function toggle_visibility(id) {
       var e = document.getElementById(id);
       if(e.style.display == 'block')
          e.style.display = 'none';
       else
          e.style.display = 'block';
    }
//-->
</script>

这是链接的html代码

<tr><td><a href="#" onclick="toggle_visibility('nyc');">New York</a></td>
<td><a href="#" onclick="toggle_visibility('photoshop');">Photoshop Work</td>
<td><a href="#" onclick="toggle_visibility('photography');">Photography</td></tr>
<tr><td><a href="#" onclick="toggle_visibility('art');">Art Projects</td></tr>

等一下,这可能不起作用,因为它正在尝试通过“id”属性访问多个 div 的属性,它是否可以与 class 属性一起使用,如果是这样,我是否只需更改显示“id”的 java 脚本去“上课”

4

4 回答 4

6

看来你正在尝试类似的东西

<div id="a"></div>
<div id="a"></div>

toggle_visibility('a');

问题是每个 id 在文档中必须是唯一的,因此document.getElementById返回单个元素,而不是元素的集合。

然后,如果你想拥有多个具有相同 id 的元素,你应该使用类来代替。

<div class="a"></div>
<div class="a"></div>


function toggle_visibility(cl){
   var els = document.getElementsByClassName(cl);
   for (var i = 0; i < els.length; i++){
      var s = els[i].style;
      s.display = s.display === 'none' ? 'block' : 'none';
   }
}
toggle_visibility('a');

如果您想让它与多个类一起使用,请使用

var toggle_visibility = (function() {
   function toggle(cl) {
       var els = document.getElementsByClassName(cl);
       for(var i = 0; i < els.length; i++){
          var s = els[i].style;
          s.display = s.display === 'none' ? 'block' : 'none';
       }
   }
   return function(cl) {
      if (cl instanceof Array){
         for(var i = 0; i < cl.length; i++){
            toggle(cl[i]);
         }
      } else {
         toggle(cl);
      }
   };
})();
toggle_visibility('myclass');
toggle_visibility(['myclass1','myclass2','myclass3']);
于 2013-07-14T18:56:55.323 回答
4

您可以使用

function toggle_visibility(id) {
   function toggle(id){
      var el = document.getElementById(id);
      el.style.display = el.style.display==='none' ? 'block' : 'none';
   }
   if(id instanceof Array){
      for(var i=0; i<id.length; ++i){
         toggle(id[i]);
      }
   }else{
      toggle(id);
   }
}

并称它为

toggle_visibility('myid');
toggle_visibility(['myid1','myid2','myid3']);

另一种可能的方法是使用arguments变量,但这可能会减慢您的代码

function toggle_visibility() {
   function toggle(id){
      var el = document.getElementById(id);
      el.style.display = el.style.display==='none' ? 'block' : 'none';
   }
   for(var i=0; i<arguments.length; ++i){
      toggle(arguments[i]);
   }
}

并称它为

toggle_visibility('myid');
toggle_visibility('myid1','myid2','myid3');

如果您不想在toggle每次调用时都创建函数toggle_visibility(感谢@David Thomas),您可以使用

var toggle_visibility = (function(){
   function toggle(id){
      var el = document.getElementById(id);
      el.style.display = el.style.display==='none' ? 'block' : 'none';
   }
   return function(id){
      if(id instanceof Array){
         for(var i=0; i<id.length; ++i){
            toggle(id[i]);
         }
      }else{
         toggle(id);
      }
   };
})();
toggle_visibility('myid');
toggle_visibility(['myid1','myid2','myid3']);

或者

var toggle_visibility = (function(){
   function toggle(id){
      var el = document.getElementById(id);
      el.style.display = el.style.display==='none' ? 'block' : 'none';
   }
   return function(){
      for(var i=0; i<arguments.length; ++i){
         toggle(arguments[i]);
      }
   };
})();
toggle_visibility('myid');
toggle_visibility('myid1','myid2','myid3');
于 2013-07-14T18:42:45.960 回答
0

您要么需要循环遍历 id 列表,要么使用类名作为 toggle_visibilty 的参数----这意味着您必须编辑该函数。看起来现在您只在一个元素上调用 toggle_visibility。

jQuery 使这种事情变得更容易:

  <code>
  //selects all elements with class="yourClassName"
  jQuery(".yourClassName").toggle();

  //select all divs
   jQuery("div").toogle();

  //select all divs inside a container with id="myId"
 jQuery("#myId > div").toggle();
 </code>
于 2013-07-14T18:43:25.767 回答
0

您的代码中有一个非常愚蠢的错误。id在 td 标签中添加属性 id='nyc' 等,它应该可以正常工作

于 2013-07-14T19:47:39.007 回答