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 相关文章推荐
jQuery 1.5最新版本的改进细节分析
Jan 19 Javascript
jq选项卡鼠标延迟的插件实例
May 13 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
深入分析Javascript事件代理
Jan 30 Javascript
Vue.js计算属性computed与watch(5)
Dec 09 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
Feb 09 Javascript
JavaScript的词法结构精华篇
Oct 17 Javascript
node.js监听文件变化的实现方法
Apr 17 Javascript
Vue使用lodop实现打印小结
Jul 06 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
Jul 27 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
Sep 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
德生H-501的评价与改造
2021/03/02 无线电
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
Promise扫盲贴
2019/06/24 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
Python3实现飞机大战游戏
2020/04/24 Python
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
电信专业毕业生推荐信
2013/11/18 职场文书
学校端午节活动总结
2015/02/11 职场文书
企业年会祝酒词
2015/08/11 职场文书