javascript之DOMReady

DOMReady实现策略
    * 在页面的DOM树创建完成后(即HTML解析第一步完成)就触发,而无需等待其他资源的加载,即DOMReady实现策略
    * 支持DOMContentLoaded事件的浏览器: 就使用DOMContentLoaded事件
    * 不支持DOMContentLoaded事件的浏览器: 使用Hack兼容
    * 通过IE中的document.documentElement.doScroll(‘left‘)来判断DOM树是否创建完毕

代码实现

function myReady(fn){

    if(document.addEventListener){
        document.addEventListener(‘DOMContentLoaded‘,fn,false);
    }else{//低版本浏览器
        IEContentLoaded(fn);
    }

    //IE模拟DOMContentLoaded
    function IEContentLoaded(fn){
        var d = window.document;
        var done = false;
        //值执行一次用户的回调函数init();
        var init = function(){
            if(!done){
                done = true;
                fn();
            }
        };

        (function(){
            try{
                //DOM树未创建完之前调用doScroll会抛出错误
                d.documentElement.doScroll(‘left‘);
            }catch(e){
                //延迟在试一次,
                //var func = function() { alert(func === arguments.callee);}func();
              //执行上述代码,可以看到alter出来的结果是true,注意,此处用的是“===”,就是说func与arguments.callee对象类型和值都相等。
                setTimeout(arguments.callee,50);
                return;
            }
            init();
        })();

        //监听document的加载状态
        d.onreadystatechange = function(){
            //如果用户是在domReady之后绑定的函数,就立马执行
            if(d.readyState == ‘complete‘){
                d.onreadystatechange = null;
                init();
            }
        }
    }
}

为什么使用domReady来代替onload?

* onload是需要等待页面所有资源都加载完毕,才触发

* domReady是DOM加载完就触发

我们下面看个例子

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8">
        <title>domReady</title>
        <script src="domReady.js"></script>
    </head>
    <body>
        <div id="showMsg"></div>
        <div>
            <img src="images/1.jpg"/>
            <img src="images/2.jpg"/>
            <img src="images/3.jpg"/>
        </div>
        <script>
            var d = document;
            var msgBox = d.getElementById(‘showMsg‘);
            var imgs = d.getElementsByTagName(‘img‘);
            var time1 = null,time2 = null;
            myReady(function(){
                msgBox.innerHTML += "dom已加载!<br>";
                time1 = new Date().getTime();
                msgBox.innerHTML += "时间戳:" + time1 + "<br>";
            });
            window.onload = function(){
                msgBox.innerHTML += "onload已加载!<br>";
                time2 = new Date().getTime();
                msgBox.innerHTML += "时间戳:" + time2 + "<br>";
                msgBox.innerHTML += "domReady比onload快" + (time2 - time1) + "ms<br>";
            };
        </script>
    </body>
</html>

时间: 2024-12-24 21:47:35

javascript之DOMReady的相关文章

domReady的兼容性实现方法

一.为何要实现domReay方法? 举例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>domready</title> <script src="domready.js"></script> <script> document.getEleme

司徒正美文章列表

由于本人对司徒正美文章的喜欢,特此整理文章列表如下. 一个带完整的RBAC授权系统的rails应用(第一部分)(司徒正美, 3年前, 12/6549) 一个带完整的RBAC授权系统的rails应用(第二部分)(司徒正美, 3年前, 1/1135) 随机生成十六进制颜色(司徒正美, 3年前, 0/340) ruby中的类变量与实例变量(司徒正美, 3年前, 0/231) ruby模拟多个构造器(司徒正美, 3年前, 0/153) ruby的实例方法(写方法,读方法与读写方法)(司徒正美, 3年前,

Loader Plugins-dojo/domReady

dojo/domReady!,AMD加载插件,DOM元素加载完成后调用回调函数. 1 <script type="text/javascript" src="/dojo/dojo/dojo/dojo.js"></script> 2 <script type="text/javascript"> 3 require(["dojo/domReady!"],function(){ 4 consol

初学ArcGIS API for JavaScript

初学ArcGIS API for JavaScript 对于初学者来说,关于esri提供的一些样式和dojo自带的一些样式还是需要有一定的了解,这块在<WebGIS开发从基础到实践>讲解的特别详细,在这里以笔记的形式来帮助自己加以理解和记忆. esri.css样式主要用于ESRI提供的小部件与组件,比如地图.信息框等.此外,还可以引用Dojo提供的样式表,Dojo提供了4组样式,分别是claro\tundra\soria以及nihilo,每种是一组定义用户界面的字体.颜色与大小等设置.在Arc

Javascript模块化编程(三):require.js的用法

作者: 阮一峰 日期: 2012年11月 7日 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代码,相信很多人都见过. <script src="1.js"></s

关于ArcGIS API for JavaScript中basemap的总结介绍(一)

实际上basemap这个概念并不只在arcgis中才有,在Python中有一个matplotlib basemap toolkit(https://pypi.python.org/pypi/basemap),是用来实现地理信息可视化的.其中,matplotlib是Python常用的数据绘制包,basemap是matplotlib的一个子包,用来进行地图绘制.本文所指的basemap是指esri提供的基础底图图层. 正式使用basemap是在前一阵做webgis开发的时候,需要在自己的矢量图层下面

ArcGIS JavaScript在线编辑

代码: <html> <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">     <title>Demo:Edit Features</title>     <link rel="stylesheet" href="https://js.arcgis.com/3.17

RequireJS is a JavaScript file and module loader

RequireJS RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJS加载模块化脚本将提高代码的加载速度和质量. /* --- RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in ot

Arcgis for javascript实现百度地图ABCD marker的效果

概述: 在我的博客中,有一篇相关的文章,这段时间,有很多人问我求源码,只是时间过去已长,源代码已找不到,乘着这个9.3放假,又重新实现了下,并相关代码做了优化,在此贴出来,方便大家使用. 相关文章地址: http://blog.csdn.net/gisshixisheng/article/details/39577817 实现后效果: 为直观期间,先贴出来我做的效果 列表展示和地图展示以及联动 显示信息 实现思路: 1.列表与地图的互动 鼠标经过列表时,修改列表图标,并根据列表返回的值在地图上绘