
JavaScript初心者です。ツリーメニューを使いたいのですが、リンクから別のページ(別のディレクトリ)に移動した時、クッキーを使って、展開した状態を保持したいのですが、よく分かりません。
enptybox22さんの
http://oshiete.homes.jp/qa3084680.html
回答記事にあったクッキー処理のプログラムをそのまま入れてみたのですがうまく動きません。
設置URLは
http://blove.cc/tes1/
になります。
どうぞよろしくお願いいたします。
A 回答 (6件)
- 最新から表示
- 回答順に表示

No.5
- 回答日時:
答えようかどうか迷ったが答ええることにしました
まず</li>が抜けていること。それが問題の解決ではないけど・・・
<ul>を開くとき、その子Nodeが開いているかもCookieに保存することにした
解説など無意味だと思うが、一応。
キャッシュ?クッキーの保存状態を自分で観察してください。
<?xml version="1.0" encoding="shift_jis"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio … xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head profile="http://happy.am/">
<meta content="text/html; charset=Shift_JIS" http-equiv="Content-Type" />
<title></title>
<meta content="ja" http-equiv="Content-Language" />
<meta content="text/css" http-equiv="Content-Style-Type" />
<meta content="text/javascript" http-equiv="Content-Script-Type" />
<style type="text/css"><!--
ul { list-style-type:none; }
a { text-decoration:none; }
a:hover { text-decoration:underline; }
--></style>
<html>
<body>
<ul id="a" style="display:none">
<li>A
<ul>
<li><a href="http://blove.cc/tes1/">A-1</a></li>
<li>A-2
<ul>
<li><a href="http://blove.cc/tes1/">ページ1へ飛ぶ</a></li>
<li><a href="http://blove.cc/tes2/">ページ2へ飛ぶ</a></li>
</ul>
</li>
<li>A-3
<ul>
<li><a href="http://blove.cc/tes1/">ページ1へ飛</a></li>
<li><a href="http://blove.cc/tes2/">ページ2へ飛ぶ</a></li>
</ul>
</li>
</ul>
</li>
<li>b
<ul>
<li><a href="http://blove.cc/tes1/">ページ1へ飛ぶ</a></li>
<li><a href="http://blove.cc/tes2/">ページ2へ飛ぶ</a></li>
</ul>
</li>
</ul>
<script>
window.onload=function(){ openTreeMenu('a');}
window.document.onclick=chkClick;
function chkClick(e){
var f=true;
var obj = e?e.target:event.srcElement;
if(obj.tagName!='LI') return;
saveCookie('li',getFirstText(obj),10);
saveCookie('lic',getChildUL(obj),10);
if(f) openTreeMenu('a'); else {
var sobj = obj.firstChild;
while(sobj.nodeName!='UL'){ sobj=sobj.nextSibling; if(!sobj) return;}
sobj.style.display=(sobj.style.display=='none')?'block':'none';
}
}
function openTreeMenu(id,text,f){
var obj = document.getElementById(id), objs=obj.getElementsByTagName('ul');
for(var i=0,m=objs.length;i<m;i++) objs[i].style.display = 'none';
if(text==undefined) text = loadCookie('li');
if(f==undefined) f=loadCookie('lic')-0;
if(text){
var objs = obj.getElementsByTagName('li');
for(var i=0,m=objs.length;i<m;i++){
if(getFirstText(objs[i])==text){
var t=objs[i];
do{t=t.parentNode; if(t.nodeName=='UL') t.style.display='block';} while(t.nodeName!='BODY');
if(!f){
var t=objs[i].firstChild;
while(t){if(t.nodeName=='UL') t.style.display='block';t=t.nextSibling;}
}
}
}
}
obj.style.display='block';
}
function getFirstText(obj){var nd=obj.firstChild;while(nd.nodeName!='#text'){nd=nd.nextSibling; if(!nd) return false;}return nd.nodeValue;}
function getChildUL(obj){var t=obj.firstChild; while(t){if(t.nodeName=='UL') if(t.style.display=='block')return 1;t=t.nextSibling;}return 0;}
function saveCookie( vn, v, dy ){ if(navigator.cookieEnabled) document.cookie=vn+'='+escape(v)+ ';expires='+new Date((new Date()).getTime()+dy*86400000).toGMTString();}
function loadCookie(vn){ var r = '',o = document.cookie.split('; '); for (var i in o){ var c = o[i].split('='); if (c[0]==vn && c[1]!=''){ r = c[1]?unescape(c[1]):'';break; }} return r;}
</script>
</body>
</html>

