JavaScript 判断 DOM 何时加载完毕
处理HTML DOM文档存在一个难题是,JavaScript可以在DOM完全加载之前执行,这会给你的代码引发不少的潜在问题。浏览器的渲染和操作顺序大致如下列表:
- HTML解析完毕
- 外部脚本和样式表加载完毕
- 脚本在文档内解析并执行
- HTML DOM完全构造起来
- 图片和外部内容加载
- 网页完成加载
在网页头部并且从外部文件加载的脚本会在HTML真正构造之前执行。如前所述,这是个至关重要的问题,因为这两处执行的脚本并不能访问还不存在的DOM。幸好,我们还有若干的补救方法。
目前,最常用的级数是完全等待整个页面加载完毕才执行DOM操作。这种技术只需利用window对象的load事件来绑定一个函数,页面加载完毕即可触发。
addEvent(window, "load", function(){// do something });
最简单的操作却是最慢的。在加载过程的顺序列表中,你会注意到页面的加载完毕与否完全被最后一步所掌控。这就是说,如果页面有很多的图片、视频等,用户可能得登上一段时间JavaScript才执行。
另一种级数可用以监听 DOM 加载状态,可能是最复杂的(从实现角度来看),但也是最有效地。
这项技术在不堵塞浏览器加载的情况下尽可能快地检查 HTML DOM文档是否已经加载了执行所必须得属性。以下是检查HTML DOM是否可用的几个要点:
- document: 你需要知道DOM文档是否已经加载。若能足够快地检查,运气好的话你会看到undefined。
- document.getElementsByTagName和document.getElementById:频繁使用document.getElementsByTagName和document.getElementById函数检查文档,当存在这些函数则表明DOM已经加载完毕。
- 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 何时加载完毕相关推荐
- js 判断iframe是否加载完毕
js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = funct ...
- 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器
JS判断SWF,JPG加载完毕.兼容(Activex,plugIn)所有浏览器 这里主要说下监听SWF的加载. 网上流传已久的监听方法,只能在IE(Activex插件下)下实现.在使用plugin的浏 ...
- SpringMVC--Ajax异步加载数据$(function (){ 逻辑代码}) 的意思是让dom结构加载完毕后再去执行逻辑代码
1. SpringMVC–Ajax异步加载数据 1.1 实体类user User.java package com.tian.pojo;import lombok.AllArgsConstructor ...
- openlayer判断瓦片全部加载完毕
一.问题产生 在openlayer开发的过程中,涉及到缩略图的生成.当地图上的所有图层全部加载完毕时,执行生成缩略图业务代码. 二.问题解决 寻找源码,找到如下解决方案: 1 判断地图全部瓦片加载完毕 ...
- JavaScript判断图片是否加载完成的三种方式
一.load事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE HTML> <html> <head> ...
- 页面状态javascript 判断 iframe是否加载成功
这段时间一直在学习页面状态之类的问题,现在正好有机会和大家分享一下. 最近在做产品的维护,修改一些老的bug.有个bug是jsp页面在加载的时候请求一个iframe.在页面显示的过程当中,窗口会长久的 ...
- html 判断页面加载完成,Javascript判断页面是否加载完成
很多时候我们在使用document.getElementById的时候直接在script标签中获取对象,然后使用,此时程序会出现该对象为undefined. var dom=document.getE ...
- javascript判断图片是否加载完成方法整理
有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果.本文主要整理了几种常见的javascipt判断图片加载 ...
- selenium web自动化判断页面元素加载完毕
主要方便以后用到时查阅,侵删! 三种等待方法: 1.强制等待sleep(xx) 强制等待,不管你浏览器是否加载完了,程序都得等待,时间一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样 ...
最新文章
- 最聪明女生集结清华,挑战人工智能
- Dottext.Web.UI.Handlers.BlogExistingPageHandler
- 区块链中的密码学,使用ABE结合区块链
- 20世纪物理学巨人、诺奖得主菲利普安德森逝世,享年96岁
- 服务器Context、虚拟主机配置(管理、配置)
- python——pandas库之Series数据结构基础
- 大访问量网站缓存的一点思考,个人看法,勿拍砖
- 最小公倍数与最大公约数的研究
- parseInt() 函数 转载
- Visual Basic 6.0(VB6.0)最详细安装教程
- html表单鼠标悬停变色,当我将鼠标悬停在html表格中时,更改单元格中颜色的颜色...
- 学生图书馆系统mysql数据库设计
- 完全删除iCloud注册的Apple ID
- 超有用:记一次Yapi上传报错及其处理方式
- CTF 实验吧 变异凯撒 writeup
- 使用Aircrack-ng工具破解WEP、WPA/WPA2加密的无线网络
- (SWAT-4)SWAT中水文响应单元划分(HRU)分析
- Clion~Clion常用配置和插件
- Abp mysql guid_使用ABP框架踩过的坑系列5
- Go语言中的次方表示
热门文章
- 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )
- 我的 Serverless 实战 — 云函数与触发器的创建与使用 ( 开通腾讯云 “ 云开发 “ 服务 | 创建云函数 | 创建触发器 | 测试触发器 )
- ls -Slh du -h
- java rmi 使用方法
- [LeetCode]Add Binary
- ACdream OJ 1140 Counting Triangles
- DataTable 的 JSON 序列化
- ROS Gazebo(一):安装与使用
- [二分查找] 一:子区间界限应当如何确定
- Java SPI机制分析