• ベストアンサー

特定のclassを表示、非表示にする

javascriptで特定のclassを表示、非表示にする方法を検討中なのですが、 a,b,cと三つのボタンが有り、abcというclassがあります。 aをクリックするとb,cが非表示になり、aが表示される bをクリックするとa,cが非表示になり、bが表示される cをクリックするとa,bが非表示になり、cが表示される と言う動作をさせたいのですが、上手くいきません。 どなたかご教授ください。 お願いいたします。 <script type="text/javascript"> <!-- function change(site){  if(!document.getElementsByTagName){return;}  var e = new Array('a','b','c');  var objs = document.getElementsByTagName('*');  for(i=0;i<e.length;i++){   if(e[i] != site){    for(y=0;y<objs.length;y++){     if(objs[y].className == e[i]){      objs[y].style.display = 'none';     }else{      objs[y].style.display = '';     }    }   }  } } // --> </script> <table cellspacing="10"> <tr> <th>テスト</th> <td> <input type="text" name="" id="" class="a" value="" /> <input type="text" name="" id="" class="b" value="" /> </td> </tr> <tr> <th>test</th> <td> <input type="text" name="" id="" class="c" value="" /> </td> </tr> </table> <a href="javascript:change('a')">a</a> <a href="javascript:change('b')">b</a> <a href="javascript:change('c')">c</a>

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

  • ベストアンサー
  • 0909union
  • ベストアンサー率39% (325/818)
回答No.1

短時間でまとめたので、ほとんど何も考えていません。他にもたくさんやり方がありますが、とりあえずシンプルを目指して書きました。 var cname = new Array(); cname["a"] = new Object("a" == site ? "block": "none"); cname["b"] = new Object("b" == site ? "block": "none"); cname["c"] = new Object("c" == site ? "block": "none"); // cname["a"] = new Object("a" == site ? "visible": "hidden"); // cname["b"] = new Object("b" == site ? "visible": "hidden"); // cname["c"] = new Object("c" == site ? "visible": "hidden"); var objs = document.getElementsByTagName('*'); for(var y=0;y<objs.length;y++){ if(cname[(objs[y].className)] != undefined){ objs[y].style.display = cname[(objs[y].className)] ; // objs[y].style.visibility = cname[(objs[y].className)] ; } 不特定多数のオブジェクトをClassNameで判断して処理するやり方は、意図する事はわからないでもないですが、現実的ではありませんね。確かにこれだと、後から変更しなくても、オブジェクトを増やしてゆくだけでいいのですが、オブジェクト型DBとかECサイトなど、リストが多いものに関しては、パフォーマンスが悪くなり、あまりお勧めできるやり方ではないですね。 change()に対象となるIDの配列(又はHTMLオブジェクト)を渡して、処理するほうが、パフォーマンス的にも、コード的にも、早くシンプルに書けます。 今回のコードのポイントは、Display=block とした場合、"" ではなく、none を指定しないとだめですね。 それと、”if(e[i] != site){” だと、表示対象のオブジェクトで、現在非表示の場合は表示処理をしないとだめですね。コード的に間違いはそこです。 後、CSS的にはBlockだとフォーマットが変更されてしまいます。それを意図したならいいですが、"visible"で表示だけを消してもいいのかな、と思います。 JavaScript1.2 レベルであれば、change()に渡す時に、("block", "none", "none")で渡して、change(a,b, c)にすればいいわけです。そうなんです、渡す時にもっと確定した情報を渡せばいいわけです(配列で渡してもいいですね)。

hunter_999
質問者

お礼

とてもわかりやすいご説明ありがとうございます。 おかげで問題が解決いたしました。 ちなみに他にもたくさんやり方とか教えていただけると 幸いです。 どうぞ宜しくお願いいたします。

その他の回答 (7)

回答No.8

#7のていせい。ごめん。 var change = (function ( ) {  var classA = document.getElementsByClassName( 'a' );  var classB = document.getElementsByClassName( 'b' );  var classC = document.getElementsByClassName( 'c' );    return (function ( setter ) {   return function ( s, css ) {    if( 'undefined' == typeof css )     css = 'inline';    Array.map( classA, setter( s == 'a' ? css: 'none' ) );    Array.map( classB, setter( s == 'b' ? css: 'none' ) );    Array.map( classC, setter( s == 'c' ? css: 'none' ) );   };  })(   function ( css ) {    return function ( e ) { e.style.display = css; };   }) })();

