欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript 事件加載與預加載

 更新時間:2009年12月24日 13:15:04   作者:  
本文對JavaScript事件加載進行了一些延伸思考。加載多個事件時,使用window.onload可能會導致一些不便,而通過偵聽器等方法,則可以解決這些問題。

通常來說,window.onload就夠用了,如果想加載多個事件,我們可以采取以下方式:

復制代碼 代碼如下:

window.onload = function(){
func1();
func2();
func3();
//更多加載事件………………
}

但如果由于某種特殊需要,我們不能合在一起寫嗎?如當前區(qū)域是面向管理員,后臺生成頁面時只有當用戶是管理員,頁面才生成這部分,而這部分也用到一些特殊的腳本,上面的方法就歇菜了!
復制代碼 代碼如下:

//后臺代碼
<script type="text/javascript">
window.onload = function(){
func1();
func2();
//加載普通用戶用到的腳本……
}
</script>
<%# 以下腳本是為管理員準備的 %>
<% if @user.role == "manager" %>
window.onload = function(){
func1();
func2();
//加載機密腳本……
}
<% end %>

這種情況生成出來的頁面擁有兩個window.onload代碼塊,很顯然,第二個覆蓋掉第一個。這時,輪到loadEvent函數(shù)出場了。
復制代碼 代碼如下:

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);
//更多加載事件

但現(xiàn)實的問題總是如此出奇不意,也如此刁鉆邪門。最近我想把所有的函數(shù)放到一個閉包中,以免除命名沖突之苦,比如那個有名的$的DOM選擇器。JQuery,Prototype,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.$ = $;
})()


[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

不過像這個如此有名的函數(shù)其實還有一個缺陷,就是新加載的函數(shù)被放置于前一個加載函數(shù)的作用域之用,加載函數(shù)越多,其棧的層次越深,顯然性能耗很大。不過像onclick,onload,onmouseout等這樣函數(shù),W3C把它們歸屬于DOM0的事件模型,好處是適用范圍廣,但簽于其性能,于是又提出DOM1.0的事件模型與DOM2.0的事件模型,DOM2就是原微軟的事件模型與原網(wǎng)景的事件模型的合璧,既能捕獲又能冒泡,而且多綁定多類型事件而不會導致后者覆蓋前者。于是人們總搞出了有名的addEvent函數(shù)出來,我們用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.$ = $;
})()


[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

OK,沒問題。上面的onReady函數(shù)有一個可選參數(shù),用于是否待圖片加載。我們知道JS引擎會在完成DOM樹后才開始處理圖片與音頻等東西,但如果我們的頁面嚴重依賴于腳本布局呢?!我們想盡快讓頁面呈現(xiàn)出大體形態(tài),這就用到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,這是非常正現(xiàn)的W3C論DOM方法,與FF的DOMMouseScroll 不一樣,基本上所有非IE內(nèi)核的瀏覽器最新版都支持它了。IE下我們可以通過偵聽document. documentElement. doScroll()來判斷DOM樹是否完成,原理是IE下只有當DOM樹構建完成后才能doScroll。但它還不是盡善盡美,它在IE下無法判定 iframe的內(nèi)容是否加載完畢。我們繼續(xù)改進它。
復制代碼 代碼如下:

(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.$ = $;
})()

我們簡直是在重新實現(xiàn)jquery的$(document).ready(function(){ })!它功能非常強悍,配合利用閉包做成的命名空間,基本刀槍不入。而且它就只污染一個全局變量“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.$ = $;
})()

相關文章

  • input type=file 選擇圖片并且實現(xiàn)預覽效果的實例

    input type=file 選擇圖片并且實現(xiàn)預覽效果的實例

    下面小編就為大家?guī)硪黄猧nput type=file 選擇圖片并且實現(xiàn)預覽效果的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • RGB顏色值轉(zhuǎn)HTML十六進制(HEX)代碼的JS函數(shù)

    RGB顏色值轉(zhuǎn)HTML十六進制(HEX)代碼的JS函數(shù)

    轉(zhuǎn)到固定長度的十六進制字符串,不夠則補0 javascript找出一個背景色的數(shù)值,只好自己解析
    2009-04-04
  • javascript實現(xiàn)下拉菜單效果

    javascript實現(xiàn)下拉菜單效果

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)下拉菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • javascript和jquery實現(xiàn)用戶登錄驗證

    javascript和jquery實現(xiàn)用戶登錄驗證

    這篇文章主要為大家詳細介紹了javascript和jquery分別實現(xiàn)用戶登錄驗證的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • js下用eval生成JSON對象

    js下用eval生成JSON對象

    在使用eval生成JSON對象時,一定要注意添加一對圓括號
    2010-09-09
  • JavaScript高級程序設計 閱讀筆記(二十一) JavaScript中的XML

    JavaScript高級程序設計 閱讀筆記(二十一) JavaScript中的XML

    雖然XML和DOM已經(jīng)變成Web開發(fā)的重要組成部分,但目前僅IE跟Mozilla支持客戶端的XML處理
    2012-09-09
  • 通過flv.js播放監(jiān)控示例深入探究直播流技術

    通過flv.js播放監(jiān)控示例深入探究直播流技術

    本文記錄一下在使用 flv.js 播放監(jiān)控視頻時踩過的各種各樣的坑,雖然官網(wǎng)給的?Getting Started?只有短短幾行代碼,跑一個能播視頻的 demo 很容易,但是播放時各種各樣的異常會搞到你懷疑人生,下面我將自己踩過的坑,以及踩坑過程中補充的相關知識,詳細總結一下
    2023-10-10
  • 一個簡單的js樹形菜單

    一個簡單的js樹形菜單

    說到樹形菜單,貌似一般是用在一些管理系統(tǒng)里面的,我是還沒有用到過,有些zTree之類的插件已經(jīng)做得比較好了
    2011-12-12
  • JS實現(xiàn)移動端按首字母檢索城市列表附源碼下載

    JS實現(xiàn)移動端按首字母檢索城市列表附源碼下載

    我們常見的手機通訊錄或微信通訊錄,聯(lián)系人信息是按字母順序排列的列表,通過點擊右側的字母,會迅速定位檢索到首字母對應的聯(lián)系人。下面通過本文給大家分享JS實現(xiàn)移動端按首字母檢索城市列表功能,需要的的朋友參考下吧
    2017-07-07
  • javascript兼容性(實例講解)

    javascript兼容性(實例講解)

    下面小編就為大家?guī)硪黄猨avascript兼容性(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論