对于很多初学者来说,window.onload出现在代码中的频率非常高,这似乎变成了一种习惯,可是并不知道具体为什么要加这句代码,可以做几个试验对比:

实验一:

<script>

  document.getElementById("me").style.color = "blue";

</script>

<body>

  <h1 id="me">大宝章 is Double Zhang</h1>

</body>

实验结果是 h1字体为原始黑色,并没有被渲染为蓝色,原因是document文档是从上向下解析执行,当执行到script时,body中的h1还未被执行和加载到网页中,这时候 document.getElementById("me") 并没有获取到h1对象,就更不存在将它的字体设置为蓝色了。

------------------------------------------------------------------------------------------------------------

实验二:

<body>

  <script>

    document.getElementById("me").style.color = "blue";

  </script>

  <h1 id="me">大宝章 is Double Zhang</h1>

</body>

实验结果字体为原始的黑色,可以很好的解释“document文档是从上向下解析执行”,当执行script时,h1仍旧没有被加载。

------------------------------------------------------------------------------------------------------------

实验三:

<body>

  <h1 id="me">大宝章 is Double Zhang</h1>

  <script>

    document.getElementById("me").style.color = "blue";

  </script>

</body>

实验结果字体为蓝色,终于渲染成功,从上而下万年不变的真理啊。

------------------------------------------------------------------------------------------------------------

实验四:

<script>
  window.onload = function(){
    document.getElementById("me").style.color = "blue";
  }
</script>
<body>
  <h1 id="me">大宝章 is Double Zhang</h1>
</body>

相比实验一添加了神器window.onload,字体为蓝色。这里有必要解释一下window.onload了,它表示网页完成了加载,包括DOM树的创建、网页中图片等外部资源的加载。window.onload=function(){这里的代码将在网页加载完成以后执行},这就是为什么实验四能够成功渲染蓝色字体,因为body里的内容已经加载完成,h1已经存在,才执行了颜色设置。

这里有一个隐患,当页面中需要加载的文件非常多(如图片),window.onload里面的代码就迟迟无法执行,将带来很差的用户体验。

------------------------------------------------------------------------------------------------------------

实验五:

<script>
  setTimeout(function(){

    document.getElementById("me").style.color = "blue";

  },3000); 

</script>
<body>
  <h1 id="me">大宝章 is Double Zhang</h1>
</body>

字体成功渲染为蓝色,因为做了一个定时器的延时3秒,在这3秒里,页面完成了加载工作,h1已经建立好,再添加颜色就没问题了,但是运行会看到字体会闪一下,闪之前为黑色,闪之后变为红色,因为页面刚加载好,h1默认呈现黑色,三秒时变为红色。

这也是一种方法,但是我们并不提倡,因为我们无法把握页面加载完成的准确时间,就意味着我们不能避免“闪一下”的问题,并且,setTimeout设置的延迟时间如果小于页面加载的时间,字体也不会渲染为蓝色。

-----------------------------------------------------------------------------------------------

实验六:

<script>

$(document).ready(function(){

  document.getElementById("me").style.color = "blue";

});   

</script>
<body>
  <h1 id="me">大宝章 is Double Zhang</h1>
</body>

字体成功渲染蓝色!wuli jQuery的ready方法,就是在DOM树创建完成后(HTML解析的第一步)就触发,无需等待页面中其他资源(图片等)的加载,成功解决了实验四中的隐患。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

自己模拟一个jQuery的ready方法:

function myReady(fn){

  //利用能力检测区分浏览器

  if(document.addEventListener){

    document.addEventListener("DOMContentLoaded",fn,false);

  }

  else{  //这里是IE低版本浏览器

    IEContentLoaded(fn);

  }

  //IE模拟DOMContentLoaded

  function IEContentLoaded(fn){

    var d = document.window;

    //保证fn回调函数只执行一次

    var done = false;

    var init = function(){

      if(!done){

        done = true;

        fn();

      }

    }

    (function(){

      try{

        //DOM树未创建前调用doScroll会抛出异常

        d.documentElement.doScroll('left');

      }

      catch(e){

        //arguments.callee指向这个即可执行的(function(){})();

        //没有捕获异常意味着DOM成功创建,就可以执行回调函数了

        setTimeout(arguments.callee,60);  

        return;

      }

    })();

    //监听document的加载状态

    d.onreadystatechange = function(){

      if(d.readyState == 'complete'){

        d.onreadyState == null;

        init();

      }

    }

  }

}

