javascript onDOMReady 在DOM树载入后执行

(function(){
       var isReady=false;//判断onDOMReady方法是否已经被执行过
       var readyList= [];//把需要执行的方法先暂存在这个数组里
       var timer;//定时器句柄
       ready=function(fn) {
              if (isReady )
                     fn.call( document);
              else
                     readyList.push( function() { return fn.call(this);});
              return this;
       }
       var onDOMReady=function(){
              for(var i=0;i<readyList.length;i++){
                     readyList[i].apply(document);
              }
              readyList = null;
       }
       var bindReady = function(evt){
              if(isReady) return;
              isReady=true;
              onDOMReady.call(window);
              if(document.removeEventListener){
                     document.removeEventListener("DOMContentLoaded", bindReady, false);
              }else if(document.attachEvent){
                     document.detachEvent("onreadystatechange", bindReady);
                     if(window == window.top){
                            clearInterval(timer);
                            timer = null;
                     }
              }
       };
       if(document.addEventListener){
              document.addEventListener("DOMContentLoaded", bindReady, false);
       }else if(document.attachEvent){
              document.attachEvent("onreadystatechange", function(){
                     if((/loaded|complete/).test(document.readyState))
                            bindReady();
              });
              if(window == window.top){
                     timer = setInterval(function(){
                            try{
                                   isReady||document.documentElement.doScroll('left');//在IE下用能否执行doScroll判断dom是否加载完毕
                            }catch(e){
                                   return;
                            }
                            bindReady();
                     },5);
              }
       }
})();

  使用方式类下:
ready(navInit);//navInit为已存在的函数

  或:
ready(function(){
       if(agt.toLowerCase().indexOf("msie 6") != -1)
              navInitForIE6();//如果浏览器是IE6,则执行navInitForIE6函数来初始化下拉菜单
});

  说明:

  当我们想在页面加载之后执行某个函数,肯定会想到onload了。但onload在浏览器看来,就是页面上的东西(img、iframe等资源)全部都加载完毕后才能发生,如果页面内有大的图片的话,会在页面展现后好久时间后才执行。如果只需要对DOM进行操作,那么这时就没必要等到页面全部加载了。我们需要更快的方法。

  Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。

  MSDN关于JSCRIPT的一个方法有段不起眼的话,当页面DOM未加载完成时,调用doScroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了!

  这个函数Diego Perini在07年就发布了,方法名为IEContentLoaded,而且获得了广泛认同,以至于现在许多开源框架都是借鉴这种方法,譬如JQuery中的ready,在注释里有明确说明是有借鉴Diego Perini的IEContentLoaded方法。

  所以:对于Mozilla & Opera 浏览器,在DOM树载入后有现成的DOMContentLoaded事件;对于Safari浏览器,有document.onreadystatechange事件,当该事件触发时,如果document.readyState=complete时,可视为dom树已经载入;对于IE,当在iframe内时,同样有document.onreadystatechange事件;对于IE在非iframe内时,只有不断地通过能否执行doScroll判断dom是否加载完毕。在本例中每间隔5毫秒尝试去执行document.documentElement.doScroll('left')。

时间: 2024-09-13 09:05:23

javascript onDOMReady 在DOM树载入后执行的相关文章

javascript先序遍历DOM树的方法_javascript技巧

DOM树由文档中的所有节点(元素节点.文本节点.注释节点等)所构成的一个树结构,DOM树的解析和构建是浏览器要实现的关键功能.既然DOM树是一个树结构,那么我们就可以使用遍历树结构的相关方法来对DOM树进行遍历,同时DOM2中的"Traversal"模块又提供了两种新的类型,从而可以很方便地实现DOM树的先序遍历. 注:本文中的5种方法都是对DOM的先序遍历方法(深度优先遍历),并且只关注Element类型. 1. 使用DOM1中的基础接口,递归遍历DOM树 DOM1中为基础类型Nod

JavaScript实现当网页加载完成后执行指定函数的方法_javascript技巧

