JavaScript Market - 動きのあるホームページを作る為の各種JavaScript のサンプルと小技集を公開中

JavaScript

JavaScriptって…? | JavaScript応用のツボ | ブラウザについて | JavaScript Market 利用規程 | JavaScript 各種サンプル | JavaScript 小技集

ツリー式メニュー

■ 2002,03,29 ターゲットウィンドウの設定を追加

階層の深さによって段落を付け、罫線も表示します。
フォルダ画像は、Macintoshで見た場合とその他(Windows等)で見た場合で別の画像を表示します。
※ ちなみにCGIでサイトの構成を全て検出してツリーを自動生成するスクリプトがココにあります。

■ ソース(Netscape4~を無視すればこんなに複雑にする必要は無いのですが…)
<html>
<head>
<style>
body { font-size:10pt; }
</style>
<script>

/* 最上位の文字列 */
title = "ホーム";

/* 左余白 */
l_mgn = 0;

/* 改行幅 */
offset_height = 16;

/* ターゲットウィンドウ */
tgt = "_blank";

/* ツリーに表示する項目
   list[x] = "1,2,3";
     1.所属する親フォルダの番号 [x](最初から表示しておく項目は空白に)
     2.表示する名前
     3.リンク先 (空白の場合はフォルダとして扱う)
   上の階層から順番に記述すること(記述する順番も重要)
*/

list = new Array();
list[0] =  ",親リスト1";
list[1] =  "0,親リスト1-1";
list[2] =  "1,親リスト1-1-1";
list[3] =  "2,link:1-1-1-1,1-1-1-1.html";
list[4] =  "2,link:1-1-1-2,1-1-1-2.html";
list[5] =  "2,link:1-1-1-3,1-1-1-3.html";
list[6] =  "1,link:1-1-1,1-1-1.html";
list[7] =  "1,link:1-1-2,1-1-2.html";
list[8] =  "1,link:1-1-3,1-1-3.html";
list[9] =  "0,親リスト1-2";
list[10] = "9,link:1-2-1,1-2-1.html";
list[11] = "9,link:1-2-2,1-2-2.html";
list[12] = "9,link:1-2-3,1-2-3.html";
list[13] = ",親リスト2";
list[14] = "13,親リスト2-1"
list[15] = "14,link:2-1-1,2-1-1.html";
list[16] = "14,link:2-1-2,2-1-2.html";
list[17] = "14,link:2-1-2,2-1-3.html";
list[18] = "13,親リスト2-2"
list[19] = "18,link:2-2-1,2-2-1.html";
list[20] = "18,link:2-2-2,2-2-2.html";
list[21] = "18,link:2-2-3,2-2-3.html";

/* イメージ設置ディレクトリ */
dir = "./";

/* Icon for Win */
home_win = dir + "home_win.gif";
close_win = dir + "close_win.gif"
open_win = dir + "open_win.gif";
list_win = dir + "list_win.gif";

/* Icon for Mac */
home_mac = dir + "home_mac.gif";
close_mac = dir + "close_mac.gif"
open_mac = dir + "open_mac.gif";
list_mac = dir + "list_mac.gif";

/* イメージ属性 */
img_parm = "width=16 height=16 align=absmiddle";

if (navigator.userAgent.match(/mac/i)) {
   ico_home = home_mac;
   ico_close = close_mac;
   ico_open = open_mac;
   ico_list = list_mac
}
else {
   ico_home = home_win;
   ico_close = close_win;
   ico_open = open_win;
   ico_list = list_win
}

img_close = new Image();
img_close.src = ico_close;
img_open = new Image();
img_open.src = ico_open;

N4 = IE = N6 = 0;
if (document.layers) N4 = 1;
else if (document.all) IE = 1;
else if (document.getElementById) N6 = 1;

def = new Array('');
cmv = new Array();
for (i in list) {
   d = list[i].split(",");
   if (d[0] == '') def = def.concat(i);
   if (! d[2]) cmv[i] = new Array();
}

function line_print(p) {
   return "<img src='" + dir + "line" + p + ".gif'" + img_parm + ">";
}

function lay_print(p,val,link) {
   if (val == title) {
      bd = "";
      val = "<img src='" + ico_home + "' " + img_parm + "> " + val;
   }
   else if (link) {
      val = "<img src='" + ico_list + "' " + img_parm + "> "
          + "<a href='" + link + "' target='" + tgt + "'>" + val + "</a>";
   }
   else if (N4) {
      val = "<img name=pos" + p + " src='" + ico_close + "' " + img_parm + "> " + val;
   }
   else {
      val = "<span onClick='menu_open(" + p + ")'><img name=pos" + p
          + " src='" + ico_close + "'" + img_parm + "> " + val + "</span>";
   }
   if (N4) lay = "<layer name=menu" + p + " left=" + l_mgn
       + " visibility=hidden> " + bd + val + "</layer><br>";
   else lay = "<div id=menu" + p + " style='position:absolute; left:" + l_mgn
       + "px; top:0px; visibility:hidden;'> " + bd + val + "</div>";
   return lay;
}

