处理HTML DOM文档存在一个难题是,JavaScript可以在DOM完全加载之前执行,这会给你的代码引发不少的潜在问题。浏览器的渲染和操作顺序大致如下列表:

  • HTML解析完毕
  • 外部脚本和样式表加载完毕
  • 脚本在文档内解析并执行
  • HTML DOM完全构造起来
  • 图片和外部内容加载
  • 网页完成加载

在网页头部并且从外部文件加载的脚本会在HTML真正构造之前执行。如前所述,这是个至关重要的问题,因为这两处执行的脚本并不能访问还不存在的DOM。幸好,我们还有若干的补救方法。

目前,最常用的级数是完全等待整个页面加载完毕才执行DOM操作。这种技术只需利用window对象的load事件来绑定一个函数,页面加载完毕即可触发。

addEvent(window, "load", function(){// do something
});

最简单的操作却是最慢的。在加载过程的顺序列表中,你会注意到页面的加载完毕与否完全被最后一步所掌控。这就是说,如果页面有很多的图片、视频等,用户可能得登上一段时间JavaScript才执行。

另一种级数可用以监听 DOM 加载状态,可能是最复杂的(从实现角度来看),但也是最有效地。

这项技术在不堵塞浏览器加载的情况下尽可能快地检查 HTML DOM文档是否已经加载了执行所必须得属性。以下是检查HTML DOM是否可用的几个要点:

  1. document: 你需要知道DOM文档是否已经加载。若能足够快地检查,运气好的话你会看到undefined。
  2. document.getElementsByTagName和document.getElementById:频繁使用document.getElementsByTagName和document.getElementById函数检查文档,当存在这些函数则表明DOM已经加载完毕。
  3. document.body: 作为额外补充,检查元素是否已经完全加载。理论上前一个检查应该已经能做出判断,但我发现有些情况下还是不够。

使用这些检查就足够判断DOM是否可用了(“足够”在此表示可能会有一定毫秒级的时间差)。这个方法几乎没有瑕疵。单独使用前述检查,脚本应该可以在现代浏览器中运行得相对良好。但是,最近(2008年?)Firefox实现了缓存改进,使得window加载事件实际上可以在脚本能检查到DOM是否可用之前触发。为了能发挥这个优势,我同时为window加载事件附加检查,以期能获得更快的执行速度。

最后,domReady函数集合了所有需要在DOM可用时就执行的函数的引用。一旦DOM被认为是可用的,就调用这些引用并按顺序一一执行。

// 监听 DOM 是否可用的函数
function domReady(f) {// 假如DOM已经加载,马山执行函数if(domReady.done) return f();// 假如我们已经增加了一个函数if(domReady.timer) {// 把它假如待执行函数清单中
        domReady.ready.push(f);} else {// 为页面加载完毕绑定一个事件,以防它最先完成。addEvent(window, "load", isDOMReady);// 初始化执行函数的数组domReady.ready = [f];// 尽可能快的检查DOM是否已可用domReady.timer = setInterval(isDOMReady, 13);}
}// 检查 DOM 是否已可操作
function isDOMReady() {// 如果我们能判断出DOM已可能,忽略if(domReady.done) return false;// 检查若干函数和元素是否可能if(document && document.getElementsByTagName && document.getElementById && document.body) {// 如果可用,我们停止检查
        clearInterval(domReady.timer);domReady.timer = null;// 执行所有正在等待的函数for(var i = 0; i < domReady.ready.length; i++) {domReady.ready[i]();// 记录我们在此已经完成domReady.ready = null;domReady.done = true;}}
}

现在我们来看看在HTML文档中是如何执行的。假设已经将domReady函数写到一个名为domready.js的外部文件中

<html><head><title> Testing DOM Loading</title><script src="domready.js"></script><script>domReady(function(){alert("The DOM is loaded!");// do something
            });</script></head><body><h1>Testing DOM Loading</h1><!-- 这里是大量的HTML --></body>
</html>

