当前位置: 首页 > news >正文

DOMContentLoaded事件

今天查看百度空间源代码,发现多了个util.js文件,打开看看。里面里面定义了addDOMLoadEvent。这是干什么用的?

仔细查看代码,发现在Mozilla添加了DOMContentLoaded事件,这个在以前一直没有用过。                    if (document.addEventListener)
                        document.addEventListener("DOMContentLoaded", init, false);

好像就是为了兼容实现DOMContentLoaded事件。

网上找了点有关DOMContentLoaded的资料拿来看看。

DOMContentLoaded是firefox下特有的Event, 当所有DOM解析完以后会触发这个事件。
    与DOM中的onLoad事件与其相近。但onload要等到所有页面元素加载完成才会触发, 包括页面上的图片等等。
    如果页面的图片很多的话, 从用户访问到onload触发可能需要较长的时间, 而在Ajax运用中, 常常需要在onload中加入许多初始化的动作, 如果由于网络问题引起的图片加载过慢( 见: Ajax优化(2) -- lazierLoad img && js), 则必然影响用户的体验。
    在这种情况下firefox的DOMContentLoaded事件, 恰恰是我们需要的。

    目前,跨平台的DOMContentLoaded的解决方案有很多, 比如jQuery, Prototype...等等, 其实现原理大同小异.

    在项目中, 我使用了Prototype工具, 以往调用初始化的方法是:

Event.observe(window, "load", init);

现在有了DOMContentLoaded, 可以替换成如下的方法:

document.observe('contentloaded', init);

最新的prototype中自定义事件已经重新命名, 使用"dom:loaded" 代替了 “contentloaded”.

document.observe('dom:loaded', init);

附:

   Andrea Giammarchi的OnContent函数提供了一个跨平台的DOMContentLoaded的解决方案My DOMContentLoaded Final Solution 

文件名称:DOMContentLoaded.js

  1. function onContent(f){
  2.     var a = onContent,
  3.      b navigator.userAgent,
  4.      d document,
  5.      w window,
  6.      c "onContent",
  7.     "addEventListener",
  8.      o "opera",
  9.      r "readyState",
  10.      s "<scr".concat("ipt defer src='//:' on", r"change='if(this.", r"==\"complete\"){this.parentNode.removeChild(this);", c".", c"()}'></scr""ipt>");
  11.      a[c(function(o{
  12.         return function({
  13.              a[cfunction({};
  14.             for (a arguments.callee! a.done; a.done = 1) f(o ? o(: o)
  15.         }
  16.     })(a[c]);
  17.     if (d[e]) d[e]("DOMContentLoaded", a[c]false);
  18.     if (/WebKit|Khtml/i.test(b|(w[o&parseInt(w[o].version()< 9))(function(/ loaded complete .test(d[r]? a[c](setTimeout(arguments.callee, 1)
  19.     })();
  20.     else if (/MSIE/i.test(b)) d.write(s);
  21. };
  22. util.js:

    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())
                        setTimeout(exec, 10);
                    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);
            }
    })();

    function insertWBR(string, step){
        var textarea = document.createElement('TEXTAREA');
        textarea.innerHTML = string.replace(/</g,"&lt;").replace(/>/g,"&gt;");
        string = textarea.value;

        var step = (step || 5), reg = new RegExp("(\\S{" + step + "})", "gi");
        return string.replace(/(<[^>]+>)/gi,"$1<wbr/>").replace(/(>|^)([^<]+)(<|$)/gi, function(a,b,c,d){
            if(c.length < step) return a;
            return b + c.replace(reg, "$1<wbr/>") + d;
        });
    }

相关文章:

  • iOS开发UITextField设置
  • 静态,抽象类、接口、类库
  • leetcode-188 买卖股票4
  • [转]理解I/O Completion Port
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • 【iOS第三方框架】FMDB刚刚好
  • C#框架及概念
  • vue webpack 构建
  • 设计模式之观察者模式(c++)
  • codeforces 492E. Vanya and Field(exgcd求逆元)
  • tcp 重发 应用层重传
  • Log4j具体使用实例
  • ios8之后的界面旋转简单原理
  • 设计模式之桥接模式(Bridge模式)
  • jsdoc文档
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Apache的80端口被占用以及访问时报错403
  • Apache的基本使用
  • CentOS6 编译安装 redis-3.2.3
  • go append函数以及写入
  • input实现文字超出省略号功能
  • JavaScript函数式编程(一)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PHP面试之三:MySQL数据库
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 仿天猫超市收藏抛物线动画工具库
  • 警报:线上事故之CountDownLatch的威力
  • 面试遇到的一些题
  • 三栏布局总结
  • 什么是Javascript函数节流?
  • 实现简单的正则表达式引擎
  • 微服务核心架构梳理
  • 我有几个粽子,和一个故事
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (4)事件处理——(7)简单事件(Simple events)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (简单) HDU 2612 Find a way,BFS。
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)UDP基本编程步骤
  • (转)Scala的“=”符号简介
  • (转载)利用webkit抓取动态网页和链接
  • *** 2003
  • ***检测工具之RKHunter AIDE
  • ..回顾17,展望18
  • .NET 回调、接口回调、 委托
  • .NET 依赖注入和配置系统
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .netcore如何运行环境安装到Linux服务器
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [bzoj4240] 有趣的家庭菜园
  • [C# 网络编程系列]专题六:UDP编程
  • [C++] sqlite3_get_table 的使用