2012-01-25 9 views
2

このコードを短縮するにはどうすればよいですか?各CSSセレクターは+1を増加させます。 .mug(x)が選択されていない限り、すべてのBioのdivは非表示になります。このjavascriptコードをどのように短縮できますか? show hide複数の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

は、最も簡単な方法は、私は考えていないよ、まだことのより良い方法があるかもしれないforループ

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

です。

+0

を実装しています。おそらく最も簡単ですが、閉鎖の問題を避けるために 'i'を再宣言しなければならないかもしれません。もう1つの方法は、自身のクラスをチェックし、 'mugX'を見つけてその中の' bioX'クラスを計算する単一の関数です。たとえば、 'mugX'と' bioX'クラスの名前を同じにして、それらを区別するために 'div.mugshots .mugX'と' div.bios div.mugX'として参照してください。 – Rup

4

これらの行に何かがありますか?

変更これまでのhtml:あなたはせずに好きなようにあなたに多くのマグカップやBIOSを追加することができ

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

この方法:これに続いて

<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> 

あなたのjsそれ以上のjを追加する必要があります。

+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

D'oh、そう、私は' class = mugshots'と読んでいます。OK - イメージにはrel属性はありませんが、altのみですが、それが他のものと一致すると信じることができ、私は間違っています。 – Rup

1

が最初mugshotはそうで最初のバイオ、二バイオ有する第二mugshot、として行くと仮定すると、.EQ()とあなたのmugshotsのインデックスを使用してください。

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> 
関連する問題