陈童的博客's Archivers

From everyinch on 2013-11-28 08:12:12

DOM — 等待HTML DOM 的加载

处理HTML DOM文档存在的一个的难题是,JavaScript可以在DOM完全加载之前执行,这会带来很多的潜在问题。浏览器的渲染和操作顺序大致如下:
浏览器的渲染和操作顺序:
HTML解析完毕
外部脚本和样式表加载完毕
脚本在文档内解析并执行
HTML DOM完全构造出来
图片和外部内容加载
网页完成加载
在网页头部或者从外部文件加载的脚本会在HTML真正构造之前执行,导致脚本还不能访问还不存在的DOM。

1. 等待整个页面的加载
最常用的技术是完全等待整个页面加载完毕之后才执行DOM操作。这种技术在window对象的load事件上绑定一个函数,页面加载完毕后触发该函数。
[code lang="js"]
// 等到页面加载完毕
addEvent(window, "load", function() {
// 执行 HTML DOM 操作
next( id("everywhere") ).style.background = 'blue';
});
[/code]

2. 等待大部分DOM的加载
因为只有在DOM构造后,执行到该位置的脚本才真正执行。这意味着中途嵌入的脚本只能访问该位置之前的DOM。所以页面最后元素之前嵌入脚本,就可以在DOM中访问这个元素之前全部的脚本。

[code lang="html"]


Testing DOM Loading

function init() {
alert( "The DOM is loaded!" );
tag("h1")[0].style.border = "4px solid black";
}



Testing DOM Loading

init();


[/code]

3. 判断DOM何时加载完毕
在不堵塞浏览器加载的情况下尽可能快地检查HTML DOM文档是否已经加载了执行所必需的属性。这些检查包括:
(1)document: 判断DOM文档是否已经加载
(2)document.getElementsByTagName 和 document.getElementById: 当存在这些函数则表明已完成加载
(3)document.body: 作为额外补充
执行以上的检查,脚本应该可以在现代浏览器中运行得相对良好。下面的 domReady 函数集合了这些检查。一旦DOM被认为是可用的,就调用这些引用并按顺序执行。

[code lang="js"]
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;
}
}
[/code]

假设已经将 domReady 函数写到一个名为 domready.js 的外部文件中,则它的使用是:

[code lang="html"]


Testing DOM Loading


domReady(function() {
alert( "The DOM is loaded!" );
tag("h1")[0].style.border = "4px solid black";
});



Testing DOM Loading



[/code]

查看完整版本: DOM — 等待HTML DOM 的加载

Tags:


©陈童的博客