No.4
- 回答日時:
まちがえた!
<html>
<body>
<ul id="a" style="display:none">
<li>A
<ul>
<li>A-1</li>
<li>A-2
<ul>
<li>A-2-1</li>
<li>A-2-2</li>
</ul>
</li>
</ul>
</li>
<li>b
<ul>
<li><a href="htp:?www.">world</a></li>?
<li>b-2</li>
</ul>
</li>
</ul>
<script>
window.onload=function(){ openTreeMenu('a');}
window.document.onclick=chkClick;
function openTreeMenu(id,text){
var obj = document.getElementById(id), objs=obj.getElementsByTagName('ul');
for(var i=0,m=objs.length;i<m;i++) objs[i].style.display = 'none';
if(text==undefined) text = loadCookie('li');
if(text){
var objs = obj.getElementsByTagName('li');
for(var i=0,m=objs.length;i<m;i++){
if(getFirstText(objs[i])==text){
var t=objs[i];
do{t=t.parentNode; if(t.nodeName=='UL') t.style.display='block';} while(t.nodeName!='BODY');
var t=objs[i].firstChild;
while(t){if(t.nodeName=='UL') t.style.display='block';t=t.nextSibling;}
}
}
}
obj.style.display='block';
}
function chkClick(e){var obj = e?e.target:event.srcElement;if(obj.tagName!='LI') return;var text=getFirstText(obj); saveCookie('li',text,10); openTreeMenu('a',text);}
function getFirstText(obj){var nd=obj.firstChild;while(nd.nodeName!='#text'){nd=nd.nextSibling; if(!nd) return false;}return nd.nodeValue;}
function saveCookie( vn, v, dy ){ if(navigator.cookieEnabled) document.cookie=vn+'='+escape(v)+ ';expires='+new Date((new Date()).getTime()+dy*86400000).toGMTString();}
function loadCookie(vn){ var r = '',o = document.cookie.split('; '); for (var i in o){ var c = o[i].split('='); if (c[0]==vn && c[1]!=''){ r = c[1]?unescape(c[1]):'';break; }} return r;}
</script>
</body>
</html>
どうもありがとうございます!
設置してみました。
http://blove.cc/tes1/
キャッシュですが、正常に取得できない場面があります。
ツリーの動作ですが、Aを開いてAをクリックしたら閉じたいのですが、閉じれません。
たびたび申し訳ありません。どうぞよろしくお願いいたします。

No.3
- 回答日時:
う~~んわがままだなぁ~改造する気にはならんのかな
<html>
<body>
<ul id="a" style="display:none">
<li>A
<ul>
<li>A-1</li>
<li>A-2
<ul>
<li>A-2-1</li>
<li>A-2-2</li>
</ul>
</li>
</ul>
</li>
<li>b
<ul>
<li><a href="htp:?www.">world</a></li>?
<li>b-2</li>
</ul>
</li>
</ul>
<script>
window.onload=function(){ openTreeMenu('a');}
window.document.onclick=chkClick;
function openTreeMenu(id,text){
var obj=document.getElementById(id),objs=obj.getElementsByTagName('ul');
for(var i=0,m=objs.length;i<m;i++) objs[i].style.display='none';
if(!text)text=loadCookie('li');
if(text)
for(var i=0,m=objs.length,objs = obj.getElementsByTagName('li');i<m;i++)
if(getFirstText(objs[i])==text){
var t=objs[i];do{t=t.parentNode; if(t.nodeName=='UL') t.style.display='block';} while(t.nodeName!='BODY');
var t=objs[i].firstChild;while(t){if(t.nodeName=='UL') t.style.display='block';t=t.nextSibling;
}
}
obj.style.display='block';
}
function chkClick(e){var obj = e?e.target:event.srcElement;if(obj.tagName!='LI') return;var text=getFirstText(obj); saveCookie('li',text,10); openTreeMenu('a',text);}
function getFirstText(obj){var nd=obj.firstChild;while(nd.nodeName!='#text'){nd=nd.nextSibling; if(!nd) return false;}return nd.nodeValue;}
function saveCookie( vn, v, dy ){ if(navigator.cookieEnabled) document.cookie=vn+'='+escape(v)+ ';expires='+new Date((new Date()).getTime()+dy*86400000).toGMTString();}
function loadCookie(vn){ var r = '',o = document.cookie.split('; '); for (var i in o){ var c = o[i].split('='); if (c[0]==vn && c[1]!=''){ r = c[1]?unescape(c[1]):'';break; }} return r;}
</script>
</body>
</html>

No.2
- 回答日時:
やっぱりまた訂正があった。
38行目付近var text = loadCookie('li');
を
if(text==undefined) text = loadCookie('li');
に、
影響はないのですが・・・。
どうもありがとうございます!
ソースも<li>と<ul>を使っていて理想的です!
ただ、ちょっと試したところ、元の設置URLのように
自閉式ではないような気がします・・。
開き方、閉じ方は、設置URLのようにしたいのですが。
申し訳ありません。どうぞよろしくお願いいたします。