JavaScript 判断 DOM 何时加载完毕相关推荐

  1. js 判断iframe是否加载完毕

    js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = funct ...

  2. 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器

    JS判断SWF,JPG加载完毕.兼容(Activex,plugIn)所有浏览器 这里主要说下监听SWF的加载. 网上流传已久的监听方法,只能在IE(Activex插件下)下实现.在使用plugin的浏 ...

  3. SpringMVC--Ajax异步加载数据$(function (){ 逻辑代码}) 的意思是让dom结构加载完毕后再去执行逻辑代码

    1. SpringMVC–Ajax异步加载数据 1.1 实体类user User.java package com.tian.pojo;import lombok.AllArgsConstructor ...

  4. openlayer判断瓦片全部加载完毕

    一.问题产生 在openlayer开发的过程中,涉及到缩略图的生成.当地图上的所有图层全部加载完毕时,执行生成缩略图业务代码. 二.问题解决 寻找源码,找到如下解决方案: 1 判断地图全部瓦片加载完毕 ...

  5. JavaScript判断图片是否加载完成的三种方式

    一.load事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE HTML> <html> <head>    ...

  6. 页面状态javascript 判断 iframe是否加载成功

    这段时间一直在学习页面状态之类的问题,现在正好有机会和大家分享一下. 最近在做产品的维护,修改一些老的bug.有个bug是jsp页面在加载的时候请求一个iframe.在页面显示的过程当中,窗口会长久的 ...

  7. html 判断页面加载完成,Javascript判断页面是否加载完成

    很多时候我们在使用document.getElementById的时候直接在script标签中获取对象,然后使用,此时程序会出现该对象为undefined. var dom=document.getE ...

  8. javascript判断图片是否加载完成方法整理

    有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果.本文主要整理了几种常见的javascipt判断图片加载 ...

  9. selenium web自动化判断页面元素加载完毕

    主要方便以后用到时查阅,侵删! 三种等待方法: 1.强制等待sleep(xx) 强制等待,不管你浏览器是否加载完了,程序都得等待,时间一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样 ...

最新文章

  1. 最聪明女生集结清华,挑战人工智能
  2. Dottext.Web.UI.Handlers.BlogExistingPageHandler
  3. 区块链中的密码学,使用ABE结合区块链
  4. 20世纪物理学巨人、诺奖得主菲利普安德森逝世,享年96岁
  5. 服务器Context、虚拟主机配置(管理、配置)
  6. python——pandas库之Series数据结构基础
  7. 大访问量网站缓存的一点思考,个人看法,勿拍砖
  8. 最小公倍数与最大公约数的研究
  9. parseInt() 函数 转载
  10. Visual Basic 6.0(VB6.0)最详细安装教程
  11. html表单鼠标悬停变色,当我将鼠标悬停在html表格中时,更改单元格中颜色的颜色...
  12. 学生图书馆系统mysql数据库设计
  13. 完全删除iCloud注册的Apple ID
  14. 超有用:记一次Yapi上传报错及其处理方式
  15. CTF 实验吧 变异凯撒 writeup
  16. 使用Aircrack-ng工具破解WEP、WPA/WPA2加密的无线网络
  17. (SWAT-4)SWAT中水文响应单元划分(HRU)分析
  18. Clion~Clion常用配置和插件
  19. Abp mysql guid_使用ABP框架踩过的坑系列5
  20. Go语言中的次方表示

热门文章

  1. 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
  2. 我的 Serverless 实战 — 云函数与触发器的创建与使用 ( 开通腾讯云 “ 云开发 “ 服务 | 创建云函数 | 创建触发器 | 测试触发器 )
  3. ls -Slh du -h
  4. java rmi 使用方法
  5. [LeetCode]Add Binary
  6. ACdream OJ 1140 Counting Triangles
  7. DataTable 的 JSON 序列化
  8. ROS Gazebo(一):安装与使用
  9. [二分查找] 一:子区间界限应当如何确定
  10. Java SPI机制分析