window.onload和JQuery中$(function(){})的区别即其实现原理

一、区别

window.onload是在DOM树加载完成之后(DOM树加载完不代表全部资源加载完,例如图片,音频和视频等还没加载)执行的。

在Jquery中$(function(){ })和$(document).ready(function(){ })的效果是一样,是在DOM树加载完成之后就会执行。所以$(document).ready(function(){ })是比window.onload要先执行的。那么JQuery中$(document).ready(function(){ })用原生js是怎么实现的呢?

二、实现

给document添加一个函数:

document.ready = function (callback) {
//兼容Firefox和Chrome
  if (document.addEventListener) {
    document.addEventListener(‘DOMContentListener‘, function () {
    document.removeEventListener(‘DOMContentListener‘, arguments.callee, false);
    callback();
  },false);
  }else if (document.attachEvent) {//兼容IE
        document.attachEvent(‘onreadystatechange‘, function () {
        if (document.readyState == ‘complete‘) {
        document.detachEvent(‘onreadystatechange‘, arguments.calle);
        callback();
  }
});
}else if (document.lastChild == document.body) {
       callback();
      }
}

(1)兼容Firefox和Chrome 

  兼容Firefox和Chrome,给document加一个事件监听,监听DOMContentListener事件,它是当初始的HTML文档被完全加载和解析后触发的事件,也就是dom树加载完后触发的事件。事件触发后移除监听执行callback函数。这里的arguments是函数内部的对象,代表当前函数参数的数组,arguments.callee表示引用当前正在执行的函数。addEventListener/removeEventListener的第三个参数默认为false,false表示在事件冒泡阶段处理事件处理程序,true表示在事件捕获阶段处理。

(2)兼容IE

  兼容IE,onreadystatechange在DOM文档的readyState发生改变是触发的,readyState有五种状态,“complete”:全部资源加载完;“uninitialized”:初始状态;“loading”:资源加载中;“loaded”:document加载完成;“interactive”:已加载并可与用户交互,但还需要加载图片等其他资源。看到这里是不是有个疑惑,在代码中我们写的是if(document.readyState == "complete")然后执行callback,这不是在资源加载完后(包括图片等)后才执行callback吗?我们要实现的功能不是应该readyState == “interactive”时,即DOM树加载完成后执行callback的吗?这里我也很疑惑,然后就翻看JQuery的源码(虽然大多看不懂,只能看个大概),我发现他是这样写的

红色框的部分说:作者尝试过用readyState == "interactive",但是造成了某些问题。

所以那就这样写吧,readyState == “complete”。

楼主能力有限,如有不正确的地方希望指出

兼容Firefox和Chrome

原文地址:https://www.cnblogs.com/chen-cong/p/8119642.html

时间: 2024-12-19 13:55:35

window.onload和JQuery中$(function(){})的区别即其实现原理的相关文章

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

原文出自:http://www.php100.com/html/program/jquery/2013/0905/5954.html 1.执行时间上的区别:window.onload必须等到页面内(包括图片的)所有元素加载到浏览器中后才能执行.而$(document).ready(function(){})是DOM结构加载完毕后就会执行. 2.编写个数不同:window.onload不能同时写多个,如果有多个window.onload,则只有最后一个会执行,它会把前面的都覆盖掉.$(docume

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

这篇作为我的新的起点开始吧,发现年纪大了,记性就不好了,有些东西老是记了忘,忘了百度.在学一些新知识的时候也是这样的毛病,总是重复学习,这样效率真心差!所以决定开始认真写博客! 本来想封装一个预加载的插件的,在开始写时,才发现自己很多不足.百度上看见这个题目,发现自己不会,所以记下! window.onload    与     jq的 $(document).ready() window.onload 是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源),执行一个

js中window.onload 与 jquery中$(document.ready()) 测试

js中window.onload 与 jquery中$(document.ready())区别,验证代码如下(调换js代码和Jquer代码书写顺序测试,运行结果一样,因此与代码书写位置没关系): <html> <head> <script type='text/javascript' src='jquery-1.11.1.min.js'></script> <script type='text/javascript'> $(document).r

JS中的onload与jQuery中的ready区别

jQuery的执行机制(onload与ready的区别) 结论得出前自行测试: 为了测试是否真如所说的那样,所以在页面插入了20000张照片,照片数量少得不出什么结论,所以改用console.log()来测试,这样一来我可以很好的看出在页面最底端有没有都加载出来,还有是打印出的结果的事件顺序. 所用到的JS代码是: console.time('name'); window.onload = function() { console.log('onload2'); console.timeEnd(

js中window.onload与jquery中$(document.ready())的区别

$(document).ready()是在DOM结构载入完后执行的,而window.onload是得在所有文件都加载完后执行的,注意区别,一个是DOM加载完,一个是所有文件加载完 耳听为虚,眼见为实.通过下面的实例可查看两者的异同(注意:aa.jpg最好是一张大容量图片) <html> <head> <script type='text/javascript' src='jquery-1.3.2.min.js'></script> <script ty

window.onload和$(doucument).read( )区别

执行时机: window.onload : 必须等待页面所有内容加载完毕之后(包括图片)才能执行 $(document).ready( ) : 网页中所有DOM结构绘制完毕后就执行,可能DOM元素关联的东西并没有加载完 编写个数 : window.onload : 不能同时编写多个,只能有一个window.onload方法 window.onload = function(){ alert("test"): } $(document).ready( ) : 能同时编写多个 $(docu

window.onload、DOMContentLoaded和$(document).ready()

window.onload.DOMContentLoaded和$(document).ready() <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <scr

window.onload 添加多个函数绑定

window.onload = function(){alert(2)} function addEvent (fun) { var old = window.onload; if(typeof old != "function"){ window.onload = fun; }else{ window.onload = function(){ old(); fun(); } } } function delegationforli(){ var oul = document.getE

jQuery中$(documnet).ready(function(){})与window.onload=function(){}区别

1.执行时间区别: $(document).ready(function(){})简写为$(function(){}),在页面框架加载完成之后执行.  window.onload=function(){}是在页面全部加载完成之后执行(包括图片). 2.执行数量区别: $(document).ready(function(){})可以执行多次. window.onload=function(){}多个执行时只执行最后一个.