2012-01-25 63 views
2

如何缩短此代码?每个CSS选择器增加+1。除非选择了.mug(x),否则所有Bio的div都是隐藏的。如何缩短此javascript代码?显示隐藏多个div

感谢

 <script type='text/javascript'> 
       $(document).ready(function() { 
        $(".mug1").click(function() { 
         $("#bios div").hide(); 
         $(".bio1").show();      
        });      
        $(".mug2").click(function() { 
         $("#bios div").hide(); 
         $(".bio2").show();      
        });      
        $(".mug3").click(function() { 
         $("#bios div").hide(); 
         $(".bio3").show();      
        });      

      }); 
     </script> 

     <h2>Meet the team</h2> 

     <div id="mugshots"> 
      <img src="images/img-mugshot.jpg" alt="mug" class="mug1"/> 
      <img src="images/img-mugshot.jpg" alt="mug" class="mug2"/> 
      <img src="images/img-mugshot.jpg" alt="mug" class="mug3"/> 
     </div> 

     <div id="bios"> 
      <div class="bio1"></div> 
          <div class="bio2"></div> 
          <div class="bio3"></div> 
        </div> 
+0

您基本上正在实现[jQuery UI Accordion](http://jqueryui.com/demos/accordion/) – jrummell

回答

1

只是用食指和添加为你想要的:

$('#mugshots>img').on('click', function() { 
    $("#bios div").hide(); 
    var myIndex = $(this).index("#mugshots> img"); 
    $("#bios> div").eq(myIndex).show(); 
}); 

的这个较短的版本是:

$('#mugshots>img').on('click', function() { 
    $("#bios div").hide().eq($(this).index("#mugshots> img")).show();; 
}); 
2

简单的方法是一个循环

$(document).ready(function() { 
    for (var i = 1; i <= 3; i++) { 
    $(".mug" + i).click(function() { 
     $("#bios div").hide(); 
     $(".bio" + i).show(); 
    });      
    } 
}); 

有可能是一个更好的办法仍然是我没有想到的。

+0

这可能是最简单的,尽管您可能必须重新声明“i”以避免关闭问题。另一种方法是检查自己的类的单个函数,找到'mugX'并从中计算'bioX'类。你也可以例如使'mugX'和'bioX'类的名称相同,并将它们引用为'div.mugshots .mugX'和'div.bios div.mugX'来区分它们。 – Rup

4

沿着这些线?您的JS

<div id="bios"> 
     <div class="bio" data-id="1"></div> 
         <div class="bio" data-id="2"></div> 
         <div class="bio" data-id="3"></div> 
       </div> 

然后向该:

的HTML改成这样

$(".mug").click(function() { 
        $("#bios div").hide(); 
        $(".bio[data-id='" + $(this).data("id") + "'", $("#bios")).show();      
       }); 

这种方式,你可以添加尽可能多的茶杯和BIOS,只要你喜欢不不得不添加更多的js。

+1

Html元素ID不能以数字开头。 – Samich

+0

啊,坚果,这个想法确实跨越了我的想法。 – DavidGouge

+0

修改为使用数据属性。没有测试,但这个想法应该没问题。 ;) – DavidGouge

1

试试这个:

$(document).ready(function() { 
    $("img[alt=mug]").each(function() { 
     $(this).click(function(){ 
      var id = $(this).attr("class").substr(3, 1); 
      $("#bios div").hide(); 
      $(".bio" + id).show(); 
     }); 
    }); 
}); 
+0

我不确定'rel = mug'?你可以用'div.mugshots img'代替我的想法。 – Rup

+0

它应该也与rel一起工作。我认为你的意思是'div#mugshots img' –

+0

'哦,是的,我把它看作'class = mugshots'。好的 - 图像上没有rel属性,只有alt,但我可以相信它匹配那个或其他的东西,我错了。 – Rup

1

使用.EQ()和你的嫌疑犯照片的指数,假设第一面部照片去与第一生物,第二面部照片与第二生物,依此类推。

http://api.jquery.com/eq/

此外,使用一个类来跟踪你的积极生物,而不是每次更新的所有BIOS调用隐藏。

JS:

$(document).ready(function() { 
    $('#mugshots img').click(function() { 
    $('#bios .active').hide().removeClass('active'); 
    $('#bios div').eq($(this).index()).show().addClass('active'); 
    }); 
}); 

HTML:

<h2>Meet the team</h2> 

    <div id="mugshots"> 
     <img src="images/img-mugshot.jpg" alt="mug"/> 
     <img src="images/img-mugshot.jpg" alt="mug"/> 
     <img src="images/img-mugshot.jpg" alt="mug"/> 
    </div> 

    <div id="bios"> 
     <div></div> 
     <div></div> 
     <div></div> 
    </div>