オンマウスのツリーメニュー:サーバーにアップすると表示が遅が

[新着] Webテンプレートを仮オープンしました



0   名前: あわよ : 2006/05/28(日) 00:21

【現在の状況】
ツリーメニューの部分が、サーバーにアップした状態で見ると、いったん開かれた状態で見え、ワンクッション置いて隠れてくれる。

【どうしたいのか】
ページ切り替え時に開かれた状態で見えるのではなく、普通に表示したい。

【備考】
ローカルでは普通に表示され、ワンクッションの遅れもない。
IE6.0 Opera8.0 8.5で確認しました。

http://www.tagindex.com/kakolog/q4bbs/1/46.html
こちらのPidさんの記事を参考にしました。
<script type="text/JavaScript">
<!--
onload = function() {

function PopupView(id) {
if (!document.getElementById) return;
var node = document.getElementById(id);
if (node) PopupView.initializer.call(node.childNodes);
}

PopupView.initializer = function() {
for (var i = 0, I = this.length; i < I; i++) {
PopupView.switcher.call(this[i].childNodes, 'none');
this[i].onmouseover = function() { PopupView.switcher.call(this.childNodes, 'block'); }
this[i].onmouseout = function() { PopupView.switcher.call(this.childNodes, 'none'); }
}
}

PopupView.switcher = function(displayValue) {
for (var i = 0, I = this.length; i < I; i++) {
if (!this[i].nodeName.match(/^[OU]L$/)) continue;
this[i].style.display = displayValue;
this[i].style.position = 'absolute';
}
}


new PopupView('menu1');
}
-->
</script>
<style type="text/css">
<!--
#menu_main{
	width:720px;
	font-size: 85%;
}
.menu {
	padding: 0;
	margin: 0;
}

.menu ul {
	margin: 0;
	padding: 0;
}

.menu li {
	margin: 0;
	padding: 0;
	position: relative;
	float: left;
	width: 80px;
	list-style: none;
}

.menu li ul {
	margin: 0;
	padding: 0;
}

.menu a {
	display: block;
	width: 100%;
	color: #666;
	text-decoration: none;
	text-align: center;
	line-height: 2.5em;
}

.menu a:hover {
	color:#cccccc;
}
-->
</style>
</head>
<body>
<div id="menu_main">
<ul class="menu" id="menu1">
<li><a href="index.html">Home</a></li>
<li><a href="profile.html">プロフィール</a></li>
<li><a href="photo.html">ネイルフォト</a></li>
<li><a href="shop.html">ショップ</a>
<ul>
<li><a href="shop.html">ご案内</a></li>
<li><a href="#">ネイルチップ</a></li>
<li><a href="#">ビーズアクセ</a></li>
</ul></li>
<li><a href="nailcare.html">ネイルFAQ</a>
<ul>
<li><a href="nailcare.html">簡単ケア</a></li>
<li><a href="nail_kiso.html">基礎知識</a></li>
</ul></li>
<li><a href="ot_con.html">その他</a>
<ul>
<li><a href="ot_con.html">コンテスト</a></li>
<li><a href="ot_nail.html">イベント</a></li>
<li><a href="ot_pre.html">プレゼント</a></li>
</ul></li>
<li><a href="link.html">リンク</a></li>
<li><a href="mail.html">お問合せ</a></li>
<li><a href="#">ブログ</a></li>
</ul>
</div>
</body>
</html>


よろしくお願いします。


1   名前: Pid ◆byEkK9OALr : 2006/05/28(日) 00:21
古いコードが……。その書き方だと他のスクリプトと衝突する可能性があるのですが,まあ,横よりも後ろの互換性を重視すると言い訳しときます。

Mozilla 1.8b,Konqueror 3.3,Safari 2.0,WinIE 6.0,MacIE 5.0 で動作確認。なお,style 要素を直接書き出すようにしたので,必ず head 要素内で実行させて下さい。

if (document.implementation
    && document.implementation.hasFeature ('HTML', null))

