Dom加载让图片加载完再执行的脚本代码


Posted in Javascript onMay 15, 2008

现在,我们来研究一下如何解决这个问题,解决方法就是在DOM加载完毕之后就执行程序。 

       先介绍两个人。一,jquery的作者:John Resig;二,javascript的世界级大师:dean edwards。(大家要记住这两位天才!) 

      jquery里有专门解决DOM加载的函数$(document).ready()(简写就是$(fn)),非常好用!John Resig在《Pro JavaScript Techniques》里,有这样一个方法处理DOM加载,原理就是通过document&& document.getElementsByTagName &&document.getElementById&& document.body 去判断Dom树是否加载完毕。代码如下:

function domReady( f ) { 
// 如果DOM加载完毕,马上执行函数 
if ( domReady.done ) return f();    
// 假如我们已增加一个函数 
if ( domReady.timer ) {  
// 把它加入待执行的函数清单中 
domReady.ready.push( f );  
} else {  
// 为页面加载完成绑定一个事件,  
// 为防止它最先完成. 使用 addEvent(下面列出). 
addEvent( window, “load”, isDOMReady );    
// 初始化待执行的函数的数组 
domReady.ready = [ f ];    
// 经可能快地检查Dom是否已可用 
domReady.timer = setInterval( isDOMReady, 13 );  
}  
}   
// 检查Dom是否已可操作 
function isDOMReady() {  
// 假如已检查出Dom已可用, 忽略  
if ( domReady.done ) return false;    
// 检查若干函数和元素是否可用 
if ( document &&  document.getElementsByTagName &&  document.getElementById &&  document.body ) {    
// 假如可用, 停止检查 
clearInterval( domReady.timer );  
domReady.timer = null;    
// 执行所有等待的函数 
for ( var i = 0; i < domReady.ready.length; i++ )  
domReady.ready[i]();    
// 记录在此已经完成 
domReady.ready = null;  
domReady.done = true;  
}  
} 
// 由 Dean Edwards 在2005 所编写addEvent/removeEvent, 
// 由 Tino Zijdel整理 
// http://dean.edwards.name/weblog/2005/10/add-event/ 
//优点是1.可以在所有浏览器工作; 
//2.this指向当前元素; 
//3.综合了所有浏览器防止默认行为和阻止事件冒泡的的函数 
//缺点就是仅在冒泡阶段工作 
function addEvent(element, type, handler) { 
    // assign each event handler a unique ID 
    if (!handler.$$guid) handler.$$guid = addEvent.guid++; 
    // create a hash table of event types for the element 
    if (!element.events) element.events = {}; 
    // create a hash table of event handlers for each element/event pair 
    var handlers = element.events[type]; 
    if (!handlers) { 
        handlers = element.events[type] = {}; 
        // store the existing event handler (if there is one) 
        if (element["on" + type]) { 
            handlers[0] = element["on" + type]; 
        } 
    } 
    // store the event handler in the hash table 
    handlers[handler.$$guid] = handler; 
    // assign a global event handler to do all the work 
    element["on" + type] = handleEvent; 
}; 
// a counter used to create unique IDs 
addEvent.guid = 1; 
function removeEvent(element, type, handler) { 
    // delete the event handler from the hash table 
    if (element.events && element.events[type]) { 
        delete element.events[type][handler.$$guid]; 
    } 
}; 
function handleEvent(event) { 
    var returnValue = true; 
    // grab the event object (IE uses a global event object) 
    event = event || fixEvent(window.event); 
    // get a reference to the hash table of event handlers 
    var handlers = this.events[event.type]; 
    // execute each event handler 
    for (var i in handlers) { 
        this.$$handleEvent = handlers[i]; 
        if (this.$$handleEvent(event) === false) { 
            returnValue = false; 
        } 
    } 
    return returnValue; 
}; 
function fixEvent(event) { 
    // add W3C standard event methods 
    event.preventDefault = fixEvent.preventDefault; 
    event.stopPropagation = fixEvent.stopPropagation; 
    return event; 
}; 
fixEvent.preventDefault = function() { 
    this.returnValue = false; 
}; 
fixEvent.stopPropagation = function() { 
    this.cancelBubble = true; 
};

