ここでは、CrossBrowser用スクリプトを作成する上で、 基本的な情報の取得や設定を行うためのワンライナ的なスクリプト ( 要は数行の関数 )を紹介します
◆ ここで挙げている関数群は全て Windows98版 IE6, NN4, Mozilla で動作確認していますが、
その他のバージョンおよびプラットフォームでは確認していません
# 但し、Opera(Win, Linux), Safari(Mac), Konqueror(Linux) の最新版でも
# ほとんどの機能は動作するようにしてあるつもりです
もし、動作上の問題あるいは記述ミスなどを発見された方は、
ご面倒でもご連絡下さると喜びますf(^^;
■使用上の注意事項
本ライブラリではライブラリ および ブラウザを識別するために、 いくつかの共通的な変数を使用しています
// version of library LCB_version = 3.1; // _mac : true = macintosh, false = other os _mac =navigator.userAgent.toLowerCase().indexOf('mac')!=-1; // _ie512 : true = MSIE 5.12(mac), false = others _ie512 =navigator.userAgent.toLowerCase().indexOf('msie 5.12')!=-1; // _kon : true = konqueror, false = others _kon =navigator.userAgent.toLowerCase().indexOf('konqueror')!=-1; // _safari : true = safari, false = others _safari=navigator.userAgent.toLowerCase().indexOf('safari')!=-1; // _dom : kind of DOM. // IE4 = 1, IE5+ = 2, NN4 = 3, NN6+ = 4, others = 0 _dom = document.all?(document.getElementById?2:1): (document.getElementById?4: (document.layers?3:0)); _createLayerNo = 0; // layer no.
◆ これらの変数は、関数を使用する前に設定されていなければなりません
JavaScriptの言語仕様上、アンダースコア("_
")で始まる変数名は禁止されていますが、
変数名があまりに安易なためスクリプトで記述する変数名と重複しないように
ライブラリ集で使用する変数名にはあえてアンダースコアを使用しています
◆ _kon, _safari 変数は、
それぞれ Konqueror, Safari ブラウザ特有の処理をする場合に必要に応じて使用します
因みに、_kon 変数はこのスクリプト上では使用していません
このライブラリ集で扱っている関数は IE でも NN でも同じ呼出形式で使用できるよう、
各関数内でブラウザの種別などの判別を行っています
また、古いバージョンのブラウザでも最低限エラーが発生しないように
JavaScript の文法上新しい記法は使用していません
しかし、このような手法は時としてステップ数が多くなり、
実行スピードも上がらない等のデメリットも考えられ、決してオールマイティな構造ではありません
また、クロスブラウザとしての処理の実装方法も色々な手法があります
ですから、ここで挙げている関数群はこのままでも使用できますが、
あくまでもサンプルとして捉え、
必要に応じて改変・再実装などをして適した形に修正してご使用下さい
■ウィンドウ関連
ウィンドウの幅( pixel数 )を取得します
★呼出形式 <pixel> = getWindowWidth();
function getWindowWidth (){ if(_dom==4 || _dom==3) return window.innerWidth; if(_dom==2 || _dom==1) return document.body.clientWidth; return 0; }
◆ フレームの親のウィンドウ幅はこの関数では取得できません
フレームの親のウィンドウ幅は document.body.clientWidth の代わりに
document.body.offsetWidth を使用してください
◆ ウィンドウがフレーム構成の場合、 Konquerorでは onLoadイベント中にこの関数を呼び出すと実際のサイズとは異なる値になります
ウィンドウの高さ( pixel数 )を取得します
★呼出形式 <pixel> = getWindowHeight();
function getWindowHeight(){ if(_dom==4 || _dom==3) return window.innerHeight; if(_dom==2 || _dom==1) return document.body.clientHeight; return 0; }
◆ フレームの親のウィンドウ高さはこの関数では取得できません
◆ ウィンドウがフレーム構成の場合、 Konquerorでは onLoadイベント中にこの関数を呼び出すと実際のサイズとは異なる値になります
表示するドキュメントがウィンドウ幅より大きい場合、 ドキュメントがどこから表示されているかを ドキュメント上のX座標( ウィンドウの左上コーナ部分の表示位置 )で取得します
★呼出形式 <pixel> = getWinXOffset();
function getWinXOffset(){ if(_dom==4) return window.scrollX; if(_dom==2 || _dom==1) return document.body.scrollLeft; if(_dom==3) return window.pageXOffset; return 0; }
表示するドキュメントがウィンドウ高さより大きい場合、 ドキュメントがどこから表示されているかを ドキュメント上のY座標( ウィンドウの左上コーナ部分の表示位置 )で取得します
★呼出形式 <pixel> = getWinYOffset();
function getWinYOffset(){ if(_dom==4) return window.scrollY; if(_dom==2 || _dom==1) return document.body.scrollTop; if(_dom==3) return window.pageYOffset; return 0; }
■オブジェクトのハンドリング
名称を指定して対応するレイアオブジェクトを取得します
★呼出形式 <object> = getDivFromName(nm[,parentDivName...]); <object> : レイアオブジェクト nm : レイアの名称 parentDivName : 親のレイア名
function getDivFromName(nm){ if(_dom==4 || _dom==2) return document.getElementById(nm); if(_dom==1) return document.all(nm); if(_dom==3){ var s=''; for(var i=1; i<arguments.length; i++) s+='document.layers.'+arguments[i]+'.'; return eval(s+'document.layers.'+nm); } return null; }
使い方は、レイアが次のように記述されている場合
<div id="layer1" style="position:absolute"> <div id="layer2" style="position:absolute"> <div id="layer3" style="position:absolute"> </div> </div> </div>
◆ idで指定する名称は、そのドキュメント上でユニーク(固有)でなければなりません
layer1, layer2, layer3 はそれぞれ次のよう記述します
var layer1 = getDivFromName('layer1'); var layer2 = getDivFromName('layer2','layer1'); var layer3 = getDivFromName('layer3','layer1','layer2');
指定されたレイアオブジェクトの名称を取得します
★呼出形式 <nm> = getDivName(div) <nm> : 名称 div : レイアオブジェクト
function getDivName(div){ if(_dom==4 || _dom==2 || _dom==1) return div.id; if(_dom==3) return div.name; return ''; }
position:absolute; なレイアを生成します
★呼出形式 <object> = createLayer(left, top, width, height [, parentLayer[, html ...]]) <object> : レイアオブジェクト left : レイアの左上コーナのX座標( pixel ) top : レイアの左上コーナのY座標( pixel ) width : レイアの幅( pixel ) 0 を指定すると IE では 1 を設定する height : レイアの高さ( pixel ) 0 を指定すると height を設定しない parentLayer : 生成するレイアの親のオブジェクト または null( 省略可 ) html : 生成時に書き出す HTML( 省略可 )
function createLayer(left,top,width,height,parentDiv){
var s='';
if(arguments.length>5){
for(var i=5; i<arguments.length; i++) s+=arguments[i];
}
// ホントは createElement あたりでチェックしたいが IE4.0 から実装 (T_T;
if(document.createAttribute){
var divName= '_js_layer_'+_createLayerNo; _createLayerNo++;
var pDiv =parentDiv?parentDiv:document.body;
var div =document.createElement('DIV');
div.id=divName;
// IE の setAttribute 関数は腐っているのでしょーがなく...
div.style.position='absolute';
div.style.left=left;
div.style.top =top;
if(width >0) div.style.width =width +'px';
if(height>0) div.style.height=height+'px';
div.style.visibility='hidden';
if(_mac && pDiv.insertAdjacentHTML){
// Mac版 IE5.2 用描画バグ対策
pDiv.appendChild(div); div.innerHTML=s;
}
else {
div.innerHTML=s; pDiv.appendChild(div);
}
return div;
}
if(_dom==2 || _dom==1){
var adj =(_mac&&!_ie512)?' ':'';
var divName= '_js_layer_'+_createLayerNo; _createLayerNo++;
var ha =(height>0)?(';height:'+height):'';
var pDiv =parentDiv?parentDiv:document.body;
var html = '<div id="'+divName+'" style="position:absolute;'
+ 'left:'+left+';top:'+top
+ (width >0?(';width:' +width +'px'):';width:1')
+ (height>0?(';height:'+height+'px'):'')
+ ';visibility:hidden;">'+s+'<'+'/div>'+adj;
if(pDiv.insertAdjacentHTML) pDiv.insertAdjacentHTML('BeforeEnd',html);
else pDiv.innerHTML+=html;
return document.all(divName);
}
if(_dom==3){
var div=parentDiv?(new Layer(width,parentDiv)):(new Layer(width));
if(height>0) div.resizeTo(width,height);
div.moveTo(left,top);
if(s!=''){
div.document.open('text/html','replace');
div.document.write(s);
div.document.close();
}
return div;
}
return null;
}
◆ この関数は onLoadイベント以降で使用できます
また、生成時は visibility が hidden に設定されています
◆ 一応 Mac版IE 5.1 でも動作するように無理やりしていますが、
この反作用としてレイアの高さが1行余分になります
また、IE5.22 では appendChild後に HTMLを設定しているために
負荷が多少上がると思われます
◆ DOMの判定の一部に createAttribute 関数の有無を使用しているのは
最近のW3C DOMをサポートする IE互換のブラウザは document.all
をサポートしていますが、insertAdjacentHTML をサポートしていないための
苦肉の策です f(^^;
使い方は、100×200pixel のレイアを( 10,50 )の位置に document直下に生成するだけなら、 以下のように記述します
var div = createLayer(10,50, 100,200);
もし、レイアオブジェクト "layer1" 内に 100×200pixel のレイアを( 5,10 )の位置に生成するなら
var div = createLayer(5,10, 100,200, layer1);
また、"<p>Hello!</p>" を内部に持つ、 幅100pixelのレイアを documentの( 10,20 )に生成するなら
var div = createLayer(10,20, 100,0, null, '<p>Hello!<¥/p>');
とします
また、出力 HTML はカンマ "," で繋げて複数指定できます
外部ファイルを内容に持つ position:absolute; なレイアを生成します
★呼出形式 <object> = createExLayer(url, left, top, width, height [, parentLayer]) <object> : レイアオブジェクト url : 内部に表示する HTML を示す URL left : レイアの左上コーナのX座標( pixel ) top : レイアの左上コーナのY座標( pixel ) width : レイアの幅( pixel ) height : レイアの高さ( pixel ) parentLayer : 生成するレイアの親のオブジェクト ( 省略可 )
function createExLayer(url,left,top,width,height,parentDiv){ if(_dom==4){ var divName= '_js_layer_'+_createLayerNo; _createLayerNo++; var pDiv =parentDiv?parentDiv:document.body; var div =document.createElement('IFRAME'); div.id=divName; div.name=divName; div.setAttribute('style', 'position:absolute;left:'+left+';top:'+top +';width:'+width+(height>0?(';height:'+height):'') +';visibility:hidden'); div.setAttribute('src',url); div.setAttribute('frameborder',0); div.setAttribute('scrolling','no'); pDiv.appendChild(div); return div; } if(_dom==2 || _dom==1){ var adj=(_mac&&_ie512)?' ':''; var bd, divName='_js_layer_'+_createLayerNo; _createLayerNo++; var ha=(height>0)?(';height:'+height):''; if(arguments.length>5 && parentDiv) bd=parentDiv; else bd=document.body; var html = '<div id="'+divName+'" style="position:absolute;' + 'left:'+left+';top:'+top + ';width:'+width+ha+';visibility:hidden;">' + '<iframe src="'+url+'" name="'+divName+'_if" ' + 'width='+width+' height='+height + 'marginwidth=0 margineheight=0 ' + 'scrolling="no" frameborder="no">' + '<'+'/iframe>' + '<'+'/div>'+adj; if(bd.insertAdjacentHTML) bd.insertAdjacentHTML('BeforeEnd', html); else bd.innerHTML+=html; return document.all(divName); } if(_dom==3){ var div=parentDiv?(new Layer(width,parentDiv)): (new Layer(width)); if(height>0) div.resizeTo(width,height); div.moveTo(left,top); div.load(url,width); return div; } return null; }
◆ この関数は onLoadイベント以降で使用できます
また、生成時は visibility が hidden に設定されています
◆ 一応 Mac版IE でも動作するように無理やりしていますが、 この反作用としてレイアの高さが1行余分になります
使い方は、同じディレクトリにある Hello.htm を内部に表示する、サイズが 200×100pixel のレイアを ( 10,50 )の位置に生成するには以下のように記述します
var div = createExLayer('Hello.htm', 10,50, 200,100);
レイア内に HTML として記述されている Imageオブジェクトを取得します
★呼出形式 <object> = getDivImage(div,imgName); <object> : Imageオブジェクト div : レイアオブジェクト imgName : IMGタグの名称
function getDivImage(div,imgName){ if(_dom==4) return document.images[imgName]; if(_dom==2 || _dom==1) return document.images(imgName); if(_dom==3) return div.document.images[imgName]; return null; }
◆ この関数で指定する画像には ID属性 と NAME属性が共に同じ名称で 設定されていなければなりません
レイア内に HTML として記述されている Form要素を取得します
★呼出形式 <object> = getDivForm(div,frmName); <object> : Formのオブジェクト div : レイアオブジェクト frmName : Formの名称
function getDivForm(div,frmName){ if(_dom==4) return document.forms[frmName]; if(_dom==2 || _dom==1) return document.forms(frmName); if(_dom==3) return div.document.forms[frmName]; return null; }
◆ この関数で指定するFormには ID属性 と NAME属性が共に同じ名称で 設定されていなければなりません
■レイアの位置制御
指定されたレイアの位置情報を設定します
★呼出形式 initDivPos(div) div : 位置情報を初期化するレイアオブジェクト
function initDivPos(div){ if(_dom==4){ div.style.left=div.offsetLeft+'px'; div.style.top =div.offsetTop +'px'; } else if(_dom==2 || _dom==1){ div.style.pixelLeft=div.offsetLeft; div.style.pixelTop =div.offsetTop; } return div; }
◆ この関数は position:absolute; で、margin,border,padding 属性が 0 のレイアを対象とします
この関数はレイアの位置制御を行うとき、
レイアの位置情報が正確でない場合に最初に1回だけ呼び出して位置情報を設定します
ここで、位置情報が不定の場合とは以下の場合を言います
・インラインスタイルで left, top を指定しないでDIVタグを使用した場合
また、Mac版IE5 では body の margin 属性を "0" に設定しないと正しく動作しません
指定されたレイアの位置を取得します
★呼出形式 <left> = getDivLeft(div) // X座標の取得 <top> = getDivTop (div) // Y座標の取得 <left> : レイアのX座標( pixel ) <top> : レイアのY座標( pixel ) div : レイアオブジェクト
function getDivLeft(div){ if(_dom==4 || _dom==2) return div.offsetLeft; if(_dom==1) return div.style.pixelLeft; if(_dom==3) return div.left; return 0; } function getDivTop(div){ if(_dom==4 || _dom==2) return div.offsetTop; if(_dom==1) return div.style.pixelTop; if(_dom==3) return div.top; return 0; }
◆ この関数は position:absolute; なレイアを対象とします
div で指定するレイアの位置情報が不正確と思われる場合は、
あらかじめ initDivPos を呼び出してください
◆ Konqueror 3( _dom == 2) では style に設定した位置やサイズは すぐには offset*** に反映されません( 使用する場合変更が必要です )
指定されたレイアの位置を変更します
★呼出形式 moveDivTo( div, left, top) // 絶対座標での移動 moveDivBy( div, dx, dy) // 相対座標での移動 div : レイアオブジェクト left : レイアのX座標( pixel : 絶対座標 ) top : レイアのY座標( pixel : 絶対座標 ) dx : レイアのX方向の移動量( pixel ) dy : レイアのY方向の移動量( pixel )
function moveDivTo(div,left,top){ if(_dom==4){ div.style.left=left+'px'; div.style.top =top +'px'; return; } if(_dom==2 || _dom==1){ div.style.pixelLeft=left; div.style.pixelTop =top; return; } if(_dom==3){ div.moveTo(left,top); return; } } function moveDivBy(div,left,top){ if(_dom==4){ div.style.left=div.offsetLeft+left; div.style.top =div.offsetTop +top; return; } if(_dom==2){ div.style.pixelLeft=div.offsetLeft+left; div.style.pixelTop =div.offsetTop +top; return; } if(_dom==1){ div.style.pixelLeft+=left; div.style.pixelTop +=top; return; } if(_dom==3){ div.moveBy(left,top); return; } }
◆ この関数は position:absolute; なレイアを対象とします
div で指定するレイアの位置情報が不正確と思われる場合は、
あらかじめ initDivPos を呼び出してください
また、left,top には整数を指定します
実数を指定した場合には繰り返し呼び出すとIE では累積誤差が生じます
createExLayer関数で生成したレイアに表示している ドキュメントのスクロール位置を変更します
★呼出形式 scrollExlHItTo(exdiv, x) // 水平方向のスクロール scrollExlVItTo(exdiv, y) // 垂直方向のスクロール exdiv : 外部参照のレイアオブジェクト x,y : スクロール位置( pixel )
function scrollExlHItTo(exdiv,x){ if(_dom==4){ frames[exdiv.id].scrollTo(x,frames[exdiv.id].scrollY); return; } if(_dom==2 || _dom==1){ frames(exdiv.id+'_if').scrollTo( x,frames[exdiv.id+'_if'].document.body.scrollTop); return; } if(_dom==3){ var dx=x-exdiv.clip.left, ch=exdiv.clip.width; exdiv.left-=dx; exdiv.clip.left=x; exdiv.clip.width=ch; return; } return; } function scrollExlVItTo(exdiv,y){ if(_dom==4){ frames[exdiv.id].scrollTo(frames[exdiv.id].scrollX,y); return; } if(_dom==2 || _dom==1){ frames[exdiv.id+'_if'].scrollTo( frames[exdiv.id+'_if'].document.body.scrollLeft,y); return; } if(_dom==3){ var dy=y-exdiv.clip.top, ch=exdiv.clip.height; exdiv.top-=dy; exdiv.clip.top=y; exdiv.clip.height=ch; return; } return; }
◆ この関数は createExLayer関数で生成したレイアオブジェクトのみを対象とします
■レイアのサイズ制御
指定されたレイアのサイズ情報を設定します
★呼出形式 initDivSize(div) div : サイズ情報を初期化するレイアオブジェクト
function initDivSize(div){ if(_dom==4){ div.style.width =div.offsetWidth +'px'; div.style.height=div.offsetHeight+'px'; } else if(_dom==2 || _dom==1){ div.style.pixelWidth =div.offsetWidth; div.style.pixelHeight=div.offsetHeight; } return div; }
◆ この関数は absolute なレイアを対象とします
この関数はレイアのサイズ制御を行うとき、
レイアのサイズ情報が正確でない場合に最初に呼び出してサイズ情報を設定します
ここで、サイズ情報が不定の場合とは以下の場合を言います
・インラインスタイルで width, height を指定しないでDIVタグを使用した場合
・width, height は指定しているが、ブラウザによりサイズが調整される場合
◆ W3C の仕様では現在のサイズを取得するのに
getComputedStyle を使用することになっていますが、
このスクリプトでは offsetWidth/offsetHeight を使用しています
W3C DOM の仕様に合わせたスクリプトにするには以下のようにします
if(_dom==4){
var style=document.defaultView.getComputedStyle(div,null);
div.style.width =style.getPropertyValue('width' );
div.style.height=style.getPropertyValue('height');
}
また、getComputedStyle は、該当するプロパティが全く指定されない場合、
'auto' となりますので注意してください
指定されたレイアのサイズを取得します
★呼出形式 <width> = getDivWidth (div) <height> = getDivHeight(div) <width> : レイアの幅( pixel ) <height> : レイアの高さ( pixel ) div : サイズを取得するレイアオブジェクト
function getDivWidth (div){ if(_dom==4 || _dom==2) return div.offsetWidth; if(_dom==1) return div.style.pixelWidth; if(_dom==3) return div.clip.width; return 0; } function getDivHeight(div){ if(_dom==4 || _dom==2) return div.offsetHeight; if(_dom==1) return div.style.pixelHeight; if(_dom==3) return div.clip.height; return 0; }
◆ この関数は position:absolute; なレイアを対象とします
div で指定するレイアのサイズ情報が不正確と思われる場合は、
あらかじめ initDivSize を呼び出してください
◆ Konqueror 3( _dom == 2) では style に設定した位置やサイズは すぐには offset*** に反映されません( 使用する場合変更が必要です )
指定されたレイアのサイズを変更します
★呼出形式 resizeDivTo(div, width, height) // 絶対サイズ resizeDivBy(div, dw, dh ) // 相対サイズ div : サイズを変更するレイアオブジェクト width : レイアの幅 ( pixel ) height : レイアの高さ ( pixel ) dw : X方向の変更量( pixel ) dh : Y方向の変更量( pixel )
function resizeDivTo(div,width,height){ if(_dom==4){ div.style.width =width +'px'; div.style.height=height+'px'; return; } if(_dom==2 || _dom==1){ div.style.pixelWidth =width; div.style.pixelHeight=height; return; } if(_dom==3){ div.resizeTo(width,height); return; } } function resizeDivBy(div,width,height){ if(_dom==4){ div.style.width =(div.offsetWidth +width )+'px'; div.style.height=(div.offsetHeight+height)+'px'; return; } if(_dom==2){ div.style.pixelWidth =div.offsetWidth +width; div.style.pixelHeight=div.offsetHeight+height; return; } if(_dom==1){ div.style.pixelWidth +=width; div.style.pixelHeight+=height; return; } if(_dom==3){ div.resizeBy(width,height); return; } }
◆ この関数は position:absolute; なレイアを対象とします
div で指定するレイアのサイズ情報が不正確と思われる場合は、
あらかじめ initDivSize を呼び出してください
外部参照レイアのサイズを取得します
★呼出形式 <width> = getExlWidth(exdiv) <height> = getExlHeight(exdiv)
function getExlWidth (exdiv){
if(_dom==4)
// NN6 is buggy( same exdiv.offsetWidth )
return exdiv.contentDocument.body.offsetWidth;
if(_dom==2 || _dom==1)
return _mac?frames[exdiv.id+'_if'].document.body.offsetWidth:
frames[exdiv.id+'_if'].document.body.scrollWidth;
if(_dom==3)
return exdiv.document.width;
return 0;
}
function getExlHeight(exdiv){
if(_dom==4)
return exdiv.contentDocument.body.offsetHeight;
if(_dom==2 || _dom==1)
return _mac?frames[exdiv.id+'_if'].document.body.offsetHeight:
frames[exdiv.id+'_if'].document.body.scrollHeight;
if(_dom==3)
return exdiv.document.height;
return 0;
}
◆ この関数は createExLayer関数で生成したレイアオブジェクトのみを対象とします
また、Mac版IE5 では getExlHeight は正しく動作しません
■レイアの表示制御
レイアの visibility を設定します
★呼出形式 setDivVisibility (div, visible) setDivVisibilities(divs, visible) div : レイアオブジェクト divs : レイアのオブジェクト配列 visible : 可視性( true : 可視, false : 不可視 )
function setDivVisibility(div,visible){ if(_dom==4 || _dom==2 || _dom==1){ div.style.visibility=(visible)?'inherit':'hidden'; return; } if(_dom==3){ div.visibility =(visible)?'inherit':'hide'; return; } } function setDivVisibilities(divs,visible){ if(_dom==4 || _dom==2 || _dom==1){ for(var i=0; i<divs.length; i++) divs[i].style.visibility=(visible)?'inherit':'hidden'; } if(_dom==3){ for(var i=0; i<divs.length; i++) divs[i].visibility =(visible)?'inherit':'hide'; } return divs; }
レイアにクリップ領域を設定します
★呼出形式 setDivClip(div, top, right, bottom, left) div : レイアオブジェクト top : 上部のクリップ位置( pixel ) right : 右部のクリップ位置( pixel ) bottom : 下部のクリップ位置( pixel ) left : 左部のクリップ位置( pixel )
function setDivClip(div,top,right,bottom,left){ if(_dom==4 || _dom==2 || _dom==1){ div.style.clip= 'rect('+top+'px '+right+'px '+bottom+'px '+left+'px)'; return; } if(_dom==3){ div.clip.top =top; div.clip.right=right; div.clip.bottom=bottom;div.clip.left =left; return; } }
◆ Opera7.22 では一応クリップされるものの背景色などは正しく描画されません
レイアに HTML を出力します
★呼出形式 writeDivHTML(div, op, cl, html[,html...]) div : レイアオブジェクト op : div の内容をクリアする cl : div の出力データの最後 html : 書き出す HTML
function writeDivHTML(div,op,cl){ var s=''; for(var i=3; i<arguments.length; i++) s+=arguments[i]; if(_dom==4){ if(op){ while(div.hasChildNodes()) div.removeChild(div.lastChild); } var range=document.createRange(); range.selectNodeContents(div); range.collapse(true); var cf=range.createContextualFragment(s); div.appendChild(cf); return; } if(_dom==2 || _dom==1){ if(op) div.innerHTML=''; if(div.insertAdjacentHTML && !(_mac&&_ie512)) div.insertAdjacentHTML('BeforeEnd',s); else div.innerHTML+=s; return; } if(_dom==3){ if(op) div.document.open('text/html','replace'); div.document.write(s); if(cl) div.document.close(); return; } }
◆ Mac版 IE では、 html が複雑になるとうまく動作しないようです
また、Mac版 IE では innerHTML を使用しているため、
出力対象のレイアにあるオブジェクトは一旦破棄されますので、
変数に記憶している場合は再取得が必要になります
レイアの背景色を設定します
★呼出形式 setDivBackgroundColor(div, color) div : レイアオブジェクト color : 設定する色( 透明の場合は "null" を指定する )
function setDivBackgroundColor(div,color){ if(_dom==3) div.bgColor=color; else div.style.backgroundColor=color?color:'transparent'; }
レイアの背景イメージを設定します
★呼出形式 setDivBackgroundImage(div, url) div : レイアオブジェクト url : 背景として設定する画像ファイルの URL
function setDivBackgroundImage(div,url){ if(_dom==3) div.background.src=url?url:null; else div.style.backgroundImage=url?('url('+url+')'):'none'; }
レイアの Zオーダを設定します
★呼出形式 setDivZIndex(div, order) div : レイアオブジェクト order : Z オーダ
function setDivZIndex(div,order){ if(_dom==4 || _dom==2 || _dom==1){ div.style.zIndex=order; return; } if(_dom==3){ div.zIndex =order; return; } }
インライン style 属性を設定します
★呼出形式 setDivStyleAttribute(div,nm,value) div : レイアオブジェクト nm : 属性名( CSS の属性名ではなく DOM の名称です ) value : 属性値
function setDivStyleAttribute(div,nm,value){ if(_dom!=0 && _dom!=3) eval('div.style.'+nm+'=value'); return div; }
◆ この関数は NN4 では無処理になります
外部参照レイアの外部ファイルを変更します
★呼出形式 changeExlURL(exdiv, url) exdiv : 外部参照レイアのオブジェクト url : 内部に表示する HTMLファイルの URL
function changeExlURL(exdiv,url){ if(_dom==4){ exdiv.setAttribute('src',url); return; } if(_dom==2 || _dom==1){ frames[exdiv.id+'_if'].location.replace(url); return; } if(_dom==3){ exdiv.load(url,exdiv.clip.width); return; } return; }
◆ この関数は createExLayer関数で生成したレイアオブジェクトのみを対象とします
■イベント関連
指定されたイベントオブジェクトからマウス位置を算出します
★呼出形式 <left> = getLeftFromEvent(event) <top> = getTopFromevent(event) <left> : ドキュメント上のX座標 <top> : ドキュメント上のY座標 event : イベントオブジェクト
function getLeftFromEvent(e){ if(_dom==4) return e.clientX+(_safari?0:window.scrollX); if(_dom==2||_dom==1) return document.body.scrollLeft+window.event.clientX; if(_dom==3) return e.pageX; return 0; } function getTopFromEvent(e){ if(_dom==4) return e.clientY+(_safari?0:window.scrollY); if(_dom==2||_dom==1) return document.body.scrollTop+window.event.clientY; if(_dom==3) return e.pageY; return 0; }
◆ この関数は タグで onMouseOver 等の属性を指定するとき
onMouseOver="handler(event);"
等と指定して使用するイベントハンドラ内で使用することを前提としています
◆ Safari 1.0(v85.6) はマウス座標が絶対値で設定されるため特殊処理をしていますが、 仕様かバグか不明です( つまり、将来修正が必要になるかもしれません )
■ダウンロード
このページで紹介している関数を
1つの JavaScriptファイル( jsファイル )として用意しました
LibCrossBrowser.js
◆ このファイルは基本的には HTML ファイル本体に必要な部分のみをコピーして
使用するようにして下さい
また、このファイルを外部ファイルとして使用することもできますが、
その際にはファイルの先頭部分に記述してある共通変数の記述を HTML本体に
コピーして使用するか、あるいは HTML 本体の onLoad イベントで
initCrossBrowserLib 関数を呼び出してご使用下さい
◆ もし、このファイルをそのまま使用する場合にはファイル内にある日本語のコメント ( Shift JIS )に起因するトラブルが発生する可能性がありますので、 日本語のコメントを削除するかまたは SCRIPTタグに「charset="Shift_JIS"」 という具合に文字コードを指定すると避けられるかもしれません