2011-12-28 2 views
1

リンクをクリックした後に表示されるdivの数があります。クリックしたもののみが表示されるように開いているdivをすべて閉じるにはどうすればいいですか?
私はこれをの.js使用しています:JavaScript - 他のすべてのdivを非表示

function showhide(id){ 
     if (document.getElementById) { 
     var divid = document.getElementById(id); 
     divid.style.display = (divid.style.display=='block'?'none':'block'); 
     } } 

     <a href="javascript:void(null)" onclick="showhide('features');">features</a> 
<a href="javascript:void(null)" onclick="showhide('design');">design</a> 
<a href="javascript:void(null)" onclick="showhide('create');">create</a> 

おかげ ウリ

+0

で..

var divState = {}; // we store the status in this object function showhide(id) { if (document.getElementById) { var divid = document.getElementById(id); divState[id] = (divState[id]) ? false : true; // initialize/invert status (true is visible and false is closed) //close others for (var div in divState){ if (divState[div] && div != id){ // ignore closed ones and the current document.getElementById(div).style.display = 'none'; // hide divState[div] = false; // reset status } } divid.style.display = (divid.style.display == 'block' ? 'none' : 'block'); } } 

デモを閉じる必要があるオープンなものを識別するために、また、あなたのdiv構造は、あなたと認められたとの重要な違いがある場合はどのようなものです –

答えて

3

(他の回答に示すよう)一つの方法は、クラスを追加し、それらを非表示にすることに基づいて要素を求めることである

代替は、オブジェクト内の要素の状態を保存し、それを使用することですhttp://jsfiddle.net/gaby/LfzYc/

+0

特定のセクション(div id = sidebarの下にあるすべてのdivなど)に該当するdiv idのみをオープン/クローズ/リセットするループを通過するようにオープン/クローズ/リセットを制限する方法はありますか)?うまくいけばそれは理にかなっている。 – jgrannis

2

をあなたはすべてのdivを取得するためにdocument.getElementByTagNameを使用することができます。

それから、それぞれを対象にして、それ以前にgetElementByIdから取得したdivの場合は、それぞれblockにスタイルを設定します。それ以外の場合はnoneです。

(私はページのunrelevant部分には影響されないように、ここでは関係すべてのdiv要素にクラスを追加し、唯一の反復中に、このクラスでdivを検討することをお勧めします。)

1

次コードは

function showhide(id){ 
     if (document.getElementById) { 
      var divid = document.getElementById(id); 
      var divs = document.getElementsByClassName("hideable"); 
      for(var div in divs) { 
      div.style.display = "none"; 
      } 
      divid.style.display = "block"; 
     } 
     return false; 
} 

<a href="#" onclick="showhide('features');" >features</a> 
<a href="#" onclick="showhide('design');" >design</a> 
<a href="#" onclick="showhide('create');" >create</a> 

<div class="hideable" id="features">Div 1</div> 
<div class="hideable" id="design">Div 2</div> 
<div class="hideable" id="create">Div 3</div> 

私もリンクのデフォルトの動作をプリベンするreturn false;を追加...すべてのdivを隠し、クリックしたものを表示します。リンクのhref属性でjavascript:void(null)を使用するよりもきれいで分かりやすいです。 問題を解決しますか?

+0

表示することができますnswer?スピードに関連する違いは何ですか? – pal4life

0

これを行う典型的な方法はクラス名を使うことですが、これを行うにはjquery/rightjs/whateveryoulikeのようなライブラリを使うことをお勧めします。理由は:getElementsByClassName()は< IE9でサポートされておらず、querySelectorAll()は< IE8でサポートされていません。 libを使用できない場合は、getElementsByTagName( "div")を使用してすべてのdivを繰り返し処理し、そのクラスをチェックする必要があります。

+0

良い点。軽量なソリューションがありますが、http://polyfilljs.com/polyfills/getelementsbyclassname.html – Kos

+0

うまくいっていますが、ie7ではうまくいかないので、彼はこれも必要になります。http://polyfilljs.com/polyfills/queryselector html;) – biophonc

関連する問題