menu_list = "<tt><nobr>" + lay_print('',title);

function menu_print () {
   for (i in list) {
      bd = "";
      pl = list[i].split(",");
      lx = new Array(pl[0]);
      if (pl[0] == '') {
         if (i == def[def.length-1]) bd += line_print(3);
         else bd += line_print(1);
      }
      else {
         x = pl[0];
         while (x != '') {
            x = list[x].split(",");
            x = x[0];
            if (x != '') lx = lx.concat(x);
         }
         lx = lx.reverse();
         
         for (ii in lx) {
            x = list[lx[ii]].split(",");
            x = x[0];
            if (x == '' && lx[ii] != def[def.length-1]) bd += line_print(2);
            else if (x == '' || lx[ii] == cmv[x][cmv[x].length-1])
               bd += line_print(0);
            else bd += line_print(2);
         }
         x = pl[0];
         if (i == cmv[x][cmv[x].length-1]) bd += line_print(3);
         else bd += line_print(1);
      }
      if (! pl[2]) {
         for (ii in list) {
            t = list[ii].split(",");
            if (eval(t[0]) == i) cmv[i] = cmv[i].concat(ii);
         }
      }
      menu_list += lay_print(i,pl[1],pl[2]);
   }

   menu_list += "</nobr></tt>";
   document.write(menu_list);

   if (N4) { defY = offY = document.layers["menu0"].pageY; vis = "show"; }
   else { defY = offY = offset_height; vis = "visible"; }

   for (i in def) {
      if (N4) doc = document.layers["menu" + def[i]];
      if (IE) doc = document.all("menu" + def[i]).style;
      if (N6) doc = document.getElementById("menu" + def[i]).style;
      with (doc) {
         visibility = vis;
         top = offY;
      }
      offY += offset_height;
   }
}

function menu_open(p) {
   if (N4) {
      p = eval(this.name.replace("menu",""));
      doc = document.layers["menu" + p];
      dis = doc.document.images["pos" + p];
      offY = doc.pageY;
   }
   else dis = document.images["pos" + p];
   if (IE) {
      doc = document.all("menu" + p);
      offY = doc.style.posTop;
   }
   if (N6) {
      doc = document.getElementById("menu" + p);
      offY = parseInt(doc.style.top);
   }
   if (dis.src.indexOf(img_close.src) > -1) {
      dis.src = img_open.src;
      for (i in cmv[p]) {
         offY += offset_height;
         if (N4) doc = document.layers["menu" + cmv[p][i]];
         if (IE) doc = document.all("menu" + cmv[p][i]).style;
         if (N6) doc = document.getElementById("menu" + cmv[p][i]).style;
         with (doc) {
            visibility = vis;
            top = offY;
         }
      }
   }
   else {
      end = cmv[p];
      limit = 0;
      dis.src = img_close.src;
      for (i in cmv[p]) if (cmv[cmv[p][i]]) end = end.concat(cmv[cmv[p][i]]);
      if (cmv[end[end.length-1]]) end = end.concat(cmv[end[end.length-1]]);
      for (i = 0; i < end.length; i++) limit = Math.max(limit,end[i]);
      for (i = p+1; i <= limit; i++) {
         if (N4) {
            doc = document.layers["menu" + i];
            dis = doc.document.images["pos" + i];
         }
         else dis = document.images["pos" + i];
         if (IE) doc = document.all("menu" + i).style;
         if (N6) doc = document.getElementById("menu" + i).style;
         if (dis) dis.src = img_close.src;
         with(doc) { visibility = "hidden"; top = 0; }
      }
   }

   for (i = eval(cmv[p][cmv[p].length-1]) + 1; i < list.length; i++) {
      if (N4) doc = document.layers["menu" + i];
      if (IE) doc = document.all("menu" + i).style;
      if (N6) doc = document.getElementById("menu" + i).style;
      if (doc.visibility == vis) {
         offY += offset_height;
         doc.top = offY;
      }
   }
}

function init() {
   for (i in list) {
      t = list[i].split(",");
      if (! t[2]) {
         doc = document.layers["menu" + i];
         doc.captureEvents(Event.MOUSEDOWN);
         doc.onmousedown = menu_open;
      }
   }
}

if (document.layers) window.onload = init;

// Copyright (C) 2002-2002 suepon , All rights reserved.
// Script found at http://suepon.com/
</script>
</head>
<body>
<script>
menu_print();
</script>
</body>
</html>


suepon.com | CGI作成・CGI制作 | ドメイン検索 | バナー自動作成 | Google Dance jp | 松浦亜弥 (H.P.memo) | パソコン | ネイル