指定された引数IDからオブジェクトを取得します。
該当するものが無い場合は「0」を返します。
【id値からオブジェクト取得「kl_getelem()」<keynavi_ja.js】
//----------------------------
//kl_getelem(id)
//返り値:失敗時は「0」か「undefined」
//id:オブジェクトのID
//----------------------------
function kl_getelem(id){
if(!kl_isstr(id)) return id;
if(document.getElementById){ //IE5+,NS6+,Opera
if(document.getElementById(id)) return document.getElementById(id);
}else if(document.all){ //IE4+,Opera
if(document.all(id)) return document.all(id);
}else if(document.layers){ //Netscape4.x
return kl_getelem_ns4(id,document);
}
return 0;
}
//レイヤーが入れ子になっている場合は再帰的に検索 (Netscape4.x向け)
function kl_getelem_ns4(id,doc){
if(!doc.layers) return 0;
for(var i=0;i<doc.layers.length;i++){
if(doc.layers[i].id==id) return doc.layers[i];
if(doc.layers[i].document){
var t=kl_getelem_ns4(id,doc.layers[i].document);
if(t) return t;
}
}
return 0;
}
フィルター的に使えるよう idの代わりにオブジェクト自体が渡された場合は
そのままreturnしています。
注意点として、Netscape4.xの場合レイヤーが入れ子になっていると
「document.layers[id]」では動作しません。
【レイヤーが入れ子になっているケース】
<div id="id1" style="position:absolute;">
<div id="id2" style="position:absolute;">
..........
</div>
</div>
上のようなケースでは
「document.layers["id1"].document.layers["id2"]」などのように
アクセスする必要があります。
上のソース例にある関数「kl_getelem_ns4(id,doc)」は再帰的に呼び出され、
該当するidを持つレイヤーを返します。
【kl_getelem()を使ったサンプルHTML】
<script language="javascript" src="http://www.keynavi.net/files/keynavi_ja.js"></script>
.....
<a href="javascript:void(0)" onclick="alert(kl_getelem('link1'))">link1</a>
<a href="javascript:void(0)" onclick="alert(kl_getelem('lay1'))">layer1</a>
.....
id=link1としたリンク
レイヤー「lay1」です。
Netscape4.xではスタイルシートで「position:absolute/relative」を指定しないと
「document.layers[id];」が空になるので「0」が返されます。