• 締切済み

常にひとつだけ詳細表示する

<a name="0" onclick="yomu(0);">A</a> <div name="more" class="hide">Aの詳細</div> <a name="1" onclick="yomu(1);">B</a> <div name="more" class="hide">Bの詳細</div> <a name="2" onclick="yomu(2);">C</a> <div name="more" class="hide">Cの詳細</div> というようなHTMLがあったとします。 classが「show」で表示「hide」で非表示になります。 詳細記事は最初全てhideです。 yomu(A)を実行するとAの詳細を表示、既に開いていたらAの詳細を非表示。 また、Aの詳細を表示するときA以外が開いていたら非表示に。 ここではABCだけど、実際はもっと数があります。 name="more" の数利用できないかな? var rflag = new Array(); function red(i){ //非表示のときrflag[i]が0 if(rflag[i] == 1){//iを非表示にする処理 ふにゃらら(iと同じ)番目のmore.className="hide"; rflag[i]=0; } else {//iを表示する処理 ふにゃらら(iと同じ)番目のmore.className="show"; rflag[i]=1; if([i]以外(ふにゃらら番目以外)のrflag == 1) {//iを表示するときi以外に開いていたら閉じる処理} } } のようなイメージなのですが、まだjavascriptを覚え始めて間もないのでぜんぜん方法がわかりません。 変なことしてしまってるかもしれませんが、よろしくお願いします。

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

原理だけですが・・・ classのshowとhideを切り替えることにして、script側は操作の対象となるidを受け取ればいいので、 ----HTML---- <a id="1" onclick="yomu('1_s');">B</a> <div id="1_s" class="hide">Bの詳細</div> などとしておいて・・・ ----Script---- function yomu(i){  var obj = document.getElementById(i);  if (obj.className == 'hide') { obj.className = 'show';  } else {   obj.className = 'hide';  } } で、対象のエレメントの表示と非表示が単純に切り替わります。 同時に他のエレメントを操作するなどは、適当に応用してください。

idhokanohi
質問者

お礼

それぐらいの処理ならかけるのですが、非表示にする処理の時、対象のオブジェクトだけを除外する方法がわからなかったです。document.all.item(id,i) という指定方法を見つけたので、 頭の中を整理してもっと単純に考えてみました。 フラグでクリックしたら どれかが開いた状態「flag1」 すべて閉じている状態「flag0」として、 ____________________________________________ var flag=0; function red(a){ var id="more" if (flag==1){document.all.item(id).className="hide"; flag=0; } else { document.all.item(id,a).className="show"; flag=1; } } としてみたのですが、document.all.item(id).className="hide" が上手くいきません、showはきちんと動いてくれるのですが。 idは全て同じものを振っています。なぜ動かないのか。

idhokanohi
質問者

補足

<a href="javascript:red(0);">A</a> <div id="more" class="hide">Aの詳細</div> <a href="javascript:red(1);">B</a> <div id="more" class="hide">Bの詳細</div> <a href="javascript:red(2);">C</a> <div id="more" class="hide">Cの詳細</div> var flag=0; function red(a){ var id="more"; var mor = document.all.item(id,a) if(flag == 0){ mor.className="show"; flag=1; } else if(flag == 1){ if(mor.className=='show'){ mor.className="hide"; flag=0; } else { for (i = 0; i <= document.all.item(id).length; i++){document.all.item(id,i).className="hide";} mor.className="show";//これをforが完全に終わってから実行したい } } } 概要 1全部閉じてたら対象を開く 2-Y対象が開いてたら対象を閉じる、1へ 2-N対象が閉じていたら全て閉じるfor文   対象を開く//ここが上手くいかない

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

関連するQ&A

  • 常にひとつだけ詳細表示する!の回答なのだけれど

    <html> <head> <style> .show {display:block;} .hide {display:none;} </style> <script> function yomu(n){ oj=document.getElementById('a').getElementsByTagName('DIV'); for(var i in oj) oj[i].className=(i==n)?'show':'hide'; } </script> </head> <body> <div id="a"> <a href="#" onClick="yomu(0)">A</a><br> <div class="hide">Aの詳細</div> <a href="#" onClick="yomu(1)">B</a><br> <div class="hide">Bの詳細</div> <a href="#" onClick="yomu(2)" >C</a><br> <div class="hide">Cの詳細</div> </div> </body> </html>

  • 動いてもよさそうなのに動かないのでどこが悪いか見て下さい。

    例:Aをクリックして表示 BをクリックしてAを消す、Bを出す。この時Bが出ずにはまる。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"> <!-- .hide {display:none;} .show {display:block;} --> </style> <script type="text/javascript"> <!-- var flag=0; function red(a){ id="more"; mor = document.all.item(id,a) if (flag == 1){ if(mor.className=='show'){ mor.className="hide"; flag=0; } else { for (i = 0; i <= document.all.item(id).length; i++){ document.all.item(id,i).className="hide"; if(i == document.all.item(id).length){mor.className="show";} } } } else if(flag == 0){ mor.className="show"; flag=1; } } //--> </script> </head> <body> 例: 何もないときとりあえず今回はAを押すとAが開く(flag=0<br> Aがあいてる時、Aを押すとAを閉じる(flag=1 document.all.item(id,a).className=='show'<br> BやCを押すとAを閉じてBやCを開く(for文<br> for文のところのshowが上手くいかない。<br><br><br> <a href="javascript:red(0);">A</a> <div id="more" class="hide">Aの詳細</div> <br> <a href="javascript:red(1);">B</a> <div id="more" class="hide">Bの詳細</div> <br> <a href="javascript:red(2);">C</a> <div id="more" class="hide">Cの詳細</div> <br><br>概要<br> 1全部閉じてたら対象を開く<br> <br> 2-Yes対象が開いてたら対象を閉じる、1へ<br> <br> 2-No対象が閉じていたら全て閉じるfor文<br>   対象を開く//ここが上手くいかない<br> <br><br><br> ※対象はred(a)のdocument.all.item(more,a).classNameがshow(開)かhide(閉)か<br> ここの(more,a)のaは「a」番目のid「more」をもったオブジェクトのこと </body> </html>

  • javascriptにフェードインを追加したい。

    下記のjavascriptに、フェードイン効果を追加するにはどうすればいいでしょうか? 現在は、クリックで、テキストが切り替わる仕様になっているんですが、これにフェードイン、フェードアウトの機能を付け加えたいです。 また、切り替わった際に下記のようにCSSの.actveをclass=""に追加させたいのですが、 どうすれば可能でしょうか? 目的は、アクティブになったボタンの背景を変更したい為です。 <div class="button actve"><a href="#" onclick="checkd1();return ChDsp2('text1','textALL');">ボタン1</a></div> 【javascript】 function ChDsp2(strShow,classHidden){ var tags=document.getElementsByTagName("div"); for(var i=0;i<tags.length;i++){ if(tags[i].className.match('textALL')){ tags[i].className=tags[i].className.replace(/hide/,"").replace(/^\s+|\s+$/,""); if(tags[i]!=document.getElementById(strShow)) tags[i].className+=' hide'; } } return false; } function checkd1(){ document.FORM.CHECK1.checked=true document.FORM.CHECK2.checked=false document.FORM.CHECK3.checked=false } function checkd2(){ document.FORM.CHECK1.checked=false document.FORM.CHECK2.checked=true document.FORM.CHECK3.checked=false } function checkd3(){ document.FORM.CHECK1.checked=false document.FORM.CHECK2.checked=false document.FORM.CHECK3.checked=true } function change(c) { var f = c.checked, btn = c.form.elements['btn1']; btn.disabled = f?false:true; f = f?'sozai/button_2.jpg':'sozai/button_1.jpg'; btn.style.backgroundImage = 'url(' + f + ')'; } 【HTML】 <div class="button"><a href="#" onclick="checkd1();return ChDsp2('text1','textALL');">ボタン1</a></div> <div class="button"><a href="#" onclick="checkd2();return ChDsp2('text2','textALL');">ボタン2</a></div> <div class="button"><a href="#" onclick="checkd3();return ChDsp2('text3','textALL');">ボタン3</a></div> <div class="clear">&nbsp;</div> <div class="area"> <form name="FORM"> <div id="text1" class="textALL"> その1、ここは最初に表示されています。 </div> <div id="text2" class="textALL hide"> その2、ここはボタン2をクリックで表示されます。 </div> <div id="text3" class="textALL hide"> その2、ここはボタン3をクリックで表示されます。 </div> </form> </div> 上記は、以前頂いたプログラムをわかる範囲で改造したものなのですが、 限界を感じまして、どなたか教えて頂けたら助かります。 宜しくお願いします。

  • JavascriptでInputClassの表示を変えるには

     以下のScriptを作りました。Tagの表示情報をScriptで変更したいのです。以下のdiv class="inC1"は変更されます。input class="inIPC2も変更したいのですが、どうもやり方が異なるようです。  申し訳ありませんがご教授願います。 <html> <head> <title>エレメントの表示</title> </head> <body> <script type="text/javascript"> function Disp_change() { var i = 0, div = document.getElementsByTagName("DIV"); while (div[i]) { if (div[i].className=="inC1") div[i].innerHTML = "change1"; i++; } } function Disp_change_Class() { var i = 0, div = document.getElementsByTagName("DIV"); while (div[i]) { if (div[i].className=="inIPC2") div[i].innerHTML = "change2"; i++; alert ("change2"); } } </script> <body> <div class="frameHead frameDetail"> <div class="inC1">連絡情報</div> <div class="clear"><hr /></div> <div class="inC2"> <input class="button3" type="button" name="fromUserList" value="" onclick="Disp_change()"> <input class="inIPC2">連絡情報</div> </div> <script type="text/javascript"> Disp_change(); Disp_change_Class(); }; </script> </script> </body> </html>  一応動きますので確認してみてくだされば幸いです。 以上、宜しく御願い致します。

    • ベストアンサー
    • Java
  • 同じ i 番目のclassを連動させることはできますか?

    お世話になります <script type="text/javascript"><!-- window.onload = function() { document.getElementsByClassName = function (className) { var i, j, eltClass; var objAll = document.getElementsByTagName ? document.getElementsByTagName("*") : document.all; var objCN = new Array(); for (i = 0; i < objAll.length; i++) { eltClass = objAll[i].className.split(/\s+/); for (j = 0; j < eltClass.length; j++) { if (eltClass[j] == className) { objCN.push(objAll[i]); break; } } } return objCN; } obj0 = document.getElementsByClassName("id"); obj1 = document.getElementsByClassName("pass"); for(i=0;i<obj0.length;i++) { obj0[i].onclick = function() { obj1[i].style.display = "block"; } } } //--></script> <style type="text/css"><!-- .id { width:150px; float:left; cursor:pointer; } .pass { display:none; } .pass0 { width:100px; } --></style> <div class="id">名前1</div> <div class="pass"> <input type="password" name="password" class="pass0"> <input type="button" name="login" value="LOG IN" class="login"> </div> <div class="id">名前1</div> <div class="pass"> <input type="password" name="password" class="pass"> <input type="button" name="login" value="LOG IN" class="login"> </div> のような感じでclass("id")[0]をクリックしたらclass("pass")[0]を表示、class("id")[1]をクリックしたらclass("pass")[1]を表示・・・というふうにしたいのですがなかなかうまくいきません>< 名前とパス両方を入力にしてやる方法もできますし、 それぞれのclass("id")にfunction()を振って obj0[0].onclick = function() { obj1[0].style.display = "block"; } obj0[1].onclick = function() { obj1[1].style.display = "block"; } のようなやり方もできるのはできます 後者のやり方は他の部分でもいろいろ使っているので記事やメンバーが増えるたびに新たに追加していかないといけないので***.onclick = function() { } を配列にするなどまとめてできる方法があれば教えていただきたいのですが^^;

  • jquery.cookieを利用しての表示

    cookieを使用した表示内容の変更を行おうとしています たとえば <a href="javascript:void(0);" onclick="Display('no1')">ID1</a> を押したら <div id="ID1"><p>これはID1のエリアです</p></div> が出てきて、cookieが残っている限り上記文章が表示されている 以前の質問に載っていたソースを使用し、製作しようと思っていたのですが リンク部分を下記のようにすると <a href="javascript:void(0);" onclick="Display('no1')">ID1</a> ↓ <a href="next.html" onclick="Display('no1')">ID1</a> 当たり前といえば当たり前なのですが リンクをクリックした際に、切り替わったエリアが一瞬表示し ページに移動してしまいます 私としてはページが移動した後に切り替わってほしいのですが なかなか上手くいきません 何か良い方法はないでしょうか・・・ 下記元ソースになります <script type="text/javascript"> function Display(no){ switch(no){ case 'no1': $("#ID1").show(); $("#ID2").hide(); $("#ID3").hide(); $.cookie('area',no,{expires:1}); break; case 'no2': $("#ID1").hide(); $("#ID2").show(); $("#ID3").hide(); $.cookie('area',no,{expires:1}); break; case 'no3': $("#ID1").hide(); $("#ID2").hide(); $("#ID3").show(); $.cookie('area',no,{expires:1}); break; } } $(function($){ if($.cookie('area')){ Display($.cookie('area')); }else{ Display('no1'); } }); </script> <h5><a href="javascript:void(0);" onclick="Display('no1')">ID1</a></h5> <h5><a href="javascript:void(0);" onclick="Display('no2')">ID2</a></h5> <h5><a href="javascript:void(0);" onclick="Display('no3')">ID3</a></h5> <div id="ID1"><p>これはID1のエリアです</p></div> <div id="ID2"><p>これはID2のエリアです。</p></div> <div id="ID3"><p>これはID3のエリアです。</p></div>

  • javascript クイズ

    こちらの http://okwave.jp/qa/q4105194.html 回答のNo.4の回答者様のソースコードなのですが <html> <head><style>.hid{display:none} .disp{display:block}</style></head> <body> <div id="s0">Start!!<input type="button" value="click" onClick="view();$('s0').className='hid';"></div> <div id="mn"></div> <div id="s1" class="hid"> Q1.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s2" class="hid"> Q2.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s3" class="hid"> Q3.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s4" class="hid"> Q4.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="s5" class="hid"> Q5.どれを選ぶ? <input type="button" value="A" onClick="seikai()"> <input type="button" value="B" onClick="hazure()"> <input type="button" value="C" onClick="hazure()"> </div> <div id="hz" class="hid"> はずれでした! <input type="button" value="次に進む" onClick="nextq()"> </div> <div id="sk" class="hid"> 正解です! <input type="button" value="次に進む" onClick="nextq()"> </div> <script> var n=3; var q=5; var f=[]; var l=[]; var c=0; var cntc=0; window.onload=function(){ for(var i=0;i<n;i++){ do x=Math.floor(Math.random()*q)+1; while(f[x]) f[x]=true;l[i]=x; } } function view(){$('s'+l[c]).className='disp';$('mn').innerHTML=c+1+"問目";} function $(o){ return document.getElementById(o); } function hazure(){ $('hz').className='disp';} function seikai(){ $('sk').className='disp'; cntc++;} function nextq(){ $('sk').className='hid'; $('hz').className='hid'; $('s'+l[c]).className='hid'; if(++c>=n) owari(); else view(); } function owari(){ $('mn').innerHTML='正解数は、'+cntc; } </script> このままですと正解と不正解のボタンがそれぞれ一回ずつ押せてしまいます これを正解、不正解のどちらか一回しか押せないようにするにはどうすればよろしいでしょうか? よろしくお願いします。

  • 折りたたみタグ 他を閉じる(非表示にする)

    折りたたみリンクが複数ある場合で、 一つ開くと他の開いた折りたたみリンクが閉じる(常に表示されるのは一つだけ)スクリプトを探しています。 以下のタグを使わせて頂いてます。 function show(inputData) { var objID=document.getElementById( "layer_" + inputData ); var buttonID=document.getElementById( "category_" + inputData ); if(objID.className=='close') { objID.style.display='block'; objID.className='open'; }else{ objID.style.display='none'; objID.className='close'; } } <a href="javascript:void(0)" id="category_@@@@" onClick="show('@@@@');"> リンク </a> <div id="layer_@@@@" style="display:none" class="close"> 隠れた内容 </div> http://homepage3.nifty.com/kmyh/gaku/hyouzi2.html こちらで見つけたので、少しの修正でなんとかできないかと上記の使っている ものを少しずついじって試してみたのですが、動かなくなるだけでしたので、 丸々スクリプトを取り替えてみたのですが、何が悪かったのか動きませんでした…。 既にたくさん使用しているので、できれば丸々とりかえるのではなく、 簡単な修正で変更できたらいいなと思っております…。 ご助力よろしくお願い致します。

  • div要素をランダムに表示させたい

    お世話になります。Javascriptについて質問させていただきます。 拙い説明で分かりにくいかと思いますが、ご教授いただけたらと思います。 javascriptとcssを使用して、ページをリロードする度に、divの要素をランダムに表示させるようにしたいと考えています。 ランダムで表示させるにはfunction test(no)関数のどこかにランダムで値を取得できるようにする必要があると思っているのですが、上手く設定ができずに悩んでいます。 ご回答頂けたら幸いです。 ■ html <body onLoad="test(no)"> <div id="link"> <div class="link01"> <p>文章1</p> </div> <div class="link02"> <p>文章2</p> </div> <div class="link03"> <p>文章3</p> </div> </div> <ul> <li><a href="#" onclick="showChanger(1);">リンク1</a></li> <li><a href="#" onclick="showChanger(2);">リンク2</a></li> <li><a href="#" onclick="showChanger(3);">リンク3</a></li> </ul> ■javascript function test(no){ var parenObj=document.getElementById("link"); for(var i in parenObj.childNodes){ var childObj=parenObj.childNodes[i]; if(childObj.tagName=="DIV"){ if(no == 1){ if(childObj.className=="link01"){ childObj.style.display = "block"; }else{ childObj.style.display = "none"; } } if(no == 2){ if(childObj.className=="link02"){ childObj.style.display = "block"; }else{ childObj.style.display = "none"; } } if(no == 3){ if(childObj.className=="link03"){ childObj.style.display = "block"; }else{ childObj.style.display = "none"; } } } } } ■css .link01 { display:block; margin-bottom:10px; } .link02 { display:none; margin-bottom:10px; } .link03 { display:none; margin-bottom:10px; }

  • 特定のclassが含まれていたら

    以前、こちらで特定のclassを表示、非表示にする方法を教えていただいたのですが、特定のclassが含まれているタグに対して表示、非表示にしたいと思いまして、質問させていただきました。 現在は<div class="a">a</div>に対して行っており、これを <div class="a b">ab</div>のような感じにも対応したいと考えております。 現在使っているスクリプトは下記になります。 どなたかご教授ください。 宜しくお願いいたします。 function change(site){ if(!document.getElementsByTagName){return;} var cname = new Array(); cname["default"] = new Object("a" == site ? "":"none"); cname["homes"] = new Object("b" == site ? "":"none"); cname["suumo"] = new Object("c" == site ? "":"none"); var objs = document.getElementsByTagName("*"); for(var i=0;i<objs.length;i++){ if(cname[(objs[i].className)] != undefined){ objs[i].style.display = cname[(objs[i].className)]; } } s_n = document.getElementById('site_name'); s_n.value = site; }