javascriptイベントのロードとプリロード
8970 ワード
通常はwindow.onloadで十分です.もし複数のイベントをロードしたいなら、私達は以下の方式を取ることができます.
[Ctrl+A全選注:外部Jsを導入するにはリフレッシュが必要です.]
しかし、このような有名な関数にはもう一つの欠陥があります.新しい負荷の関数は前の負荷関数の作用領域に置かれています.負荷関数が多いほど、そのスタックの階層が深くなり、明らかにエネルギー消費が大きいです.しかし、onclick、onload、onmouseoutなどの関数として、W 3 CはDOM 0のイベントモデルに属しています.利点は適用範囲が広いですが、その性能に署名して、DOM 1.0のイベントモデルとDOM 2.0のイベントモデルを提出しました.DOM 2は元マイクロソフトのイベントモデルと元ネットスケープのイベントモデルの折衷です.また、複数のタイプのイベントが結合されており、後者が前者をカバーすることはない.そこで人々は有名なaddEvent関数を出して、私達はaddEventを使って私達のイベントを改造してロードします.
[Ctrl+A全選注:外部Jsを導入するにはリフレッシュが必要です.]
OKです.大丈夫です.上のオンリーディー関数には画像のロードを待つオプションのパラメータがあります.JSエンジンはDOMツリーを完成してから画像やオーディオなどの処理を開始すると知っていますが、もし私たちのページがスクリプトレイアウトに大きく依存しているとしたら?早くページに大体の形を見せたいです.これはdomReadyを使います.もとの基礎から改善します.
window.onload = function(){
func1();
func2();
func3();
// ………………
}
しかし、何か特別な必要があるなら、私たちは一緒に書いてはいけませんか?現在のエリアが管理者向けの場合、バックグラウンドでページを生成する場合は、ユーザーが管理者である場合にのみ、ページはこの部分を生成します.この部分も特殊なスクリプトを使用して、上記の方法で料理を中断します.
//
<br>window.onload = function(){
<br>func1();
<br>func2();
<br>// ……
<br>}
<br>
window.onload = function(){
func1();
func2();
// ……
}
このような状況が発生したページはwindow.onloadコードブロックが二つあります.明らかに第二のページは第一のブロックをカバーします.この時、loadEvent関数が登場します.
var loadEvent = function(fn) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
}else {
window.onload = function() {
oldonload();
fn();
}
}
}
それは非常に完璧に相互カバーの問題を解決しました.使い方は以下の通りです.
loadEvent(func1);
loadEvent(func2);
loadEvent(func3);
//
しかし現実の問題はいつもこのように奇抜で不意打ちで、同じくこのように邪門に潜り込みます.最近はすべての関数を一つのクローズドに入れて、名前の衝突の苦しみを免除したいです.例えば、あの有名なDOMセレクタです.JQuery、Prottype、mootoolともセレクタの名前を使って共存することが大きな問題となりました.
(function(){
if(!window.JS){
window['JS'] = {}
}
var onReady = function(fn){
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
}else {
window.onload = function() {
oldonload();
fn();
}
}
}
JS.onReady = onReady;
var $ = function(id){
return document.getElementById(id);
}
JS.$ = $;
})()
闭包环境中のイベントロード(function){if(!window.JS){window['JS'={}}var onReady=function(fn){var oldonload=window.onload;if(typeof window.onload!======'function){windowowow.dododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododododon))=================tion(id){return document.getElement ById}JS.()()JS.onReady{function(){varドル=JS.$;try{alert].innerHTML);catch(e){alert})Test[Ctrl+A全選注:外部Jsを導入するにはリフレッシュが必要です.]
しかし、このような有名な関数にはもう一つの欠陥があります.新しい負荷の関数は前の負荷関数の作用領域に置かれています.負荷関数が多いほど、そのスタックの階層が深くなり、明らかにエネルギー消費が大きいです.しかし、onclick、onload、onmouseoutなどの関数として、W 3 CはDOM 0のイベントモデルに属しています.利点は適用範囲が広いですが、その性能に署名して、DOM 1.0のイベントモデルとDOM 2.0のイベントモデルを提出しました.DOM 2は元マイクロソフトのイベントモデルと元ネットスケープのイベントモデルの折衷です.また、複数のタイプのイベントが結合されており、後者が前者をカバーすることはない.そこで人々は有名なaddEvent関数を出して、私達はaddEventを使って私達のイベントを改造してロードします.
(function(){
if(!window.JS){
window['JS'] = {}
}
var addEvent = function( obj, type, fn ) {
if (obj.addEventListener)
obj.addEventListener( type, fn, false );
else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj.attachEvent( "on"+type, function() {
obj["e"+type+fn]();
} );
}
};
var onReady = function(loadEvent,waitForImages) {
if(waitForImages) {
return addEvent(window, 'load', loadEvent);
}
}
JS.onReady = onReady;
var $ = function(id){
return document.getElementById(id);
}
JS.$ = $;
})()
クローズド環境におけるイベントロード(function){if(!window.JS){window['JS'={}var adEvent= function(obj,type,fn){if(obj.addEventListener)ob J.adEventListener(typepepepe.fn,fn,false))======[EventEventeventjjjjEventEventEvertttttttttttttttttffffffffffffftttttttttttttttttttttttttf))))))tion(){obj[e]+type+fn];};var onReady=function(loadEvent,waitForImages){if(waitForImages){return addEvent(window,'load',loadEEvent);} JS.onReady=onReady;varドル=function(id){return document.getEdededededededededededededededededededededededededededededededed(S))(S))))(((S.JS.JS.JJJS.JS.JS.EEEdedededededededededededededededededededededededededededededededededede){ true];JS.onReady(function){alert}Test[Ctrl+A全選注:外部Jsを導入するにはリフレッシュが必要です.]
OKです.大丈夫です.上のオンリーディー関数には画像のロードを待つオプションのパラメータがあります.JSエンジンはDOMツリーを完成してから画像やオーディオなどの処理を開始すると知っていますが、もし私たちのページがスクリプトレイアウトに大きく依存しているとしたら?早くページに大体の形を見せたいです.これはdomReadyを使います.もとの基礎から改善します.
(function(){
if(!window.JS){
window['JS'] = {}
}
var addEvent = function( obj, type, fn ) {
if (obj.addEventListener)
obj.addEventListener( type, fn, false );
else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj.attachEvent( "on"+type, function() {
obj["e"+type+fn]();
} );
}
};
var onReady = function(loadEvent,waitForImages) {
if(waitForImages) {
return addEvent(window, 'load', loadEvent);
}
var init = function() {
if (arguments.callee.done) return;
arguments.callee.done = true;
loadEvent.apply(document,arguments);
};
if(!+"\v1"){
(function(){
try {
document.documentElement.doScroll("left");
} catch(e) {
setTimeout( arguments.callee, 0 );
return;
}
init();
})();
}else{
document.addEventListener( "DOMContentLoaded", function(){
document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
init();
}, false );
}
return true;
}
JS.onReady = onReady;
var $ = function(id){
return document.getElementById(id);
}
JS.$ = $;
})()
dom標準ブラウザはDOMContentLoadedを使用しています.これは非常に現実味のあるW 3 C理論DOM方法です.FFのDOMMouseScrrollとは違って、基本的にはすべての非IEカーネルのブラウザ最新版がサポートされています.IEの下では、document.documentElement.doScrrollを解決することができます.DOMツリーが完成したかどうかを判断するには、IEの下ではDOMツリーの構築が完了してからでないとdoScullできないという原理がありますが、まだ恋愛小説家ではありません.IEの下でiframeのコンテンツがロードされたかどうかを判定することができません.引き続き改善します.
(function(){
if(!window.JS){
window['JS'] = {}
}
var addEvent = function( obj, type, fn ) {
if (obj.addEventListener)
obj.addEventListener( type, fn, false );
else if (obj.attachEvent) {
obj["e"+type+fn] = fn;
obj.attachEvent( "on"+type, function() {
obj["e"+type+fn]();
} );
}
};
var onReady = function(loadEvent,waitForImages) {
if(waitForImages) {
return addEvent(window, 'load', loadEvent);
}
var init = function() {
if (arguments.callee.done) return;
arguments.callee.done = true;
loadEvent.apply(document,arguments);
};
if(!+"\v1"){
if(window.self == window.top){
(function(){
try {
document.documentElement.doScroll("left");
} catch(e) {
setTimeout( arguments.callee, 0 );
return;
}
init();
})();
}else{
document.attachEvent("onreadystatechange", function(){
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", arguments.callee );
init();
}
});
}
}else{
document.addEventListener( "DOMContentLoaded", function(){
document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
init();
}, false );
}
return true;
}
JS.onReady = onReady;
var $ = function(id){
return document.getElementById(id);
}
JS.$ = $;
})()
私たちはまるでjqueryの$readyを再実現しています.非常に強力な機能を持っています.クローズドを使って作られた名前空間に合わせて、基本的な刃物が入らないです.しかもグローバル変数「JS」だけを汚染しています.YUIに匹敵します(笑).しかし、一般的なアプリケーションに対しては、このように周到にする必要はありません.画像を処理する必要がないなら、ページもiframeがないので、このマイクロ縮小版を作ってもいいです.
(function(){
if(!window.JS){
window['JS'] = {}
}
var onReady = function(loadEvent) {
if(!+"\v1"){
(function(){
try {
document.documentElement.doScroll("left");
} catch(e) {
setTimeout( arguments.callee, 0 );
return;
}
loadEvent();
})();
}else{
document.addEventListener( "DOMContentLoaded", loadEvent, false );
}
}
JS.onReady = onReady;
var $ = function(id){
return document.getElementById(id);
}
JS.$ = $;
})()