回答No.7

くらすがこていなら、こっちがすこしはやいかなぁ~? var change = (function ( ) {  var classA = document.getElementsByClassName( 'a' );  var classB = document.getElementsByClassName( 'b' );  var classC = document.getElementsByClassName( 'c' );    return (function ( setter ) {   return function ( s, css ) {    if( 'undefined' == typeof css )     css = 'inline';    Array.map( classA, setter( s == 'a' ? css, 'none' ) );    Array.map( classB, setter( s == 'b' ? css, 'none' ) );    Array.map( classC, setter( s == 'c' ? css, 'none' ) );   };  })(   function ( css ) {    return function ( e ) { e.style.display = css; };   }); })();

回答No.6

ていせい。 var change = (function ( ) {  var setter = function ( css ) {   return function ( e ) { e.style.display = css; };  };  var none = setter( 'none' );  return function ( s, css ) {   var disp = setter( 'undefined' !== typeof css ? css: 'inline' );   var func;   func = s == 'a' ? disp: none;   Array.map( document.getElementsByClassName( 'a' ), func );   func = s == 'b' ? disp: none;   Array.map( document.getElementsByClassName( 'b' ), func );   func = s == 'c' ? disp: none;   Array.map( document.getElementsByClassName( 'c' ), func );  }; })();

回答No.5

なしのつぶてだが、こういうのはどう?うごかないぶらうざもあるけど。 var change = (function ( ) {  var setter = function ( css ) {   return function ( e ) { e.style.display = css; };  };  var none = setter( 'none' );  return function ( s, css ) {   var disp = setter( 'undefined' !== typeof css ? css: 'inline' );   Array.map( document.getElementsByClassName( 'a' ), s == 'a' ? disp: none );   Array.map( document.getElementsByClassName( 'b' ), s == 'b' ? disp: none );   Array.map( document.getElementsByClassName( 'c' ), s == 'c' ? disp: none );  }; })();

回答No.4

element.style.display = ''; は、おかしい(そうだ)。 document.getElementsByClassName をつかうとか element.style.className = "a b d"; みたいにふくすうできるのだから、それもかんがえようよ。

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

クラス名が設定されていない要素は表示のままでいいのですよね? パフォーマンスなどについては他の方のご意見に賛成。しっかりした回答もあるみたいなので、少々いい加減なものを… >ちなみに他にもたくさんやり方とか教えていただけると~ ということなので、ご質問文にほぼ近い方法で。 function change(site){ if(!document.getElementsByTagName) return; var i=0, e, objs = document.getElementsByTagName('*'); while (e = objs[i++]) e.style.display = (!e.className || site==e.className)?'':'none'; } 実用的に考えると、クラスの設定がこのためだけにされているとは思いにくいし、仮にそうだとしても、2つのクラスを同時に表示しておきたいとかいろいろありそうな気もする。

回答No.2

こんなのはだめ? onloadのあとに。 ぜんかくくうはくは、はんかくにしてね。 var change = (function ( contains, display ) {  var tags = document.getElementsByTagName( '*' );  var classA = [ ];  var classB = [ ];  var classC = [ ];  var cnt = 0, element;    while( element = tags[ cnt++ ] ) {   contains( element, 'a' ) && classA.push( element );   contains( element, 'b' ) && classB.push( element );   contains( element, 'c' ) && classC.push( element );  }    return function ( sw, tp ) {   var c = 0;   var o;   if( 'undefined' === typeof tp )    tp = 'inline';      display( classA, 'a' === sw ? tp: 'none' );   display( classB, 'b' === sw ? tp: 'none' );   display( classC, 'c' === sw ? tp: 'none' );  }; })(   (function ( cut, has ) {    return function ( e, name ) {     if( !has( e.className, name ) ) {      var keys = cut( name );      var cnt = 0, key;            while( key = keys[ cnt++ ] )       if( !has( e.className, key ) )        return false;     }     return true;    };   })(     function (s) { return ('' + s).split( /\u0020+/ ); },     function (s, n) { return -1 < ( '\u0020' + s +'\u0020' ).indexOf( '\u0020' + n + '\u0020' ); }    ),   function ( ary, css ) {    for( var cnt = 0, e; e = ary[ cnt++ ]; e.style.display = css );   }  )