No.1
- 回答日時:
ちょっと興味があったので、自分的な考え方でやってみた
<ul>と<li>の入れ子構造に違いがあります。
<li>~</li>部分の最初のテキストノードをクッキーに保存してます
読み込んだときは、そのテキストを探し、親の方にULがあれば
展開するように、そしてその子ノードのULを開いています
たぶん3段でも4段でもいけるような気がしますが、微妙・・。
<html>
<body>
<ul id="a" style="display:none">
<li>A
<ul>
<li>A-1</li>
<li>A-2
<ul>
<li>A-2-1</li>
<li>A-2-2</li>
</ul>
</li>
</ul>
</li>
<li>b
<ul>
<li><a href="htp:www.">world</a></li>
<li>b-2</li>
</ul>
</li>
</ul>
<script>
window.onload=function(){ openTreeMenu('a');}
window.document.onclick=chkClick;
function chkClick(e){
var obj = e?e.target:event.srcElement;
if(obj.tagName!='LI') return;
saveCookie('li',getFirstText(obj),10);
var sobj = obj.firstChild;
while(sobj.nodeName!='UL'){ sobj=sobj.nextSibling; if(!sobj) return;}
sobj.style.display=(sobj.style.display=='none')?'block':'none';
}
function openTreeMenu(id,text){
var obj = document.getElementById(id), objs=obj.getElementsByTagName('ul');
for(var i=0,m=objs.length;i<m;i++) objs[i].style.display = 'none';
var text = loadCookie('li');
if(text){
var objs = obj.getElementsByTagName('li');
for(var i=0,m=objs.length;i<m;i++){
if(getFirstText(objs[i])==text){
var t=objs[i];
do{t=t.parentNode; if(t.nodeName=='UL') t.style.display='block';} while(t.nodeName!='BODY');
var t=objs[i].firstChild;
while(t){if(t.nodeName=='UL') t.style.display='block';t=t.nextSibling;}
}
}
}
obj.style.display='block';
}
function getFirstText(obj){
var nd=obj.firstChild;
while(nd.nodeName!='#text'){nd=nd.nextSibling; if(!nd) return false;}
return nd.nodeValue;
}
function saveCookie( vn, v, dy ){ if(navigator.cookieEnabled) document.cookie=vn+'='+escape(v)+ ';expires='+new Date((new Date()).getTime()+dy*86400000).toGMTString();}
function loadCookie(vn){ var r = '',o = document.cookie.split('; '); for (var i in o){ var c = o[i].split('='); if (c[0]==vn && c[1]!=''){ r = c[1]?unescape(c[1]):'';break; }} return r;}
</script>
</body>
</html>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Jqueryでリストのスクロール
-
クリックした<a>タグのみにClas...
-
プルダウンメニュー連動後の処...
-
jQueryでネスト構造の<li>がク...
-
pythonのDjangoでHTML内で変数...
-
クリックで表示、非表示するメ...
-
JavaScriptのfor文を使いclass...
-
ホームページビルダー17のフ...
-
tableやul,liで表示されたリス...
-
jQuery「jplayer」プレイリスト...
-
複数のラジオボタン項目でのテ...
-
onmouseoverの表示切り替えが上...
-
javascriptで、クリックしたら...
-
マウス追従スクリプトについて
-
画像でチェックボックスを表示...
-
1枚の画像をクリックすると複数...
-
表示する画像をファイル名を受...
-
Vb.net2005での画像の合成方法
-
FancyZoom (javascriptで画像拡...
-
MAX関数を使ってからLEFT JOIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jqueryのsortableで一部ソート...
-
タブ切り替えの初期表示について
-
クリックした<a>タグのみにClas...
-
【javascript で動的に a タグ...
-
JQueryタブのアクティブ アン...
-
jQueryのhide,showで中の要素が...
-
JS <a></a>タグ内のリンク先ア...
-
javascriptで教えてください。 ...
-
ネストされたチェックボックス...
-
div要素をランダムに表示させたい
-
jquery ドロップダウンメニュー...
-
同一ページ内で、任意の文字列...
-
onMouseoutの有効な範囲
-
macromediaのようなメニュー
-
mootoolsを使ったドロップダウ...
-
tableやul,liで表示されたリス...
-
jQueryのeqで最後からn番目以降...
-
javascript, getElementsByTagN...
-
jQuery タブメニューへのダイ...
-
【jQuery】遅延実行(タイムラ...
おすすめ情報