• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:折りたたみタグ 他を閉じる(非表示にする))

折りたたみタグのスクリプト探し

このQ&Aのポイント
  • 折りたたみタグを使っているが、一つ開くと他の開いたタグが閉じるスクリプトを探している。
  • 既に使用している折りたたみタグのスクリプトを少し修正したいが、うまく動かない。
  • 他の折りたたみタグのスクリプトを探しているが、できれば修正だけで対応したい。

質問者が選んだベストアンサー

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

[ANo.1] さんの回答で、すぐに JavaScript がかけないなら、 ↓をつかうのは、止めたほうがいいかも。 http://homepage3.nifty.com/kmyh/gaku/hyouzi2.html ほかの人が書いた、JavaScript を修正しようとしても、DOM の操作(※)が自由にできなければ、どのみちすぐにまた、つまずくから。 ※ DOM の操作 http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html 今回の質問についてだけなら JavaScript ライブラリを使うことをすすめるよ。 『jQuery UI - Accordion Demos & Documentation』 http://jqueryui.com/demos/accordion/ (1) jQuery と jQuery UI をダウンロード http://jqueryui.com/download UI Core は次の 2個だけチェック [*] Core [*] Widget Interactions は全部チェックしない Widgets は次の 1個だけチェック [*] Accordion Effects は全部チェックしない 最後に Theme を [No Theme] に変更して、[Download] ボタンをクリック。 (2) ダウンロードした、JavaScript ファイル下のように配置する。  - HTML ファイル.html  - jquery-1.5.1.js  - ui/jquery.ui.core.js  - ui/jquery.ui.widget.js  - ui/jquery.ui.accordion.js (3) HTML ファイルの中の head タグで JavaScript を読み込む。 <head>   <script src="jquery-1.5.1.js" type="text/javascript"></script>   <script src="ui/jquery.ui.core.js" type="text/javascript"></script>   <script src="ui/jquery.ui.widget.js" type="text/javascript"></script>   <script src="ui/jquery.ui.accordion.js" type="text/javascript"></script> (4) つづけて、下のスクリプトを記述する。   <script type="text/javascript">   $(function() {     $( "#accordion" ).accordion({ animated:false });   });   </script> </head> (5) 折りたたみをする部分を下のように記述する。 <div id="accordion">   <h3><a href="#">項目(1)のタイトル</a></h3>   <div>項目(1)のコンテンツ</div>   <h3><a href="#">項目(2)のタイトル</a></h3>   <div>項目(2)のコンテンツ</div>   <h3><a href="#">項目(3)のタイトル</a></h3>   <div>項目(3)のコンテンツ</div>   <!-- 必要なだけ h3 と div の繰り返し --> </div> おわり。

rinoglda
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (10)

  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.11

