アフィリエイト広告を利用しています
最新記事
日別アーカイブ

広告

posted by fanblog

2012年06月22日

onLoad よりも早く

今回は javascript のお話です。
要素が全部読込まれた後に実行させたいメソッドを定義するとき、
よくあるのは onLoad イベントで記述すると思います。

<body onload="javascript:initialize()">〜

または

// IE
if(document.attachEvent)
document.attachEvent('onload', initialize);
// Mozilla
if(document.addEventListener)
document.addEventListener('load', initialize, false);

onLoad イベントは、画像などのファイルが全部読込まれてから起動しますので、
イベント内で初期値を設定している場合、画面が表示されてから
勝手に入力項目に値が入ったような印象を受けます。

見た目も、ううむ、と考えさせられてしまいます。

回避策ですが、Mozilla 系では、DOMContentLoaded というイベントがあり、
要素が全部呼ばれたタイミングで起動するイベントがあります。

document.addEventListener('DOMContentLoaded', initialize, false);

これならば、より初期値が入っているような見た目を実現することが可能です。

IE ではどうするかというと、jQuery でもこうしているのですが、
doScroll が正常に実行できるかどうかを、
要素が全部読込まれたかの判定に使っているようです。
ここで initialize は、関数オブジェクトが格納された変数とします。

(function(){
if(initialize) {
try{
document.doScroll('left');
} catch(err) {
window.setTimeout(argument.callee, 0);
return;
}
initialize();
}
})();

function にしている理由をあらためて書いておきますが、
argument.callee でリトライする処理の範囲を決めておくためです。
doScroll に失敗した場合、catch で argument.callee が実行されるわけですが、
argument.callee = function で囲まれた部分と解釈してください。

また、画面構成によっては、onLoad が先に処理が終わってしまう場合があるそうなので、
以下のようなコードを入れておくと、より高速な処理ができると思います。

document.onreadystatechange = function() {
if (document.readyState == 'complete') {
initialize();
// doScroll の処理を実行しないようにするため、変数を無効化する
initialize = null;
}
};
【このカテゴリーの最新記事】
posted by FJT at 07:08| javascript
プロフィール
FJTさんの画像
FJT
使えそうな技術情報を掲載しています。 ぜひ、役立ててください。
プロフィール
リンク集
×

この広告は30日以上新しい記事の更新がないブログに表示されております。