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 相关文章推荐
在多个页面使用同一个HTML片段的代码
Mar 04 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 Javascript
jQuery动态创建html元素的常用方法汇总
Sep 05 Javascript
JS返回iframe中frameBorder属性值的方法
Apr 01 Javascript
关于JS中prototype的理解
Sep 07 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 Javascript
JS原生带缩略图的图片切换效果
Oct 10 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
Nov 26 Javascript
Vue实现固定定位图标滑动隐藏效果
May 30 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 Javascript
React四级菜单的实现
Apr 08 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
PHP语法速查表
2007/01/02 PHP
php批量删除数据
2007/01/18 PHP
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
yii添删改查实例
2015/11/16 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
PHP chr()函数讲解
2019/02/11 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
js验证上传图片的方法
2015/05/12 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
Python构建XML树结构的方法示例
2017/06/30 Python
详解python中的hashlib模块的使用
2019/04/22 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
出生医学证明样本
2014/01/17 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
目标责任书范文
2014/04/14 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书