1、区别数组
window.onload必须等到页面内包括图片的全部元素加载完毕后才能执行。dom
在Jquery中$(function(){ })和$(document).ready(function(){ })的效果是同样,是在DOM树加载完成以后(DOM树加载完不表明所有资源加载完,例如图片,音频和视频等还没加载)就会执行。因此$(document).ready(function(){ })是比window.onload要先执行的。那么JQuery中$(document).ready(function(){ })用原生js是怎么实现的呢?函数
2、实现spa
给document添加一个函数:3d
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 code
兼容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的源码(虽然大多看不懂,只能看个大概),我发现他是这样写的blog
红色框的部分说:做者尝试过用readyState == "interactive",可是形成了某些问题。事件
因此那就这样写吧,readyState == “complete”。
楼主能力有限,若有不正确的地方但愿指出
兼容Firefox和Chrome