ie421.NET

面对技术,你别无选择,.NET世界是如此精彩,而我们要做的就是:Thinking More

博客园 首页 新随笔 联系 订阅 管理
load事件可以安全的执行JS,因为该事件是在页面完全加载完后才开始执行(包括页面内的图片、flash等所有元素),不会因为JS需要对某个DOM操作,而页面还没有加载该节点而引起错误。但是这种安全是需要付出代价的:如果某些图片(或者一些别的东西)加载特别慢,那么load事件会等到很久之后才会触发。

针对这个问题,一些JS框架提供了一些补充方法。如:jquery的$(document).ready()、mootools的domready事件。都是在页面的DOM加载完毕后立即执行,而不需要等待漫长的图片下载过程。

如果不使用这些框架,怎样实现自己的 document ready呢?请看以下一段代码:
Javascript代码
  1.   
  2. function __clear(timer){   
  3.     clearTimeout(timer);   
  4.     clearInterval(timer);   
  5.     return null;   
  6. };   
  7.   
  8. function __attach_event(evt, callback) {   
  9.     if (window.addEventListener) {   
  10.         window.addEventListener(evt, callback, false);    
  11.     } else if (window.attachEvent) {   
  12.         window.attachEvent("on" + evt, callback);   
  13.     }   
  14. }   
  15.   
  16. function __domReady(f) {   
  17.     // 假如 DOM 已经加载,马上执行函数   
  18.     if (__domReady.done) return f();   
  19.     // 假如我们已经增加了一个函数   
  20.     if (__domReady.timer) {   
  21.         // 把它加入待执行函数清单中   
  22.         __domReady.ready.push(f);   
  23.     } else {   
  24.         // 为页面加载完毕绑定一个事件,   
  25.         // 以防它最先完成。使用addEvent(该函数见下一章)。   
  26.         __attach_event("load", __isDOMReady);   
  27.         // 初始化待执行函数的数组   
  28.         __domReady.ready = [f];   
  29.         // 尽可能快地检查DOM是否已可用   
  30.         __domReady.timer = setInterval(__isDOMReady, 100);   
  31.     }   
  32. }   
  33. function __isDOMReady() {   
  34.     // 如果我们能判断出DOM已可用,忽略   
  35.     if (__domReady.done) return false;   
  36.     // 检查若干函数和元素是否可用   
  37.     if (document && document.getElementsByTagName && document.getElementById && document.body) {   
  38.         // 如果可用,我们可以停止检查   
  39.         __clear(__domReady.timer);   
  40.         __domReady.timer = null;   
  41.         // 执行所有正等待的函数   
  42.         for ( var i = 0; i < __domReady.ready.length; i++ ) {   
  43.             __domReady.ready[i]();   
  44.         }   
  45.         // 记录我们在此已经完成   
  46.         __domReady.ready = null;   
  47.         __domReady.done = true;   
  48.     }   
  49. }  


具体的调用方法:

Javascript代码 复制代码
  1. __domReady(function() {   
  2.     alert("The dom is loaded!");   
  3. });  
posted on 2008-08-11 09:53  ie421  阅读(420)  评论(0编辑  收藏  举报