还有一个估计由几个外国大师合作写的,实现同样功能。
/* 
* (c)2006 Jesse Skinner/Dean Edwards/Matthias Miller/John Resig 
* Special thanks to Dan Webb's domready.js Prototype extension 
* and Simon Willison's addLoadEvent 
* 
* For more info, see: 
* http://www.thefutureoftheweb.com/blog/adddomloadevent 
* http://dean.edwards.name/weblog/2006/06/again/ 
* http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype 
* http://simon.incutio.com/archive/2004/05/26/addLoadEvent 
*  
* 
* To use: call addDOMLoadEvent one or more times with functions, ie: 
* 
*    function something() { 
*       // do something 
*    } 
*    addDOMLoadEvent(something); 
* 
*    addDOMLoadEvent(function() { 
*        // do other stuff 
*    }); 
* 
*/ addDOMLoadEvent = (function(){ 
    // create event function stack 
    var load_events = [], 
        load_timer, 
        script, 
        done, 
        exec, 
        old_onload, 
        init = function () { 
            done = true; 
            // kill the timer 
            clearInterval(load_timer); 
            // execute each function in the stack in the order they were added 
            while (exec = load_events.shift()) 
                exec(); 
            if (script) script.onreadystatechange = ''; 
        }; 
    return function (func) { 
        // if the init function was already ran, just run this function now and stop 
        if (done) return func(); 
        if (!load_events[0]) { 
            // for Mozilla/Opera9 
            if (document.addEventListener) 
                document.addEventListener("DOMContentLoaded", init, false); 
            // for Internet Explorer 
            /*@cc_on @*/ 
            /*@if (@_win32) 
                document.write("<script id=__ie_onload defer src=//0><\/scr"+"ipt>"); 
                script = document.getElementById("__ie_onload"); 
                script.onreadystatechange = function() { 
                    if (this.readyState == "complete") 
                        init(); // call the onload handler 
                }; 
            /*@end @*/ 
            // for Safari 
            if (/WebKit/i.test(navigator.userAgent)) { // sniff 
                load_timer = setInterval(function() { 
                    if (/loaded|complete/.test(document.readyState)) 
                        init(); // call the onload handler 
                }, 10); 
            } 
            // for other browsers set the window.onload, but also execute the old window.onload 
            old_onload = window.onload; 
            window.onload = function() { 
                init(); 
                if (old_onload) old_onload(); 
            }; 
        } 
        load_events.push(func); 
    } 
})();
Javascript 相关文章推荐
JS 表单验证大全
Nov 23 Javascript
JS实现消息来时让网页标题闪动效果的方法
Apr 20 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
微信小程序 WebSocket详解及应用
Jan 21 Javascript
详解vue-router 路由元信息
Sep 13 Javascript
Vue中render方法的使用详解
Jan 26 Javascript
详解Vue 多级组件透传新方法provide/inject
May 09 Javascript
在Vue项目中使用snapshot测试的具体使用
Apr 16 Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 Javascript
javascript实现倒计时效果
Feb 17 Javascript
js实现石头剪刀布游戏
Oct 11 Javascript
使用Vue实现一个树组件的示例
Nov 06 Javascript
直接生成打开窗口代码,不必下载
May 14 #Javascript
地震发生中逃生十大法则
May 12 #Javascript
通过修改referer下载文件的方法
May 11 #Javascript
JS启动应用程序的一个简单例子
May 11 #Javascript
一段利用WSH获取登录时间的jscript代码
May 11 #Javascript
一段利用WSH修改和查看IP配置的代码
May 11 #Javascript
JS处理VBArray的函数使用说明
May 11 #Javascript
You might like
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
详解php的socket通信
2015/08/11 PHP
JS 类型转换常见方法小结
2010/05/31 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
Python实现的求解最小公倍数算法示例
2018/05/03 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
网页设计个人找工作求职信
2013/11/28 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
2015年护士节活动总结
2015/02/10 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
windows安装python超详细图文教程
2021/05/21 Python
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
python 标准库原理与用法详解之os.path篇
2021/10/24 Python