動的にレイヤーを作成します。
予めHTML内にレイヤーの記述をしておかなくても
JavaScriptで任意個数のレイヤーを作成できます。
単なる表示以外にも色々な用途があります。
外部スクリプトを動的に読み込む
ではこの関数をJavaScriptの動的な読み込みに使っています。
また「visibility=hidden」(非表示=デフォルト)のままにしておけば
ページのキャッシュにも使えます。
【レイヤーを動的に作成「kl_layer_new()」<keynavi_tools.js】
----------------------------------------------------------------------------- kl_layer_new(arg) arg=new Array(変数名1,値1,変数名2,値2,...); (キーワード引数格納用配列、上のように変数名と値を並べて指定) ■以下、指定可能な変数 (html,url以外は略可) ・html:レイヤーに表示するHTML文字列 ・url:レイヤーに表示するページのURL (HTMLと両方指定の場合はURL優先) ・parent:作成するレイヤーの親オブジェクト (デフォルトはdocument.body) ・pos:位置をキーワードで指定:指定法はkl_layer_setpos(id,pos)を参考。 ・x/y/width/height/zindex:位置、サイズ、奥行きを数値で ・opacity:不透明度 (0〜100で指定、WinIE4+,NS6+,Mozillaで反映) ・fgcolor/bgcolor/bgimage:前景色、背景色、背景画像のパス ・visibility:可視性(visibility値) (デフォルトはhidden) ・iframe:iframeタグ内に指定したいオプションを「arg」と同じく配列で ・drag:レイヤーをドラッグ可能にする場合は真に (デフォルトは指定無し) ・raise:レイヤーをマウスクリックで手前に移動するには真に (デフォルトは指定無し) ・その他任意名:スタイルシートで「属性名:値」として指定されます ----------------------------------------------------------------------------- function kl_layer_new(arg){ var e=0; //以下は配列 arg=("url","http://foo/",...)から"http://foo/..."を取得 var url =kl_vget(arg,"url",kl_isstr,0); var html=kl_vget(arg,"html",kl_isstr,0); var par =kl_vget(arg,"parent",kl_isstr,0); //各ブラウザ毎に適切な関数を実行 if(KL_NS4) e=kl_layer_new_ns4(arg,url,html,par); else if(KL_IE55 || KL_NS6 || KL_OP6) e=kl_layer_new_ie55(arg,url,html,par); else if(document.all) e=kl_layer_new_ie4(arg,url,html,par); if(e){ //x,y値による位置指定が無ければ画面中央に表示します if(kl_undef(kl_vget(arg,"x")) && kl_undef(kl_vget(arg,"y"))) kl_layer_setpos(e,kl_vget(arg,"pos",0,"center")); return e; } return 0; }
上記関数は内部でブラウザ毎にSub関数を読んでいます。
【レイヤーを動的に作成「kl_layer_new_ie55()」<keynavi_tools.js】
//IE5.5+,Netscape6+,Opera7では下記のコードを使えます function kl_layer_new_ie55(arg,url,html,par){ var e=document.createElement(url ? "iframe" : "div"); if(KL_OP6 && !KL_OP7) return 0; e.setAttribute("id",kl_layer_new_id()); e.style.position ="absolute"; e.style.visibility="hidden"; if(url) kl_layer_new_modify_iframe(e,arg); var e0=(par ? par : document.body); e0.appendChild(e); kl_layer_new_modify(e,arg); if(url){ e.setAttribute("src",url); }else{ e.innerHTML=html; } return e; }
【レイヤーを動的に作成「kl_layer_new_ie4()」<keynavi_tools.js】
//IE全般では下記のコードを使えます function kl_layer_new_ie4(arg,url,html,par){ var id=kl_layer_new_id(); var o ="style='position:absolute; visibility:hidden;'"; var s; if(url){ o+=kl_layer_new_modify_iframe(id,arg,"ie4"); s="<iframe id='"+id+"' "+o+" src='"+url +"'></iframe>"; }else{ o+="border='0' cellpadding='0' cellspacing='0'"; s="<table id='"+id+"' "+o+"><tr><td>"+html+"</td></tr></table>"; } var e0=(par ? par : document.body); if(e0.insertAdjacentHTML){ e0.insertAdjacentHTML("BeforeEnd",s); var e=document.all(id); kl_layer_new_modify(e,arg); return e; } return 0; }
【レイヤーを動的に作成「kl_layer_new_ns4()」<keynavi_tools.js】
//Netscape4.x向けの関数です function kl_layer_new_ns4(arg,url,html,par){ var w=kl_vget(arg,"width",kl_isint,200); var h=kl_vget(arg,"height",kl_isint); //NS4ではレイヤー作成時に横幅を指定する必要があります var e=(par ? new Layer(w,par) : new Layer(w)); //レイヤーの各種オプションを設定します var t; t=kl_vget(arg,"x"); if(kl_isint(t)) e.left=t; t=kl_vget(arg,"y"); if(kl_isint(t)) e.top =t; t=kl_vget(arg,"zindex"); if(kl_isint(t)) e.zIndex =t; t=kl_vget(arg,"fgcolor"); if(kl_isstr(t)) e.fgColor=t; t=kl_vget(arg,"bgcolor"); if(kl_isstr(t)) e.bgColor=t; t=kl_vget(arg,"bgimage"); if(kl_isstr(t)) e.background.src=t; e.visibility=kl_vget(arg,"visibility",kl_isstr,"hidden"); if(kl_isint(h)) e.resizeTo(w,h); //レイヤーの中身を書き出します if(url) e.load(url,w); else{ e.document.open(); e.document.write(html); e.document.close(); } return e; }
上記関数により指定したHTML文字列、ページを表示するレイヤーを作成できます。
引数:arg
レイヤーに指定できるオプションは中身(html,url)や以外にも
位置・大きさ・背景・枠属性・余白などなど多岐にのぼります。
そのため普通に引数リストを並べた「f(a,b,c,d,e)」という書き方は
呼出側で引数の対応が分かりにくくなります。
そこで配列「arg」を用い属性名と値をセットで並べて指定します。
こうすると任意個の引き数を任意順で指定できます。
arg = new Array("html","レイヤーの中身","pos","center","border","outset 1px",...)
iframe用オプション:"iframe"
Netscape4.x以外ではURL指定時に「iframe」を使っています。
このオプションに指定したい内容を列挙して下さい。
iframeのオプションには
「name/ frameborder / scrolling / marginwidth / marginheight」
があります。
指定の方法は前項と同じです。
arg = new Array("url","表示するURL",..,"iframe",new Array("name","MyWin",...));
注意点:ID値
Netscape4.xでレイヤーを作成する時は「new Layer()」を使います。
このとき IDを指定できません。
ブラウザ起動後、順番に「_js_layer_番号」などと自動でIDが割当てられます。
【レイヤーのIDを「_ja_layer_番号」形式で作成<keynavi_tools.js】
KL_LAYER_NEW_CNT=0; function kl_layer_new_id(){ return "_js_layer_"+(KL_LAYER_NEW_CNT++); }
これに習って ID指定がない場合、IEやNetscape6+,Operaでは
Netscape4.xにあわせたIDを割当てています。
ブラウザ互換性を重視する場合は レイヤーを処理するのに
ID値ではなくレイヤーオブジェクト自体を操作するようにします。
KeyNaviの各種レイヤー向け関数はID値入力に加えてレイヤーObjectをそのまま
渡すことができます。
さて 上記の関数を使ってみましょう。
【レイヤーの動的な作成サンプルHTML】
<script language="javascript" src="http://www.keynavi.net/files/keynavi_ja.js "></script> <script language="javascript" src="http://www.keynavi.net/files/keynavi_tools.js "></script> <script language="javascript"><!-- function sayHello(){ var arg=new Array( "html", "Hello world!", "bgcolor", "cyan", "border", "outset 1px", "padding", "50px", "opacity", 60, "zindex", 5, "visibility","visible", "drag", true, "raise", true ); var e=kl_layer_new(arg) } //--> </script> <a href="javascript:void(0)" onclick="sayHello();">Please Click Me!</a>
Netscape4.xではテキストエリアと重なる部分はレイヤーが表示されないので注意
して下さい。
一部が隠れてしまったら 表示している部分をドラッグしてみて下さい。
NS4では通常のHTML内にレイヤーを記述した場合でもフォームと重なる部分が
表示されません。zIndexを上げてもダメです。
作成されるレイヤーはデフォルトで画面中央になります。
NS4では真ん中にtextareaがこないようにスクロールしてから
実行ボタンを押しましょう。
またpadding、border指定は動作しません。そのためボックスは中身の文字に合わせて
小さくなります。
NS4でpaddingをつけたい場合は中身のHTMLでpaddingをつけたHTMLを書きます。
<div style="padding:50px; border:none;">...</div>
また
半透明レイヤー:kl_tlayer_new()
では2つのレイヤーを重ねてNS4でもpaddingがつくようにしています。
一般的にはこちらの利用をお勧めします。
不透明度を表すopacity指定で半透明にできますが 背景だけではなく文字も半透明に
なるので読みにくくなります。
半透明レイヤー:kl_tlayer_new()
では2つのレイヤーを重ねて綺麗に表示させています。
「drag」「raise」オプションが設定されているので
生成したレイヤーをドラッグできます。
上記実行ボタンを何度か押して 複数のレイヤーを作り
各レイヤークリックしたりドラッグしてみて下さい。
さて、このレイヤーの表示内容を変更してみます。「kl_layer_write()」を使います。
Netscape4.xでは動的な書き込みが不安定なため
3つ目の引数が真の場合にのみ実行するようにしています。
有効にしたい場合は 実際にNetscapeで動作を確認するのをお勧めします。
次はURLを指定して他のページを表示させて見ます。
function sayHello2(){
var arg=new Array(
"url", "../../",
"width", 300,
"height", 200,
"border", "outset 1px",
"zindex", 5,
"visibility","visible",
"iframe", new Array("name","mywin")
);
var e=kl_layer_new(arg)
self["e2"]=e;
}
sayHello2();
KeyNaviのトップページが表示されます
次はこのURLを変更します。「kl_layer_load()」を使います。
今度はホームが表示されます。
ここでも Netscape4.xでは動的な書き込みが不安定なため
3つ目の引数が真の場合にのみ実行します。
これらは通常のレイヤーであるため
移動や可視性の変更など自由に出来ます。
表示エリア内の各位置に移動してみましょう。
次はページ全体の右上に表示します。
今度は左下。