JavaScriptでサイドメニューの画像をクリックで変更する方法

このQ&Aのポイント
  • JavaScriptを使用してサイドメニューを作成しています。大メニューをクリックすると、小メニューが開くようになっています。しかし、大メニューのクリックに応じて画像を変更する方法がうまくいきません。
  • スクリプトとHTMLでの実装を示していますが、1回目のクリックでは大メニューの画像が変わるのですが、2回目のクリックでは何も起こりません。
  • 解決方法をご存知の方、教えていただけないでしょうか?お願いします!
回答を見る
  • ベストアンサー

onClickで2回目のクリックでもとの画像に戻す

いつもお世話になっております。 JavaScriptで質問があり、投稿させていただきます! JavaScriptでサイドメニューを作成しています。 折りたたみにしていて、大メニューをクリックで小メニューを開くようにしています。 大メニューは画像で作成し、小メニューはテキストなのですが、 大メニューをクリックし、小メニューが開いたときに、大メニューの画像を変更。 大メニューをクリックし、小メニューを閉じたときに、大メニューの画像を元に戻す。 としたいのですが、うまくいきません・・・。 スクリプトとHTMLは以下です。 [[JavaScript]] <script type="text/javascript"><!-- function oritatami(id){ obj=(document.all)?document.all(id):((document.getElementById)?document.getElementById(id):null); if(obj) obj.style.display=(obj.style.display=="none")?"block":"none"; } //--></script> [[HTML]] <h2><a href="../sample/index.html" onclick="oritatami('o0');return false"><img src="image/fg.jpg" width="210" height="26" onclick="this.src='image/fg_on.jpg'" onlclick="this.src='image/fg.jpg'"/></a></h2> <div id="o0" style="display:none"> <ul> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> <li><a href="URL">Bible Flight</a> </ul> </div> これでは、1回目のクリックで大メニューの画像は変わるのですが、2回目のクリックでは何もわかりません・・・。 どなたか、ご存知の方、ご教授いただけないでしょうか!! よろしくお願いします!

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

  • ベストアンサー
  • marutone
  • ベストアンサー率40% (70/174)
回答No.1

以下のようにソースを変更してみてください。 [HTML] ○変更前 <img src="image/fg.jpg" width="210" height="26" onclick="this.src='image/fg_on.jpg'" onlclick="this.src='image/fg.jpg'"/> ○変更後 <img id="img" src="image/fg.jpg" width="210" height="26"> [JavaScript] ○変更前 if(obj)obj.style.display=(obj.style.display=="none")?"block":"none"; ○変更後 if(obj) { imgobj=(document.all)?document.all('img'):((document.getElementById)?document.getElementById('img'):null); if (obj.style.display=="none") { obj.style.display="block"; imgobj.src = 'image/fg_on.jpg'; } else { obj.style.display="none"; imgobj.src = 'image/fg.jpg'; } } あと三項演算子は可読性を著しく低下させるので、 できるだけ使用しないようにしましょう。

mihomama84
質問者

お礼

ご回答いただきありがとうございました!! 丁寧なご説明で、とってもわかりやすかったです!。 新たにidをつけて、指定をしてあげればよかったのですね。 初心者ですみません。 また、三項演算子についてもありがとうございます。 可読性を低下させる・・・とは知りませんでした! 今後使用しないようにしてみます! ほんとうにありがとうございました!