(function () {
//////////////////////////////////////////////////////////////
// id を指定する。PopupView ('menu1', 'menu2', 'menu3') のよう
// に複数指定も可。id が見つからない場合は無視されるだけ。

PopupView ('menu1');

//////////////////////////////////////////////////////////////
    
    function PopupView () {
        var args = arguments;
        
        document.write ('<style type="text/css">');
        
        forEach (arguments, function (id) {
            var selector = '#' + id + ' li ul, #' + id + ' li ol ';
            document.write (selector + '{ display: none; position: absolute; }\n');
        } );
        
        document.write ('\u003C/style>');
        
        window.onload = function () { main (args); };
    }
    
    function forEach (obj, callback) {
        for (var i = 0, I = obj.length; i < I; i++)
            callback (obj[i]);
    }
    
    function main (IDs) {
        forEach (IDs, function (id) {
            node = document.getElementById (id);
            
            if (node)
                init (node.childNodes);
        } );
    }
    
    function init (nodes) {
        forEach (nodes, function (node) {
            switcher (node.childNodes, 'none');
            node.onmouseover = function () { switcher (this.childNodes, 'block'); };
            node.onmouseout  = function () { switcher (this.childNodes, 'none' ); };
        } );
    }
    
    function switcher (nodes, displayValue) {
        forEach (nodes, function (node) {
            if (node.nodeName.match (/^[OU]L$/))
                node.style.display  = displayValue;
        } );
    }
    
} )();


他,JavaScript による多階層式ポップアップメニューとして。
http://inspire.server101.com/js/mb/
http://kapu.iwoky.jp/rcug/popupmenu.htm

なお,この種のメニューは(IE6 を捨てて IE7 を待てるなら)CSS だけで十分可能です。本来ならば JavaScript を使うまでもありません。
http://www.wiredope.com/csstemp/?p_id=sample_dynamic_2

2   名前: あわよ : 2006/05/28(日) 00:21
Pidさん、ありがとうございます!

数あるツリーメニューのテンプレのうち、このPidさんのスクリプト?が一番分かりやすかったので参考にさせていただいていました。
古いものを掘り起こしてしまって申し訳ないです;;

自分でもJavaScriptを勉強しようと思っているのですが、どうしてもなかなか頭に入らなくて・・・。

ただいま出先で確認できないため、リンク先のほうも参考にしつつ帰ったらやってみます!

3   名前: あわよ : 2006/05/28(日) 00:21  ID:NE/hXXSx
動作確認しました。
希望通りの動きなので感謝感謝です!

質問があるのですが、
>なお,style 要素を直接書き出すようにしたので,必ず head 要素内で実行させて下さい。

このJavaScriptの記述は外部jsではなく、HTMLファイルのほうに記述すると言う意味でしょうか?
その場合、スタイルシートも外部ではなく、HTMLファイルのほうがいいのですか?

試しに、JavaScript・スタイルシート共に外部にしてみたのですが、意図するように動いてくれました。
なので、どうして「必ず」なのかがわからなくて。。。
質問だらけですみません。

4   名前: Pid ◆byEkK9OALr : 2006/05/28(日) 00:21
すみません,私の書き方が分かりづらかったですね。

もちろん,外部スクリプトでも結構です(むしろ推奨です)。ただ,<script type="text/javascript" src="sample.js"></script> は,body 要素内ではなく,必ず head 要素内に置いて下さい。


※元々のスクリプトは,実は head/body 内のどこに置いても構わなかったのです。今回もそのように改造したかったのですが,IE/Gecko/Safari/Opera/その他でそれぞれ分岐する必要があります。あまりコードを長くしたくはなかったので,今回は一番手軽な方法を使いました。その分,使用の際の注意事項が一つ増えてしまった,ということです。まあ要するに,私の手抜きのせいです。

5   名前: あわよ : 2006/05/28(日) 00:21  ID:NE/hXXSx
そういうことだったんですね!
ありがとうございました。

これを元に少しでも理解できるよう頑張ってみます。
また躓いたらそのときはよろしくお願いします。

一覧へ戻る