• 締切済み

アマゾンの左のメニューのような物を作りたくて

某大型掲示板のjavascript質問スレに書き込んだのですが スルーされてしまったので、こちらに書かせていただきます。 onMouseover="openMenu(1)" onMouseout="closeMenu(1)" function openMenu(n){ clearTimeout(CloseTime); closeInstant(); if(n==1){ OpenTime=setTimeout('li1.style.display="block";',300); } if(n==2)… } function closeMenu(n) { CloseTime=setTimeout('clearTimeout(OpenTime);',100); if(n==1){ CloseTime=setTimeout('li1.style.display = "none";',300); } if(n==2)… } とやったのですが、メニュー間の移動をすると、移動先のメニューが出てきません。 clearTimeoutが効いていないような気がするのですが、初心者な物で良く分かりません…。 どなたか助けていただけませんか?

みんなの回答

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

回答がないみたいなので・・・ >書き込んだのですがスルーされてしまったので、~ スルーするというよりも、皆さん(私も含めて)回答できないだけではないかと想像します。 >アマゾンの左のメニューのような物~ とありますが、   http://www.amazon.co.jp/ には「左メニュー」らしきものは見当たらないし、なさりたいことが不明なので回答のしようがないのではないのかな… 質問文もコードの一部のみですし、HTMLの構成もわからないので、想像して回答しようにもヒントが少なすぎるということではないでしょうか? ということで、表示されている内容からめいっぱい想像をたくましゅうしてみると… ・closeInstantが何を行っているのか不明ですが、それが何か悪さをしていないでしょうか?(実行時エラーをおこしていないか等) ・表示/非表示を切り替える処理だけのように見えますが、なぜわざわざsetTimeoutを利用しているのか不明です。単純に、表示/非表示の切替処理だけにすれば不具合は生じないのでは。 >メニュー間の移動をすると、移動先のメニューが出てきません (以下は、想像100%ですが…) イベントのセットがどのように(どの要素に)されているのか不明ですが、mouseover、mouseoutが連続して発生すると仮定すれば、setTimeoutで指定された処理内容の前にこれらが連続して処理されることになります。 単純に、同じイベントが設定されている二つの要素間でover→out→overが0.1秒以下で発生した場合を考えてみれば、  *closeInstantは内容が不明なので無視しています。  *対象要素が不明なので、特定せずに考察 1)mouseover(要素1)  (1) 以前の非表示処理をキャンセル  (2) 表示処理を0.3秒後にセット 2)mouseout(要素1)  (3) 表示処理のキャンセルを0.1秒後にセット  (4) 非表示処理を0.3秒後にセット 3)mouseover(要素2)  (5) 非表示処理をキャンセル((4)をキャンセル)  (6) 表示処理を0.3秒後にセット 4)約0.1秒後  ・ (3)が実行され、(6)がキャンセルされる 5)約0.3秒後  ・ (2)が実行され表示 となるので、結果的に(2)で指定された要素が表示されていませんか。 質問文には記載がありませんが、どこかのメニュー(上例では要素1のmouseoverの際に表示される要素)が表示されているのではないかと想像します。 (全てがn=1として設定されているのか、違う処理になっているのか不明ですし、n=1以外の場合どのような処理になっているのかも不明ですが…) (↑)の順序は操作のタイミングに大いに依存するので、タイミングが異なれば違う結果になりますし、処理がもっと多重に重なった場合も同様です。 スクリプトが実行時エラーで停止しているような場合も、上記とは異なった処理内容になると考えられます。 普通のサイトであれば、ソースを見ることでどのようなHTML構成やスクリプトで処理を実現しているのかがわかりますので、サンプルサイトがあるのであれば、それを見本に作成するのが手っ取り早いと思います。