関連するQ&A

  • 折りたたみメニューについて

    現在あるサイトを作成中で、メニューに折りたたみ式のものを使っています。いろいろなサイトや書籍を参考に、メニューそのものはきちんと動いているのですが、メニューをクリックするたびに展開したサブメニューがまた閉じてしまい、ページ移動するたびにメニューを展開させるのは使い勝手が悪いなと感じております。 たとえばAというメニューを展開し、AAAというページへ移動した場合、展開されたAは展開したままにしたいのですが… なにかヒントでもつかめないかと検索を続けてみましたが、どうしても分からず困っています。 ソースを記述しますので、こう修正すればできるんじゃない?とか、こっちのソースを使ったらできるよ、とかありましたら教えていただけませんでしょうか? よろしくお願いします。 [Javascript] function oritatami(id,id2){ obj=(document.all)?document.all(id):((document.getElementById)?document.getElementById(id):null); if(obj) obj.style.display=(obj.style.display=="none")?"block":"none"; if(document.all){ with(document.all(id2)){innerText=(innerText=="▽")?"△":"▽";} } else if(document.getElementById){ with(document.getElementById(id2)){firstChild.nodeValue=(firstChild.nodeValue=="▽")?"△":"▽";} } } [HTML] <a href="URL" onclick="oritatami('mw00','+0');return false"><span id="+0">▽</span> メニュー1</a><br> <div class="d2" id="mw00" style="display:none;"> ┣メニュー2(メニュー1から展開)<br> ┃┣ 001<br> ┃┣ 004 - 007<br></div> </div>

  • ツリーメニューで子のページのとき親が開く

    他のプログラムと連携しています 現時点ではクリックすれば親が開き子の部分が出てくるようにしています。 子のページのURLを見たときに ツリーのその親は自動的に開きたいのです。 show('1');のこの”1”は他のプログラムから出力しているものです。 子のものも同じように値を出力できるのですが JavaScriptでどのように書けば親が開くのかよくわかりません^^;。 よろしくお願いします。 //javascript// function show(inputData) { var objID=document.getElementById( "obj_" + inputData ); var buttonID=document.getElementById( "button_" + inputData ); if(objID.className=='close'){ objID.style.display='block'; objID.className='open'; buttonID.src='images/close.gif'; } else{ objID.style.display='none'; objID.className='close'; buttonID.src='images/open.gif'; } } //HTML// <ul> <li><input type="image" src="images/open.gif" id="button_1" onclick="show('1');"> <a href="javascript:show(1)">Aメニュー</a> </li> <div id="obj_1" style="display:none;position:relative;" class="close"> <ul><li><a href="11.html" >A-1メニュー </a></li> <li><a href="12.html">A-2メニュー </a></li> <li><a href="11.html" >A-3メニュー </a></li> </ul> </div> </ul> <ul> <li><input type="image" src="images/open.gif" id="button_2" onclick="show('2');"> <a href="javascript:show(2)">Bメニュー</a> </li> <div id="obj_2" style="display:none;position:relative;" class="close"> <ul><li><a href="21.html">B-1メニュー </a></li> <li><a href="22.html">B-2メニュー </a></li> <li><a href="23.html">B-3メニュー </a></li> </ul> </div> </ul>

  • 【javascript で動的に a タグ内に onclick属性を出力する方法】 について

    javascript での 【 html 内への動的タグ生成】について、 javascript にご理解のある方にお教え頂けますと大変嬉しです。 かなり基本的なことで恐縮ですが、当方デザインサイドの人間で javascript も理屈の情報流し読みだけで、全く自ら書く練習をしていない不理解者です。 それでも急ぎで解決してゆきたい問題があり。 どなた様か、何卒宜しくお願い申し上げます。 ---------------------------------------------------------------- 作ろうとしているのは、【現在の Yahoo JAPAN! のTOPページ上部の、ページURLを切り替えずにタブをチェンジして、それに対応する下部の div の内容を切り替える】というインターフェイスです。 ただ、IE5.5 などで全くまともに動作しないので、IE5.5を含んだクロスブラウザ対応のため、【Ajax ライブラリのタブチェンジ】ではなく、巷の情報をアレンジした自前 javascript で作っています。 以下のようなタグを javascript で動的に生成する記述を書いているのですが、これが 【現在の Yahoo JAPAN! TOP】の上部クリック切替タブに相当するものです。 <ul class="menu1" id="nav"> <li id="menu1Nav"><a href="#menu1">メニュー1</a></li> <li id="menu2Nav"><a href="#menu2">メニュー2</a></li> <li id="menu3Nav"><a href="#menu3">メニュー3</a></li> <li id="menu4Nav"><a href="#menu4">メニュー4</a></li> <li id="menu5Nav"><a href="#menu5">メニュー5</a></li> </ul> 書く <li><a></a><li> は、CSS 側の記述で display:block; 化して 幅×高さ を統一するように指定しており、クリックした際は「ボタン」的な長方形の outline が【点線】で表示されます。 ------------------------------------------------------ そのタブを動的生成する関連メソッドが、 function createListItem(id,href,text) { var li = document.createElement("li"); var a = document.createElement("a"); var t = document.createTextNode(text); li.setAttribute('id',id); a.setAttribute('href',href); a.appendChild(t); li.appendChild(a); return li; } function setTabClick(listName,categoryName) { var e = document.getElementById(listName).getElementsByTagName('a')[0]; e.onclick = function(){ showCategory(categoryName); return false; }; } です。 ------------------------------------------------------ このとき【Yahoo JAPAN! TOP 切替タブ】は、クリックした際に outline の【点線】が全く表示されないのでスマートですが、 CSS 側で 当該 li a タグに outline:none; を指定していても、 IE8 や firefox などモダンブラウザではそれだけで「クリック時の周囲【点線】」が見えなくなりますが、 まだシェアの多い IE6/IE7 などでは outline プロパティに対応していないため、クリックしてタブを切り替えたときに、見苦しい【周囲枠点線】が残ってしまいます。 そこで巷の情報より、<a onfcus="this.blur()" id"~">テキスト</a> を挿入すれば、それが見えなくなるとのことで、この動的に生成する <li><a> の a タグの中に onfcus="this.blur()" を常に入れるようにして試してみたいのですが、 ★ <a href="#menu1"> などのラスト部分に、毎回同様にうまく挿入する記述方法について、教えて頂けますと大変幸いです。 上の2つのメソッドのどちらかで、その部分の追加記述ができると嬉しいのですが、a.setAttribute(); / e.onfocus = などで少し試してみるも、元々記述構造をよく理解していないため、意図する結果は得られません。 ------------------------------------------------------ 【上記の onfcus="this.blur()" を 各 a タグの最後に動的に毎回追加する記述方法】 のみで良いのですが、どなた様かお知恵をお借りできませんでしょうか。 自分で長時間試行錯誤する余裕が全くなく、もし早めにコメントを頂けますと大変幸いです。 どうぞ宜しくお願い申し上げます。

  • JavaScriptで折りたたみメニュー

    現在、JavaScriptを利用して折りたたみメニューを作成しました。 2つの項目の下にそれぞれ下層メニューがあり、各項目をクリックするごとに下層メニューが開いたり閉じたりできる状態なのですが、 このどちらかの項目をクリックしたとき、その項目の下層メニューは表示されるが、もう一方の項目の下層メニューは閉じる。というようにするにはどうすればよいでしょうか?(両方の下層メニューが同時に開いている状態が無いように。) よろしくお願いいたします。 【XHTML】 <ul> <li><a href="javascript:exMenu('treeMenu1')">項目1</a> <ul id="treeMenu1" style="display:none"> <li><a href="#">項目1-1</a></li> <li><a href="#">項目1-2</a></li> <li><a href="#">項目1-3</a></li> </ul> </li> <li><a href="javascript:exMenu('treeMenu2')">項目2</a> <ul id="treeMenu2" style="display:none"> <li><a href="#">項目2-1</a></li> <li><a href="#">項目2-2</a></li> <li><a href="#">項目2-3</a></li> </ul> </li> </ul> 【JavaScript】 function exMenu(tName) { tMenu = document.getElementById(tName).style; if (tMenu.display == 'none') tMenu.display = "block"; else tMenu.display = "none"; }

  • リンク押下でタグを書き換えたい

    リンクが複数あって、押したリンク文字だけ<span></span>のみにしたいと 思っています。また対応するdivタグのdisplay属性も書き換えたいです。 とりあえず思いついたのは以下の方法なのですが、冗長ですし、 リンクの数が増えた場合に足していくのが大変です。 もっとシンプルに書く方法がないものでしょうか。 ご助言ください。 <html> <body> <script> function change(spanid,divid,menuName){ document.getElementById('menu1').innerHTML = "<a href=\"javascript:void(0)\" onclick=\"change('menu1','div1','メニュー1')\">メニュー1</a>"; document.getElementById('div1').style.display="none"; document.getElementById('menu2').innerHTML = "<a href=\"javascript:void(0)\" onclick=\"change('menu2','div2','メニュー2')\">メニュー2</a>"; document.getElementById('div2').style.display="none"; document.getElementById('menu3').innerHTML = "<a href=\"javascript:void(0)\" onclick=\"change('menu3','div3','メニュー3')\">メニュー3</a>"; document.getElementById('div3').style.display="none"; document.getElementById(spanid).innerHTML = menuName; document.getElementById(divid).style.display="block"; } </script> <ul> <li><span id="menu1">メニュー1</span></li> <li><span id="menu2"><a href="javascript:void(0)" onclick="change('menu2','div2','メニュー2')">メニュー2</a></li> <li><span id="menu3"><a href="javascript:void(0)" onclick="change('menu3','div3','メニュー3')">メニュー3</a></li> </ul> <div id="div1"> test1 </div> <div id="div2" style="display:none"> test2 </div> <div id="div3" style="display:none"> test3 </div> </body> </html>

  • FireFoxだけちゃんとうごいてくれないです

    いつもお世話になっています。 Javascriptでメニューを閉じたり開いたりさせたくて難儀してます。 <script type="text/javascript"> <!-- // ツリーメニュー flag = false; function treeMenu(tName) { tMenu = document.all[tName].style; if(tMenu.display == 'none') tMenu.display = "block"; else tMenu.display = "none"; } //--> </SCRIPT> <li class="li> <a href="javaScript:treeMenu('treeMenu')">メニュー</a> </li> <DIV id="treeMenu" style="display:none"> <li class="li_sub"> <a href="index.html"> 小メニュー1 </A> </li> <li class="li_sub"> <a href="index.html"> 小メニュー2 </A> </li> </DIV> こんな感じでクリックすると小メニューが出てさらにクリックで非表示になるようにしています。 IE8やGoogleChromeですとうまくいきます。 (Safariではまだ試していません。) が・・・ FireFox3ではウンともスンともいいません。 記述自体がFirefox3では受け付けないのでしょうか? 根本的に考え方が違うぞ!とか そういったご意見でもかまいません。 どうかお助けください。 よろしくお願いいたします。

  • 擬似フレームでのページ内リンクについて

    擬似フレームの横分割のレイアウトで、 左に位置固定された折りたたみ式メニュー 右にメイン画面を置いてあります。 左で折りたたみメニューを開き、ページ内リンクで右に出てくる本文の項目ごとにリンクさせたいんですが普通にaタグを設置してみても上手くいきません。 どうやったらできるでしょうか? 折りたたみメニュー ・外部js function oritatami(id){ obj=(document.all)?document.all(id):((document.getElementById)?document.getElementById(id):null); if(obj) obj.style.display=(obj.style.display=="none")?"block":"none"; } ・外部CSS body { font-size: 82%; color: #505050; position: relative; padding: 0px 20px 0px 150px; } #PAGETOP { margin: 0px auto; max-width: 700px; } #MENU { width: 220px; padding-top: 20px; position: fixed; left: 30px; top: 0px; font-size: 85%; } .box{ line-height: 1.2; background-color: #FFFFFF; border: 1px solid #000000; padding: 1em; margin-top: 0.5em; } #MEIN {line-height: 1.5;} 以下、text.htmlのソース ----------------------------------------- (中略) <body> <div id="PAGETOP"> <div id="HEADER"> (中略) </div> <!--  左メニュー  --> <div id="MENU"> <div class="box"> <ul> <li><a href="text.html" onclick="oritatami('o0');return false">メニュー1</a></li> <div id="o0" style="display:none"> <ul> <li><a href="text.html#abc.html">ABC</a> <li><a href="text.html#def.html">DEF</a> </ul> </div> </div> </div> <!--  右メイン  --> <div id="MEIN"> <h2 id="abc">ABC</h2> (中略) <h2 id="def">DEF</h2> (中略) </div> <div id="FOOTER"> (中略) </div> </div> </body> 検討よろしくお願いします。

    • ベストアンサー
    • HTML
  • クリックで表示、非表示するメガメニュー

    クリックで表示して再度クリックすると非表示になるメガメニューを作ろうと思ってます。 下記のページを参考にjQueryでマウスオーバーによるメガメニューは作成しました。 http://www.skuare.net/test/jmegadropdown.html ただ、jQueryどころかjavascriptも昔少しやった程度しか知識がありませんので、ソースはほぼ上記のページと同じです。 これをクリックでメニュー表示して、再クリックで非表示にするにはどうしたらよいでしょうか? 具体的にはマイクロソフトのページの上にあるようなメニューです。 http://www.microsoft.com/ja-jp/default.aspx 自分の今の知識でjavascriptを使って書いたコードは下記のとおりです。 このように書いていけば出来るとは思うのですが、もっと効率よく出来る方法はあるでしょうか? よろしくお願いします。 function test1() { $("#topnav li .products1 .sub").toggle(); $("#topnav li .sale1 .sub").css("display", "none"); } function test2() { $("#topnav li .products1 .sub").css("display", "none"); $("#topnav li .sale1 .sub").toggle(); } <ul id="topnav"> <li> <a href="#" class="products" onclick="test1()">Products</a> <div class="products1"> <div style="opacity: 0; display: none; width: 600px;" class="sub"> <ul> <li><h2><a href="#">menu1</a></h2></li> <li><a href="#">Link1</a></li> <li><a href="#">Link2</a></li> </ul> <ul> <li><h2><a href="#">menu2</a></h2></li> <li><a href="#">Link1</a></li> <li><a href="#">Link2</a></li> </ul> </div> </div> </li> <li> <a href="#" class="sale" onclick="test2()">Sale</a> <div class="sale1"> <div style="opacity: 0; display: none; width: 450px;" class="sub"> <ul> <li><h2><a href="#">menu</a></h2></li> <li><a href="#">Link - 1</a></li> <li><a href="#">Link - 2</a></li> <li><a href="#">Link - 3</a></li> <li><a href="#">Link - 4</a></li> </ul> </div> </div> </li>

  • メニューを変えたい

    こんにちは。メニューをつくったのですが、カテゴリーをクリックすると+がマイナスになり、サブカテゴリが現れ、サブカテゴリをクリックすると+に閉じてしまいます。 <script type="text/javascript"><!-- function oritatami(id,id2){ obj=(document.all)?document.all(id):((document.getElementById)?document.getElementById(id):null); if(obj) obj.style.display=(obj.style.display=="none")?"block":"none"; if(document.all){ with(document.all(id2)){innerText=(innerText=="+")?"-":"+";} } else if(document.getElementById){ with(document.getElementById(id2)){firstChild.nodeValue=(firstChild.nodeValue=="+")?"-":"+";} } } //--></script> これを下記の様に変更したいと思いますのでご教示お願い致します。 ●サブカテゴリをクリックしてもメインのカテゴリは閉じないで、マイナスのままで開いておき、閉じる時は又メインのマイナスのカテゴリをクリックすると全て閉じてプラスに戻る 説明が下手で申し訳ございませんが、理解して下さると助かります。

  • 表示・非表示のスクリプトで、複数指定する場合はどうしたらいいですか?

    複数のコンテンツをボタンクリックにて表示・非表示にしたいのですが、うまくいきません。 なんとか、2つまではわかったのですが、3つまで表示すると3つ目が非表示になってくれません。 最終的には5つくらいを下記のスクリプトで行いたいのですが、どうすれば、複数のIDを対応させることができますか? ●例えば、test1を押した際、test2と3は非表示としたいです。 <script language="JavaScript" type="text/JavaScript"> <!-- function ChDsp2(strShow,strHidden){ var obj=''; obj=document.all && document.all(strShow) || document.getElementById && document.getElementById(strShow); obj.style.display = "block"; obj=document.all && document.all(strHidden) || document.getElementById && document.getElementById(strHidden); obj.style.display = "none"; } //--> </script> <a href="javascript:ChDsp2('text1','text2');">1を表示</a> <a href="javascript:ChDsp2('text2','text1');">2を表示</a> <a href="javascript:ChDsp2('text3','text1');">3を表示</a> <span id="text1" style="display:block;">111111</span> <span id="text2" style="display:none;">222222</span> <span id="text3" style="display:none;">333333</span> どなたか教えてください。お願いします。

専門家に質問してみよう