JS原生方法实现jQuery的ready()

浏览器加载页面的顺序:

1、 解析HTML结构

2、 加载外部脚本和样式表文件

3、 解析并执行脚本代码

4、 构造HTML DOM模型==ready()

5、 加载图片等组件

6、 页面加载完毕==onload()

ready事件是在DOM模型构造完毕时触发

load事件是在页面加载完毕后触发

复制代码
  1. function ready(fn){
  2. if(document.addEventListener) {
  3. document.addEventListener('DOMContentLoaded', function() {
  4. //注销事件, 避免反复触发
  5. document.removeEventListener('DOMContentLoaded',arguments.callee, false);
  6. fn(); //执行函数
  7. }, false);
  8. }else if(document.attachEvent) { //IE
  9. document.attachEvent('onreadystatechange', function() {
  10. if(document.readyState == 'complete') {
  11. document.detachEvent('onreadystatechange', arguments.callee);
  12. fn(); //函数执行
  13. }
  14. });
  15. }
  16. };
复制代码

ready()加强版(自JavaScript权威指南)

复制代码
  1. /*
  2. * 传递函数给whenReady()
  3. * 当文档解析完毕且为操作准备就绪时,函数作为document的方法调用
  4. */
  5. var whenReady = (function() { //这个函数返回whenReady()函数
  6. var funcs = []; //当获得事件时,要运行的函数
  7. var ready = false; //当触发事件处理程序时,切换为true
  8. //当文档就绪时,调用事件处理程序
  9. function handler(e) {
  10. if(ready) return; //确保事件处理程序只完整运行一次
  11. //如果发生onreadystatechange事件,但其状态不是complete的话,那么文档尚未准备好
  12. if(e.type === 'onreadystatechange' && document.readyState !== 'complete') {
  13. return;
  14. }
  15. //运行所有注册函数
  16. //注意每次都要计算funcs.length
  17. //以防这些函数的调用可能会导致注册更多的函数
  18. for(var i=0; i<funcs.length; i++) {
  19. funcs[i].call(document);
  20. }
  21. //事件处理函数完整执行,切换ready状态, 并移除所有函数
  22. ready = true;
  23. funcs = null;
  24. }
  25. //为接收到的任何事件注册处理程序
  26. if(document.addEventListener) {
  27. document.addEventListener('DOMContentLoaded', handler, false);
  28. document.addEventListener('readystatechange', handler, false); //IE9+
  29. window.addEventListener('load', handler, false);
  30. }else if(document.attachEvent) {
  31. document.attachEvent('onreadystatechange', handler);
  32. window.attachEvent('onload', handler);
  33. }
  34. //返回whenReady()函数
  35. return function whenReady(fn) {
  36. if(ready) { fn.call(document); }
  37. else { funcs.push(fn); }
  38. }
  39. })();
  40.  
  41. //--------------------- test -----
  42. function t1() {
  43. console.log('t1');
  44. }
  45. function t2() {
  46. console.log('t2');
  47. }
  48.  
  49. // t2-t1-t2
  50. whenReady(t1);
  51. t2();
  52. whenReady(t2);
复制代码
posted @ 2014-08-23 11:03  Shimily  阅读(309)  评论(0)    收藏  举报