関連するQ&A

  • 特定の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; }

  • 文字列が入っているtdを削除せず非表示にしたい

    aboutをクラスとする列(以下、about列)を非表示にしようと、次のような設定をしました。 <style type="text/css"> th.about, td.about{ width:0px; border:0px; } </style> : : <table> <tr> <th class="about">右が1へのリンクになります</th> <th><a href="http://www1..com">ウェブサイト1</a></th> </tr> <tr> <tr> <td class="about">右が2へのリンクになります</td> <td><a href="http://www.2.com">ウェブサイト2</a></td> </tr> <tr> : : </tr> </table> aboutの長さ自体を0にするように設定したため、about列は表示されないはずなのですが、"右が1へのリンクになります"、"右が2への~"と表示されます。 プログラムの動作にかかわるので、about列を削除することなく、CSSなどを設定することでabout列を非表示にしたいのですが、何か上手な方法はあるでしょうか。 よろしくお願いします。

    • ベストアンサー
    • CSS
  • jquery classの消し方

    jquery初心者です。 テーブルのthやtdの中に空白や未入力があった場合、classの「tb_menu_border」を削除したいのですが、どのように記述したらよいかわかりません。 どなたか詳しい方は、いらっしゃいますでしょうか? <script type="text/javascript"> <!-- if($(".tb_menu_border").text().replace(/\s+/g,'').length > 0){ $("table").removeClass("tb_menu_border"); }; --> </script> <table class="tb_menu"> <tr> <th class="tb_menu_border">メニュー名</th> <td class="tb_menu_border">300円</td> <td class="td_menu_sp">&nbsp;</td> <th class="tb_menu_border">メニュー名</th> <td class="tb_menu_border">300円</td> <td class="td_menu_sp">&nbsp;</td> <th class="tb_menu_border">メニュー名</th> <td class="tb_menu_border">300円</td> <td class="td_menu_sp">&nbsp;</td> </tr> <tr> <th class="tb_menu_border">&nbsp;</th> <td class="tb_menu_border">&nbsp;</td> <td class="td_menu_sp">&nbsp;</td> <th class="tb_menu_border"></th> <td class="tb_menu_border"></td> <td class="td_menu_sp">&nbsp;</td> <th class="tb_menu_border">&nbsp;</th> <td class="tb_menu_border">&nbsp;</td> <td class="td_menu_sp">&nbsp;</td> </tr> </table>

  • エクセルファイルを、HTMLに出力

    エクセルファイルを各項目ごとにHTMLに出力したいのですが、 何かよいソフトや方法はないでしょうか? <tr><td class="x_01"><a href="【A1】" target="_blank">【B1】</a></td><td class="y_02">【C1】</td><td class="z_03">【D1】</td></tr> <tr><td class="x_01"><a href="【A2】" target="_blank">【B2】</a></td><td class="y_02">【C2】</td><td class="z_03">【D2】</td></tr> .... このような形式で、出力していきたいです。 とりあえず、このように自動で出力できる方法ならばどのような方法でも構いません。 どうぞよろしくおねがいします。

  • CGIPerlクリックした値を次の頁に表示させたい

    下記の様にカレンダーの表をHTMLで作成しました。 それぞれの日付のリンク(○や△)をクリックした時に、 次のページで、クリックした日付を表示させるには、 どのようにすれば良いのでしょうか。 1ページ目 HTMLで作成したカレンダーに、日付と、 それぞれ空き状況○、△、×等を表示。 ○と△はクリック可能。×はクリックできない。 (イメージ)  ―――――― |1 | 2| 3| |○|△|○|  ―――――― 2ページ目構想 日付【1ページ目で○か△をクリックした日付をここに表示したい】 お名前【入力欄】←このページで入力する ご住所【入力欄】←このページで入力する また、この2ページ目の内容は、 sendmailを使用してメール送信する予定でいます。 お名前やご住所の部分をsendmailで送信する事はできるのですが、 その際に、日付の部分も送信できればと考えています。 この点も併せてご教授いただければ幸いに存じます。 以下1ページ目のhtml <html> <body> <table border="1" cellspacing="0"> <tr> <th class="week sun">日</th> <th class="week">月</th> <th class="week">火</th> <th class="week">水</th> <th class="week">木</th> <th class="week">金</th> <th class="week sat">土</th> </tr> <tr> <td class="day">&nbsp;</td> <td class="day">&nbsp;</td> <td class="day">&nbsp;</td> <td class="day">&nbsp;</td> <td class="day before"><span style="color:#000000">1</span><p> <a href="nextpageaddress">○<br>\5,980</a></a></p></td> <td class="day before"><span style="color:#000000">2</span><p> <a href="nextpageaddress">△<br>\5,980</a></a></p></td> <td class="day before"><span style="color:#0000ff">3</span><p> <a href="nextpageaddress">○<br>\5,980</a></a></p></td> </tr> </table> </body> </html> 2ページ目の構想 <html> <table> <tr>     <th>予約日付</th> <td>ここに前ページでクリックした日付を表示させたい</td> </tr><tr> <th>お名前<font color="#ff0000">(必須)</font></th> <td><input type="text" name="お名前" size="35" /></td> </tr><tr> <th>ご住所<font color="#ff0000">(必須)</font></th> <td><input type="text" name="ご住所" size="70" /></td> </tr> </table> </html>

    • ベストアンサー
    • CGI
  • セレクトボックスでそれ以降の表示を切り替えたい

    http://5am.jp/javascript/form_change_javascript/ の「サンプルソース(セレクトボックス)」のような入力フォームを作成中です。セレクトボックスでの選択によって、その下に複数行表示させたいので、サンプルソースのgetElementByIdのところをgetElementsByClassNameにして実装してみたのですが動きませんでした…。 以下が自分が書いたコードになります。どこがおかしいのでしょうか? (インデントがうまくできていなくて申し訳ないです。) 回答よろしくお願いします。 <script type="text/javascript"> function entryChange2() { if (document.getElementById('changeSelect')) { id = document.getElementById('changeSelect').value; if (id == 'select1') { document.getElementsByClassName('firstBox2').style.display = ""; document.getElementsByClassName('secondBox2').style.display = "none"; } else if (id == 'select2') { document.getElementsByClassName('firstBox2').style.display = "none"; document.getElementsByClassName('secondBox2').style.display = ""; } } } window.onload = requestChange; </script> <form> <table border="0" cellspacing="0" cellpadding="0"> <tr> <th>利用方法</th> <td> <select id="changeSelect" name="hoge" onchange="entryChange2();"> <option value="select1">初めて申し込む</option> <option value="select2">2度目以降の利用</option> </select> </td> </tr> <!-- 表示非表示切り替え --> <tr class="firstBox2"> <th>紹介者</th> <td><input type="text" /> <p>紹介された方のお名前を入力してください。</p></td> </tr> <tr class="firstBox2"> <th>紹介者のメールアドレス</th> <td><input type="text" /> <p>紹介された方のメールアドレスを入力してください。</p></td> </tr> <!-- 表示非表示切り替え --> <tr class="secondBox2"> <th>名前</th> <td><input type="text" /> <p>名前を入力してください。</p></td> </tr> <tr class="secondBox2"> <th>会員番号</th> <td><input type="text" /> <p>会員番号を入力してください。</p></td> </tr> </table> </form>

  • テーブルのスタイルを効率よく設定するには?

    同じページに複数のテーブルがあり、別のスタイルを適用させたい。 ---- <style TYPE="text/css"> TABLE.A {border-style: solid; } TH.A { color: red; } TD.A { color: blue; } TABLE.B {border-style: double; } TH.B { color: green; } TD.B { color: black; } </style> <table class=A><tr><th class=A>A</th><td class=A>A</td></tr></table> <table class=B><tr><th class=B>B</th><td class=B>B</td></tr></table> --- <table><th><td>タグにclassを書けばいいのですが、もっとすっきりした方法はないでしょうか?

    • ベストアンサー
    • HTML
  • jqueryで表に連番No.を追加したい

    こんにちは。 詳しい方教えてください。 先程タイトル通りtableに自動連番を追加したく、下記のページを参考にしました。 http://www.webopixel.net/javascript/328.html しかし私の知識が乏しくうまくいきません。 何を追加すればうまく連番になりますでしょうか。 ==================================================================== <script type="text/javascript"> $(function() { $('.sample tr').each(function(i) { if(i != 0) { $(this).prepend('<td>'+ i +'</td>'); } else { $(this).prepend('<th>No.</th>'); } }); }); </script> ==================================================================== <table class="sample"> <tr> <th rowspan="2">hoge</th> <th rowspan="2">hoge</th> <th colspan="4">hoge</th> </tr> <tr> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> <tr> ※ここに1からの連番を入れたいのです。 <td>hoge</td> <td>hoge</td> <td>hoge</td> <td>hoge</td> <td>hoge</td> <td>hoge</td> </tr> <tr> ※連番2 <td>hoge</td> <td>hoge</td> <td>hoge</td> <td>hoge</td> <td>hoge</td> <td>hoge</td> </tr> ・ ・ ・ ==================================================================== 説明が下手でわかりにくくすみません・・・・。 是非詳しい方ご教示ください。 よろしくお願いいたします。

  • jQueryでテーブル行の表示・非表示

    JavaScript・jQueryでテーブル行(trタグ)の表示・非表示を 切り替えるスクリプトを以下のように作成しましたが うまく動きません。 dispChg()内で 非表示に設定したクラス名(hid)を追加し 全行を非表示にできていますが 次の該当trから 非表示に設定したクラス名(hid)の削除がうまくいかないようです。 JavaScriptの引数からクラス名を引き継げないのでしょうか。 どなたか修正できる方がいらっしゃいましたら 教えてください。 よろしくお願いいたします。 <html> <head> <title>test</title> <style type="text/css"> <!-- .hid { display:none } --> </style> <script src="jquery-1.2.6.pack.js" type="text/javascript"></script> <script type="text/javascript"> <!-- function dispChg(trClass){ /* まず全行を非表示 */ $('tr[class]').addClass('hid'); /* 該当の行を表示 */ $('tr[class*=trClass]').removeClass('hid'); } --> </script> </head> <body bgcolor=#ffffff topmargin="0" leftmargin="0" marginheight="0" marginwidth="0"> <input type="button" value="全部表示" onclick="dispChg('atype btype ctype dtype')"> <input type="button" value="a" onclick="dispChg('atype')"> <input type="button" value="b" onclick="dispChg('btype')"> <input type="button" value="c" onclick="dispChg('ctype')"> <input type="button" value="d" onclick="dispChg('dtype')"> <table border="1"> <tr class="atype"><td>a</td></tr> <tr class="btype"><td>b</td></tr> <tr class="ctype"><td>c</td></tr> <tr class="dtype"><td>d</td></tr> </table> </body> </html>

  • AウィンドウからBウィンドウのページ位置の動かし方

    通常のページ(Aページ)にあるボタンを押すことによって、 新しいウィンドウで別のページ(Bページ)を開くプログラムを Javascriptで作りました。 質問したいことは、 新しいウィンドウで開いたBページから Aページで名前をつけた場所(ページの途中)に 直接ジャンプするものを作りたいです。 添付画像のように テレビのチャンネルをチラチラ変えるような感覚で Bページをリモコンのような役割にして Aページの中で見たい位置を次から次に動かしたいです。 Bページを開くまでは問題なくできましたが、 その先ができませんでした。 アドバイスを頂きたいです。 お願いいたします。 (↓自分で作ったコードです) ~~~ Aページ ~~~ <script language="JavaScript" type="text/javascript"> <!-- function openwin(url, winname, width, height) { if(!width) { width = 500; } if(!height) { height= 500; } if(!winname) { winname = 'win'; } w = window.open(url, winname,'width=' +width+ ',height=' +height+ ',status=no,scrollbars=yes,directories=no,menubar=no,resizable=yes,toolbar=no'); } //--> </script> </head> <form method="post"><input type=button onClick="openwin('xxx');" value="サンプル"> </form> <div class="t0"> <table> <tr> <th class="t1"><a name="1" id="1">文章</a></th> <td class="t2"></td> <td class="t3">文章</td> </tr> </table> </div> <div class="t0"> <table> <tr> <th class="t1"><a name="2" id="2">文章</a></th> <td class="t2"></td> <td class="t3">文章</td> </tr> </table> </div> <div class="t0"> <table> <tr> <th class="t1"><a name="3" id="3">文章</a></th> <td class="t2"></td> <td class="t3">文章</td> </tr> </table> </div> ~~~ Bページ ~~~ <a href="#1">1</a> <a href="#2">2</a> <a href="#3">3</a> <a href="#4">4</a> <a href="#5">5</a>

    • ベストアンサー
    • HTML