関連するQ&A

  • 展開メニューの修正

    展開メニューの修正 をしています。 menu.js------------------------ function block(id){ if(document.getElementById){ if(document.getElementById(id).style.display == "none"){ document.getElementById(id).style.display = "block"; }else if(document.getElementById(id).style.display == "block"){ document.getElementById(id).style.display = "none"; } } } html--------------------------- <div onMouseOut="block('block1')"> <div onMouseOver="block('block1')"><a href="***">コンテンツ名</a></div> <div id="block1" style="display: none;"> <ul> <li><a href="***">サブコンテンツ</a></li> <li><a href="***">サブコンテンツ</a></li> <li><a href="***">サブコンテンツ</a></li> <li><a href="****">サブコンテンツ</a></li> </ul></div></div> 「コンテンツ名」に触った時展開して、サブコンテンツor「コンテンツ名」から離れた時にサブコンテンツを閉じる、という挙動まではできているのですが、 サブコンテンツのメニュー間を移動する際にちらつくというかいちいち閉じてしまうのを直したいのですが、どうしたらいいのでしょうか? よろしく御教授ください。

  • 砂時計について教えてください。

    下のように記述すると、NN、Firefoxの最新版では特に何もないのですが、IEの最新版ではマウスカーソルを動かすたびに砂時計がチカチカと出る理由を教えてください。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <script type="text/JavaScript"> <!-- function over(){document.getElementById("menu0").style.display="block";} function over2(n){ for(i = 1;i < 2;i++){ document.getElementById("menu"+i).style.display="none"; } document.getElementById("menu"+n).style.display="block"; document.getElementById("menu"+n).style.top=(n*20)-20+"px"; } function out(n){ for(i = 1;i < 2;i++){ document.getElementById("menu"+i).style.display="none"; } } //--> </script> <table cellspacing="0" cellpadding="0"> <tr> <td valign="top"> <div id="menu0" style="display:none;"> <div onmouseover="over2(1)"><a href="url01.html">link01</a></div> </div> </td> <td valign="top"> <div id="menu1" style="display:none;" onmouseover="over2(1)" onmouseout="out(1)"> <div><a href="url11.html">link11</a></div> </div> <div id="menu2" style="display:none;" onmouseover="over2(2)" onmouseout="out(2)"> <div><a href="url21.html">link21</a></div> </div> <div id="menu3" style="display:none;" onmouseover="over2(3)" onmouseout="out(3)"> <div><a href="url31.html">link31</a></div> </div> </td> </tr> </table>

  • オンマウスで表示されるサブメニューについて

    よろしくお願い致します。 メインメニューにオンマウスすると、サブメニューが表示される ようにしたく、下記のようなコードを使用しています。 FirefoxやsSafariで起きる問題なのですが、サブメニューを表示 した状態で他のページに移動後、ブラウザのバックを使用しても 戻ってきたとき、移動前に表示していたサブメニューが開いたまま になっており、その後ずっと開いたままで非表示にならないことが あります。 色々試してみたのですが、うまく行かず困っています。 どうか解決策をお教え下さいますようお願い致します。 <html> <head> <script type="text/javascript"> <!-- function showHide(targetID) { if( document.getElementById(targetID)) { if( document.getElementById(targetID).style.display == "none") { document.getElementById(targetID).style.display = "block"; } else { document.getElementById(targetID).style.display = "none"; } } } window.onload = function() { document.getElementById(targetID).style.display = "none"; }; //--> </script> </head> <body> <a href="#" onMouseOver="showHide('subnavi');return false;">メインメニュー</a> <div id="subnavi" style="display:none;"> <a href="http://www.yahoo.co.jp/">サブメニュー</a> </div> </body> </html>

  • cssでdisplay:noneを指定した時のプルダウンメニュー

    こんにちは、JavaScriptでプルダウンメニューを作ろうとして cssで予めdisplay:none;を指定したところ、 メニューがクリックしても開かなくなってしまいました。 html、css、JavaScriptの記述は以下の通りです。 html --------------------------------------- <span onclick="PullDown('term1')">クリック</span> <div id="term1"> <ul> <li>***********</li> <li>***********</li> </ul> </div> ----------------------------- css ------------------------------ div#term1 { display: none; } ------------------------------- JavaScript ------------------------------- function PullDown(id){ if(document.getElementById(id).style.display == 'none') document.getElementById(id).style.display=''; else document.getElementById(id).style.display='none'; } --------------------------------- cssの記述部分を無くすとちゃんと開いたり閉じたりと動作します。 また、 function Init(){ document.getElementById("term1").style.display="none"; } とJavaScriptで書いて、 bodyタグの所で <body onload="Init()">として呼び出してロード時に隠すようにするとちゃんと開閉してくれます。 cssでdisplay:none;と書くと動かなくなる理由と、 対策が分かる方居ましたら教えてください。

  • 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"; }

  • 折り畳みメニューを使った場合の画像の空きについて

    使用ソフトはドリームウィーバーです。 折り畳みメニューを使いたく、以下のとおり書いたのですが、 なぜか、サブメニューの画像が開いたときに微妙に空きがでます。 マージン0にしてあるのですが、どうしても画像と画像の間があいてしまいます。 どうやったら詰められるのでしょうか? 教えていただけますか? <script language="JavaScript"> <!-- function msl(idmn){ if(document.getElementById) document.getElementById(idmn).style.display='block' else if(document.all)document.all(idmn).style.display='block' } function kks(idmn){ if(document.getElementById) document.getElementById(idmn).style.display='none' else if(document.all)document.all(idmn).style.display='none' } //--> </script> <style type="text/css"> <!-- .menu{ width : 110px; cursor : pointer; } .sub{ display : none; margin: 0px; padding: 0px; } ul{ margin:0px; padding: 0px; } ul li{ margin:0px; list-style-type: none; padding: 0px; height: 22px; width: 110px; } ul li img{ margin:0px; padding: 0px; } --> </style> </head> <body> <noscript>※JavaScriptを有効にしてご覧下さい。</noscript> <div class="menu" onclick="javascript:msl('sub_a')" ondblclick="javascript:kks('sub_a')"><img src="シモン/html/images/menu01.gif" /></div> <ul class="sub" id="sub_a"> <li><img src="シモン/html/images/menu01_01.gif" /></li> <li><img src="シモン/html/images/menu01_02.gif" /></li> <li><img src="シモン/html/images/menu01_03.gif" /></li> <li><img src="シモン/html/images/menu01_04.gif" /></li> <li><img src="シモン/html/images/menu01_05.gif" /></li> </ul>

  • 特定の場所の番号を連続して入力する方法やソフト

    <a onmouseover="txt1.style.display='block'" onmouseout="txt1.style.display='none'"> 上記ので「txt1」という2つの部分だけを <a onmouseover="txt2.style.display='block'" onmouseout="txt2.style.display='none'"> <a onmouseover="txt3.style.display='block'" onmouseout="txt3.style.display='none'"> 「txt2」「txt3」と書きかえていき、今現在1200まで書いてきました。 しかし「txt10000」まで書かなくてはいけません、大変なので数字の部分だけ連続して番号を書けるようになるソフトはありますでしょうか?。

  • JavaScriptによる疑似プルダウンメニュー

    他の方が作成したサイトの管理を引き継ぎ更新していますが、サイドメニューに使用されているJavaScriptがわかりません。 現在のサイドメニューは、以下のようになっています。 ●米 ●果物  ○いちご ←初期状態は”display: none”、「果物」クリックで展開 ●野菜  ○トマト ←初期状態は”display: none”、「野菜」クリックで展開 ●味噌 この小要素を、以下のように増やしたいのです。 ●果物  ○いちご  ○りんご  以下、数は可変 現在の該当部分のソースは、 【HTML】 <ul id="menu"> <li><a href="kome.html">米</a></li> <li><a href="#" onclick="kudamonoshow();">果物</a></li>  <li id="line1" style="display: none;"><a href="kudamono01.html"> いちご</a></li> <li><a href="#" onclick="yasaishow();">野菜</a></li>  <li id="line2" style="display: none;"><a href="yasai01.html"> トマト</a></li> <li><a href="miso.html">味噌</a></li> </ul> 【JS】 function kudamonoshow() { if (document.getElementById('line1').style.display == 'none') document.getElementById('line1').style.display='block'; else document.getElementById('line1').style.display='none'; } function yasaishow() { if (document.getElementById('line2').style.display == 'none') document.getElementById('line2').style.display='block'; else document.getElementById('line2').style.display='none'; } このソースで何が起きているかは理解しましたが、項目の増やし方が分かりません。 IDはページに一つということなので、試しにHTMLを <li><a href="#" onclick="kudamonoshow();">果物</a></li> <div id="line1" style="display: none;">  <li><a href="kudamono01.html"> いちご</a></li>  <li><a href="kudamono02.html"> りんご</a></li> </div> と、隠したい部分に強引にdivを使いIDを指定したところ、FireFox(Win&Mac)およびSafari(Mac)では正常に動作しますがIE7では動作せず、常に全てのリストが表示されている状態になり、レイアウトも崩れてしまいます。 (IE6は現在手元にありません) IEでも動作させるにはどうしたらいいのでしょうか? リストタグを使わない疑似プルダウンのソースは見つけましたが、このサイトでは他にもプログラムが色々動いているので、できれば変更は最小限にしたいと考えています。 足りない情報がありましたら追加します。よろしくお願いします。

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

    <head> <script type="text/javascript"> <!-- function exMenu_close(tName) { tMenu = document.all[tName].style; if (tMenu.display == 'block') tMenu.display = "none"; } function exMenu(tName) { tMenu = document.all[tName].style; if (tMenu.display == 'none') {tMenu.display = "block";} else {tMenu.display = "none";} } // --> </script> <style type="text/css"> <!-- ul{margin:0px;width:164px; list-style-type:none;} li,li a:link{height:20px; width:164px;background-color:yellow;} #menu a:link{background-image:url(img.gif);} #menu a:hover,#menu a:active{ background-image:url(img2.gif);} ---> </style> </head> <body onload="exMenu_close('treeMenu');"> <ul> <li id="menu"><a href="javaScript:exMenu('treeMenu')">LINK</a></li> </ul> <div id="treeMenu" style="display:block"> <ul> <li><a href="./page1.html" target="right">MENU1</a></li> <li><a href="./page2.html" target="right">MENU2</a></li> </ul> </div> 左がメニューで、右がメインページの左右にわけたフレームページを作成予定です。メニューには折りたたみメニューを使いたいと考えています。 http://www.flying-h.co.jp/faq/index.html ↑は折りたたみメニューではありませんが、イメージとしては同じような感じです。メニューをクリックすると、クリックしたメニューの色が変更され、維持します。そしてその下に新たなメニューが表示されます。 説明下手ですみません、わかりにくい場合はHotmailのメニューをご覧いただくと分かりやすいかも知れません、クリックするとメニューの色が変わったままの状態を維持します。 上記折りたたみメニューでは、hoverとactiveにimg2.gifを設定していますが、これではリンクとは異なる別の箇所をクリックすると元のimg.gifに戻ってしまいます。 開かれたメニューの背景画像を常にimg2.gifにしたいのですが、方法がわかりません。 JavaScriptは自分で作るだけの知識がほとんどないため、配布されているものを探し回っていますが、見つかりませんでした。このようなメニューをご存知の方、参考サイト、又は、上記スクリプトをどのように改造すればいいのかお教えいただけないでしょうか。 ちなみに、Hotmailのソースをみてみましたが、複雑すぎて自分の知識では解析不可能でした。 お手数をおかけいたしますが、よろしくお願いいたします。

  • 折りたたみメニューがFirefoxで認識されない

    ホームページに折りたたみ式のメニューを設置しようと思い以下の用件を満たすプログラムを検索しました。 「別のメニューをクリックすると閉じる折りたたみメニュー」 ホームページの縦幅を固定するレイアウトのためにメニューをすべて開いてしまうと固定幅に収まらないためです。 選択している一つ以外は閉じているという状態を維持するものです。 以下の案件を見つけました。 http://oshiete1.goo.ne.jp/qa1436588.html この例にならって設置してみました。 IE7ではうまく動作しますが、Firefox3.0ではポインタが変化せずクリックもできません。 ソースは以下です。 ------------------------------ <script language="JavaScript"> <!-- function doClick() { var strName; var intNo; myObj = window.event.srcElement; if((myObj.id=="")||(myObj==null))return true; /* 対象となるメニューを取得 */ strName = myObj.id + "_menu"; var thisMenu = document.all.item(strName); if(thisMenu !=null) if(thisMenu.style.display == "block") { /* 対象メニューが開いていたらそれを閉じるだけ */ thisMenu.style.display = "none"; } else { /* 対象メニューを開く */ thisMenu.style.display="block"; intNo=1; strName="cate" + intNo + "_menu"; while(document.all.item(strName)!=null) { /* 対象メニュー以外は閉じる */ if(thisMenu != document.all.item(strName)) document.all.item(strName).style.display="none"; intNo++; strName="cate" + intNo + "_menu"; } } } //--> </script> ------------------------------ 本文は ------------------------------ <body onclick="doClick()"> <ul> <li><a id="cate1">カテゴリ</a> <ul id="cate1_menu" style="display:none;"> <li><a href="index.html">menu1</a></li> <li><a href="index.html">menu2</a></li> </ul></li> <li><a id="cate2">カテゴリ</a> <ul id="cate2_menu" style="display:none;"> <li><a href="index.html">menu3</a></li> <li><a href="index.html">menu4</a></li> <li><a href="index.html">menu5</a></li> </ul></li> </ul> </body> ------------------------------ です。いろいろ試してみましたが初心者のため不具合箇所が特定できません。。 ご教授願えませんでしょうか。