本文实例讲述了JavaScript实现当网页加载完成后执行指定函数的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码演示了如何在网页加载完成时调用指定的函数,并且可以通过第二段代码动态添加多个函数同时执行. 我们只需要给window.onload指定一个函数既可以在页面加载完成时自动执行MyCoolInitFunc函数 <script type="text/javascript" > window.onload = MyCoolInitFunc </scri

浅析javascript中的DOM

本文主要给大家简单介绍了是什么是DOM.动态操作DOM元素的方法.使用jsjs操作样式以及Form对象的简介,是个人对于javascript中的DOM的理解的总结,推荐给小伙伴们. 什么是Dom? 1.简介 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.Document Object Model的历史可以追溯至1990年代后期微软与Netscape的"浏览器大战",双方为了在JavaScript与JScrip

JavaScript高级程序设计 DOM学习笔记_javascript技巧

第十章 DOM DOM是针对XML和HTML文档的一个API:即规定了实现文本节点操控的属性.方法,具体实现由各自浏览器实现. 1. 节点层次 1) 文档节点:document,每个文档的根节点. 2) 文档元素:即<html>元素,文档最外层元素,文档节点第一个子节点. 3) Node类型: ①Node是DOM中各种节点类型的基类型,共享相同的基本属性和方法. □ Node.Element_NODE(1); □ Node.ATTRIBUTE_NODE(2); □ Node.TEXT_NODE

DOM树节点解析

DOM是解析XML文件的官方标准,它与平台和语言无关.DOM解析将整个XML文件载入并组装成一棵DOM节点树,然后通过遍历.查找节点以读取XML文件中定义的数据.由于DOM解析中把所有节点都载入到内存中,因而它比较耗资源,而且它需要把整棵节点树构建完成后开始读取数据,因而它相对性能也不好:不过由于它在内存中保存了DOM节点树,因而它可以多次读取,并且它的节点树定义比较容易理解,因而操作起来比较简单.关于性能,有人对一些常用的解析方法做了比较: 单位:s(秒)转自:http://www.cnblo

javascript系列之DOM(一)

原文:javascript系列之DOM(一)      DOM(document object moudle),文档对象模型.它是一个中立于语言的应用程序接口(API),允许程序访问并修改文档的结构,内容和样式.也就是一切语言(js,php 等)对web的操作是建立在DOM的基础之上的.行为的发生,首先必须获取文档中的一个对象作为其载体. DOM发展史      在漫长的互联网发展史上DOM一共经历了四个阶段.当前,我们正处在DOM 3阶段. DOM 0 :不是W3C规范,只是Netscape

Javascript实例教程:DOM方法创建和修改表格

文章简介:Javascript实例教程:DOM方法创建和修改表格. <table>元素是HTML中最复杂的结构之一.要想创建表格,一般都必须涉及表示表格行.单元格.表头等方面的标签.由于涉及的标签多,因而使用核心DOM方法创建和修改表格往往都免不了要编写大量的代码.假设我们要使用DOM来创建下面的HTML表格: <table border="1" width="100%"> <tbody> <tr> <td>

如何让页面加载完成后执行js

javascript 当页面dom模型加载完成后才执行javascript不能使用<body onload="">加上 defer 等于在页面完全在入后再执行,相当于 window.onload ,但应用上比 window.onload 更灵活 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/x

从Chrome源码看浏览器如何构建DOM树

这几天下了Chrome的源码,安装了一个debug版的Chromium研究了一下,虽然很多地方都一知半解,但是还是有一点收获,将在这篇文章介绍DOM树是如何构建的,看了本文应该可以回答以下问题: IE用的是Trident内核,Safari用的是Webkit,Chrome用的是Blink,到底什么是内核,它们的区别是什么? 如果没有声明<!DOCTYPE html>会造成什么影响? 浏览器如何处理自定义的标签,如写一个<data></data>? 查DOM的过程是怎么样的