window.onload与$(document).ready()的区别的更多相关文章

  1. window.onload和$(document).ready()的区别

    window.onload和$(document).ready()的区别,如下表所示   window.onload $(document).ready() 执行时间 在页面所有内容(图片.文件)加载 ...

  2. window.onload和document.ready的区别

    window.onload和document.ready虽然两个方法的运行效果都一样,但他们之间是存在着区别的: 一.从执行的时间 window.onload在dom文档结构加载完毕以后就可以执行,不 ...

  3. window.onload 与 $(document).ready() 的区别

    以浏览器装载文档为例,在页面加载完毕后,浏览器会通过 JavaScript 为 DOM 元素添加事件.在常规的 JavaScript 代码中,通常使用 window.onload 方法 ,而在 jQu ...

  4. 浏览器加载模式:window.onload和$(document).ready()的区别(详解)

    jQuery库文件是在body元素之前加载的,必须等待所有的DOM元素加载后,延迟支持DOM操作,否则就无法获取到. 在延迟等待加载,JavaScript提供了一个事件为load,方法如下: wind ...

  5. 【jQuery】window.onload 和 $(document).ready() 的区别

    ... 在Stack Overflow上看到了这个问题,自己翻译了过来. The onload event is a standard event in the DOM, while the read ...

  6. window.onload与document.ready的区别

    1. window.onload必须等到网页中所有的内容加载完(包含图片)才执行 document.ready网页中所有DOM结构绘制完执行,可能DOM并没有加载完 所有document.ready比 ...

  7. window.onload与$(document).ready()之区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.         $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2 ...

  8. window.onload()和$(document).ready的区别( $(document).ready == $(function(){ }) )

    首先$(function(){}) 和 $(document).ready(function(){}) 是一个方法,$(function(){})为简写(用的多) $(document).ready和 ...

  9. window.onload和$(document).ready(function(){})的区别

    前段时间在面试之前查找并整理了一下window.onload和$(document).ready(function(){})区别,今天有时间更到我的博客上,由于本人资历尚浅,如有不对的地方,还请指正. ...

随机推荐

  1. jquery的live转on的办法

    <!DOCTYPE html> <html> <head> <script src="http://libs.baidu.com/jquery/1. ...

  2. java.io.EOFException

    错误代码如下: 严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException ...

  3. 浅析/dev/shm

    一,/dev/shm 概念 /dev/shm 是一个tmpfs文件系统,临时文件系统,是基于内存的文件系统,也就是说/dev/shm中的文件是直接写入内存的,而不占用硬盘空间. 在Centos和Red ...

  4. (转)Excel的 OleDb 连接串的格式(连接Excel 2003-2013)

    string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;data source=" + filePath + ";Exten ...

  5. Linux 线程管理

    解析1 LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数的执行过程比较难于理解. pthread_cond_wait()的工 ...

  6. Spring MVC重定向和转发及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  7. 【Mybatis架构】 延迟加载

    在上一篇博客中,我们提到过有关于Mybatis输出映射中resultMap能够实现延迟加载的事,然而真的是所有的resultMap都能实现延迟加载还是咋地啊?现在我们就来对那一句话做一下阐述和实例说明 ...

  8. 【转载】AB测试结果分析

    AB测试,200个请求,20个并发.这样的测试强度,CPU占了70-80%,w3p占用了70多M内存,本想多测几次,看看它的内存会不会涨上去,没 有测试机器没办法,开发机要干活.我估计CPU就有问题了 ...

  9. STDIN(0), STDOUT(1), STDERR(2), 2 > &1

    当我们在 shell 中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符(文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的文件是0,第二个是1 ...

  10. Mac锁屏

    http://www.dbform.com/html/2006/192.html 应用程序-实用工具-钥匙锁-菜单栏中的钥匙串访问-偏好设置-选中“在菜单栏中显示钥匙串”