>正直ちんぷんかんぷんな初心者です。 >自分で解決できるよう頑張ります。 初心者でもわかるように。 現在のソースから変更できるように。 No2では記載したつもりですが。 No2のソース見ました??? No2を見て、どこを書き換えればわからない。 ということならお手上げです。 まあ、自分でなんとかするならそれも勉強。 頑張ってね^^ >『この 2つの回答って、つまり表現をかえて、同じことしてるだけだよね?』 そういうつもりで書いたわけじゃないですが、 まあ、そういう感じもしますねえ。 全ての方が、HTML、CSS、構造を理解できているとは限らないわけですし。 JavaScript関係の解説サイト見ても、こういうところを指摘しているサイトって少ないんじゃないですかねえ。 だから、むしろ理解できていない方のほうが多いように思います。 私も完全に理解できていませんし、 初めの頃は全く気にしていませんでした(^^; むしろJavaScriptと、HTML、CSSは全く別物だと思ってたかなあ

すると、全ての回答が全文表示されます。
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.10

まだ、閉じられてなかった!よかった。 [ANo.9] の訂正。 プログラマの事実を表していないので撤回。 『ちなみに、body にスクリプトを書 かないのは [ANo.3] がプログラマ というよりはデザイナ(※)よりだか らだよ。』 プログラマもデータとロジックの分離を尊ぶよね。

すると、全ての回答が全文表示されます。
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.9

「うーん……。」 ごめーん。コードに『あそび』がなかったから、どんな意図で書いたのか知りたくて、ちょっと突っついてみただけ。 ちなみに、body にスクリプトを書かないのは [ANo.3] がプログラマというよりはデザイナ(※)よりだからだよ。 どうしても表示が遅いのが気になるなら document の onload イベントの Listener 関数で src 要素を遅延ロードさせるかな? (※ デザイナ) body 要素の中に、スクリプトや文書構造とは関係ないレイアウトの為の div 要素や id や class をつけるのを美しくないと感じたり、嫌悪する傾向がある。 「No3,No4の回答はもっともな話だと思いますが、」 『この 2つの回答って、つまり表現をかえて、同じことしてるだけだよね?』というみかたがあるのかぁ。そういわれればそうかも。 ※ コードのインデントは &nbsp; でつけようキャンペーン中!

すると、全ての回答が全文表示されます。
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.8

また無駄にレスしてみたり...悪い癖... 質問内容では、参考URLにない、クラス名をclose、openに変更されているわけなので、そういうところも考慮して作っているのでしょう。 考慮していないとしたら、後から気づいて学習することでしょう。 それは一つの経験ですよね。 No3,No4の回答はもっともな話だと思いますが、 そもそもDOMとかCSSが理解できない段階だとしたら、 今後のことを考慮して作り直せと言う方が酷な気がします。 私が同じ状態だったら????だと思うなあ。 わかってる人にとっては案外簡単なことでも、 わかってない人にとってみたら???なことはよくあるし。 質問内容の最後に、簡単に修正したいとあったし、それに応じたソースを提示し、今後のアドバイスとして書いていたら、スマートに解決してたんじゃないかなあとか思ったり。 と、レス伸ばしてるのは私のせいかもしれないけど...。 まあ、質問者さんもありがとうだけお礼があっただけなので、進展あったかどうかもわからないけど、いきなり別世界みたいな話されて諦めたのかなとか勝手に思ったり。 やってみれば以外と簡単に仕上がるかもよ。 頑張って^^

rinoglda
質問者

お礼

どうぞ、とされてるサイトから引用させて頂いていた スクリプトだったので、それぞれの意味は正直ちんぷんかんぷんな初心者です。 ご指摘通りなんだかわざわざ難しい上級者向けのように書かれて諦めました。 自分で解決できるよう頑張ります。ありがとうございました。

すると、全ての回答が全文表示されます。
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.7

うーん……。 No.4 の最初のコードは No.0 の a 要素の書き換えだけで済みます。『初期化はご自分で』と書いたのは、要するに style="display: none" を付ければ良いことに気づくかどうか、です(昔はこれもどうかと思っていましたが、今は許容しています)。実は『簡単な修正』で済むのですが、まあ。 後半はオマケですが、キー操作と音声ブラウザ対応を視野に入れています。案外簡単にできますでしょ? で、No.2 に関してですが、 > var divobj = document.getElementsByTagName('div'); > for (var i = 0; i < divobj.length; i++){ > if (divobj[i].className == "open"){ 割といろんなサンプルで class="open|close" が濫用されていますし、ブログシステムなんかで div もかなり濫用されていますので、これだと絞り込みが大雑把すぎるのです。それで No.4 では探索範囲を絞って、かつ ID の先頭が同じもの("section-" や "layer_")だけを対象にしています。もし質問者氏が親ブロックを設けなければ、同階層を探索します。 別にコードの内容を理解する必要はないでしょう。ワープロを使うのに C++ を覚える必要はないですし、BBS を設置するのでさえ CGI/PHP の知識は必要ではありません。私としましては、初心者がそれをコピペし、参考にしても問題ないかどうかを一つの目標としています。どんなに長くてもコピペはすぐにできますし、それ以上何の設定もいらないようには作ってありますよ。 それと、No.3 は良いと思うのですが、(3) で head ではなく body 末尾、あるいはセクション末尾に外部ファイルをまとめて下さい。この場合、head にまとめるメリットがありませんし、むしろページ描画が遅くなるデメリットがあります。

すると、全ての回答が全文表示されます。
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.6

「質問の主旨とは違って、根本的に見直すように指摘されている方 もいますが、……」 心配するほどのことでは、ないとおもうよ。 質問者さんが、あのコードを選ぶなんてあり得ないでしょ? ちなみに [ANo.3] は、質問者さんの選択の幅を、ひろげたかっただから、本気で DOM の操作を覚えるなら、まずは [ANo.2] さんのコードで、いろいろ試してみるといいとおもう。

すると、全ての回答が全文表示されます。
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.5

質問の主旨とは違って、根本的に見直すように指摘されている方もいますが、全ての人がプロではないわけで、提供する目的も人それぞれ。 結局自分のやりたいことが実装できればそれで良いと私は思っています。 確かに質問内容に出てきたソースにはいろいろと問題があるかもしれませんが、それでも構築次第ではそれなりに動きます。 No2で提示したソースは、提示されたソースを元に書き換えたものですが、IE6~8、FireFox、クローム、Opera、Safariと主要なブラウザ全てで検証済みです。 全てのWEBページが完璧なはずもないわけで、完璧を目指そうと思えば相当な努力が必要になります。 プロでも完璧に程遠い人が多いのに初心者が完璧に近い形でできるわけがないですよね。 誰でも初めは初心者です。 初心者からいきなり上級者にはなれないわけで、向上心は必要だと思いますが、少しずつ知識や経験を深めて、ステップアップしていけばいいと私は思いますよ。 現時点でのソースを少し修正して実装したいということなら、No.2のソースで実現可能だと思いますので、良ければお試し下さい。 頑張って下さい^^

すると、全ての回答が全文表示されます。
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.4

ID があるなら活用すべきです。それと、href="javascript:..." なんてのは NN4 の遺物ですので、もう止めて下さい。 <a href="#section-1" onclick="return GAccordion.call(this, event);">ラベル 1</a> <a href="#section-2" onclick="return GAccordion.call(this, event);">ラベル 1</a> <a href="#section-3" onclick="return GAccordion.call(this, event);">ラベル 1</a> <div>  <div id="section-1">...</div>  <div id="section-2">...</div>  <div id="section-3">...</div> </div> <script type="text/javascript"> // IE 5.5+ function GAccordion (e) {  var c = e.currentTarget || this;  var d = c.ownerDocument;  var s;  if ((s = c.getAttribute('href' /*@cc_on, 2@*/))) {   var id = s.slice (1);   var div;   if ((div = d.getElementById(id))) {    id = /^(.*)(\d+)$/.exec (id);    if (id[2]) {     var prefix = id[1];     var n;     for (n = div.parentNode.firstChild; n; n = n.nextSibling) {      if (n.nodeType === 1 && n.id && n.id.indexOf(prefix) === 0) {       n.style.display = 'none';      }     }     div.style.display = ''; // CSSOM    }   }  }  return false; } </script> 初期化はご自分で。どの道、スクリプトが動かない利用者は一定数いますので、そういった場合の代替措置は絶対に必要です。それができないとしたら、下手に仕掛けなど設けない方が無難です。 --- 最近のブラウザなら(手抜き)。 <style type="text/css"> @media only screen {  *[role~="tab"] {   cursor: pointer;  }  *[role~="tab"][tabindex="0"] {   font-weight: bold;   color: #800;  }  *[role~="tabpanel"][aria-hidden="true"] {   display: none;  } } </style> <ul role="tablist">  <li role="tab" id="tab-1" tabindex="0">ラベル 1</li>  <li role="tab" id="tab-2" tabindex="-1">ラベル 2</li>  <li role="tab" id="tab-3" tabindex="-1">ラベル 3</li> </ul> <div role="group">  <div role="tabpanel" aria-labelledby="tab-1" aria-hidden="false">...</div>  <div role="tabpanel" aria-labelledby="tab-2" aria-hidden="true">...</div>  <div role="tabpanel" aria-labelledby="tab-3" aria-hidden="true">...</div> </div> <script type="application/javascript"> if (document.implementation && // document.implementation.hasFeature ('Selectors-API', '1.0') &&   document.implementation.hasFeature ('Events', '2.0') &&   document.implementation.hasFeature ('HTML', '2.0')) { var GAccordion = {  handleEvent: function (e) {   var t = e.target;   var d = t.ownerDocument;   if (this.isTab (t)) {    var tab = t;    switch (e.type) {    case 'focus' :     this.activate (tab, t.parentNode.querySelector ('*[role~="tab"][tabindex="0"]'));     return;    case 'keydown' :     switch (e.keyCode) {     case 0x26: // DOM_VK_UP      for (t = tab; t = t.previousSibling; ) {       if (this.isTab (t)) {        t.focus ();        break;       }      }      return;     case 0x28: // DOM_VK_DOWN      for (t = tab; t = t.nextSibling; ) {       if (this.isTab (t)) {        t.focus ();        break;       }      }      return;     }    }   }  },  isTab: function (n) {   return n.nodeType === Node.ELEMENT_NODE && n.getAttribute ('role') === 'tab';  },  activate: function (tab1, tab2) {   var d = tab1.ownerDocument;   var tp = '*[role~="tabpanel"]';   tab2.setAttribute ('tabindex', '-1');   Array.forEach (d.body.querySelectorAll (tp + '[aria-labelledby~="' + tab2.id + '"]'), function (tabpanel) {    tabpanel.setAttribute ('aria-hidden', 'true');   });   tab1.setAttribute ('tabindex', '0');   Array.forEach (d.body.querySelectorAll (tp + '[aria-labelledby~="' + tab1.id + '"]'), function (tabpanel) {    tabpanel.setAttribute ('aria-hidden', 'false');   });  } }; document.addEventListener ('focus', GAccordion, true); document.addEventListener ('keydown', GAccordion, false); } </script>

rinoglda
質問者

お礼

簡単な修正でできることではないのですね。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.2

とりあえず無駄なところは省きましょうね。 ><div id="layer_@@@@" style="display:none" class="close"> classで切り替えるのにdisplayをnoneにしたりblockにするのは効率がよくありません。 <style type="text/css"><!-- div.close{display:none;} div.open{display:block;} --></style> として <div id="layer_@@@@" class="close"> とするべきです。 そうすることで、HTMLに無駄な記載をしなくても良くなりますし、 JavaScript部でも無駄な処理がなくなります。 以下ソースです。 // CSS部 div.close{display:none;} div.open{display:block;} // JavaScript部 function show(inputData) { var objID=document.getElementById( "layer_" + inputData ); var buttonID=document.getElementById( "category_" + inputData ); if(objID.className=='close') { // OPENされているDIVを閉じる var divobj = document.getElementsByTagName('div'); for (var i = 0; i < divobj.length; i++){ if (divobj[i].className == "open"){ //divobj[i].style.display='none'; divobj[i].className='close'; } } //objID.style.display='block'; objID.className='open'; }else{ //objID.style.display='none'; objID.className='close'; } } // HTML部 <a href="javascript:void(0)" id="category_@@@@" onClick="show('@@@@');">リンク</a> <a href="javascript:void(0)" id="category_2" onClick="show('2');">リンク2</a> <a href="javascript:void(0)" id="category_3" onClick="show('3');">リンク3</a> <div id="layer_@@@@" class="close"> 隠れた内容 </div> <div id="layer_2" class="close"> 隠れた内容2 </div> <div id="layer_3" class="close"> 隠れた内容3 </div>

rinoglda
質問者

お礼

ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

考え方はシンプルです。 リンクをクリックすると いったん全てのリンクを閉じます。 そしてクリックしたものだけ開けばOKです。 閉じると開くの方法が分かれば 簡単に実装できるかと思います。

rinoglda
質問者

お礼

回答ありがとうございます。 できれば例としてタグで教えて頂けますと幸いです。

すると、全ての回答が全文表示されます。

関連するQ&A