DOM何时Ready
由于script标签在被加载完成后会立即执行其中代码,如果在代码中要访问HTMLElement,可是这时候元素还没有加载进来,所以对元素的操作统统无效。
最早的时候使用window.onload = function(){...},使得代码在页面完全加载完成后执行,这种方法对于页面资源很小的情况下是没问题的。弊端在于有时候页面中回加载一些比较费时的img、flash等资源,这种情况下浏览器会一直等待这些资源加载完成后再执行js代码。而浏览器中有DOM树跟Render树的区分,我们当然希望DOM树生成后便可以执行js代码,而不需要一定等待Render树完成后采取执行。
HTML5中加入了DOMContentLoaded事件,该事件在DOM树加载完成后便会触发(实际上大多数浏览器通常在样式资源加载完成后才会触发该事件,这个时候DOM可能早就加载完成了)。
对于不支持DOMContentLoaded事件的浏览器,我们通过监听document的onreadystatechange事件来判断DOM加载情况。从理论上来说,document有一属性名唤readyState,在页面加载过程中该属性的值会经过三次变化:loading(加载阶段)、interactive(DOM解析完成)、complete(完全加载完成,相当于onload)。但是浏览器的有时候并不会依次经过这三次变化。
在IE中有某些DOM方法,必须在DOM加载完成后方可调用(注意是调用,不是访问),一般情况下通过轮询调用doScroll方法来检测,当调用成功时表明DOM已加载完成。但需要注意的是,当页面中有iframe元素时,会等到iframe完全渲染结束后,调用才可成功,这时候于调用onload方法没什么区别。还有一点,在IE中,document.body必须在DOM解析完成后才可以访问body元素,而FF中即使DOM没有加载完成也可访问,这一点经常在IE中被用作判断DOM加载完成时的一个依据。
下面是参考资料后,自己写的一个domready方法:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!--The viewport meta tag is used to improve the presentation and behavior of the samples
on iOS devices-->
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
<title>MyDomReady</title> <script type="text/javascript">
window.myDOMReady = function(callback){
myDOMReady.isReady = false; var isBindReady = false;
if (typeof callback === "function"){
myDOMReady.readyCallback = callback;
}else{
myDOMReady.readyCallback = function(){};
} bindReady(); function onReady(){
console.log("onReady Function");
if (!myDOMReady.isReady){
if (!document.body){
setTimeout(onReady, 4);
return;
}
myDOMReady.isReady = true;
console.log('ready');
myDOMReady.readyCallback();
}
}; function domReady(){
if (document.addEventListener){
console.log('DOMContentLoaded');
}else if (document.attachEvent){
console.log("onreadystatechange ", document.readyState);
}
onReady();
} function bindReady(){
if (isBindReady){
return;
}
isBindReady = true; if (document.addEventListener){
document.addEventListener('DOMContentLoaded', domReady, false);
}else if (document.attachEvent){
document.attachEvent('onreadystatechange', domReady); var hasDoScroll = !!document.documentElement.doScroll,
noFrame = window.frameElement === null;
if (hasDoScroll && noFrame){
checkDoScroll();
}
}
window.onload = function(){
console.log('onloaded');
onReady();
};
}; function checkDoScroll(){
if (myDOMReady.isReady){
return;
}
try{
document.documentElement.doScroll('left');
}catch(err){
setTimeout(checkDoScroll, 4);
return;
}
console.log('checked');
onReady();
};
};
</script>
<script type="text/javascript">
myDOMReady(function(){
var map = document.getElementById('map');
if (map){
alert('Yes');
}else{
alert('No!');
}
});
var map2 = document.getElementById('map');
if (map2){
alert('Yes');
}else{
alert('No!');
}
</script>
</head> <body class="claro">
<input id="ipt" type="file" accept="image/png" >
<div data-dojo-type="dijit/layout/BorderContainer"
data-dojo-props="design:'headline', gutters:false"
style="width:100%;height:100%;margin:0;"> <div id="map"
data-dojo-type="dijit/layout/ContentPane"
data-dojo-props="region:'center'"
style="padding:0;"> <div style="position:absolute; right:20px; top:10px; z-Index:999;">
<div data-dojo-type="dijit/TitlePane"
data-dojo-props="title:'Switch Basemap', closable:false, open:false">
<div data-dojo-type="dijit/layout/ContentPane" style="width:380px; height:280px; overflow:auto;">
<div id="basemapGallery" ></div></div>
</div>
</div> </div>
</div>
</body> </html>
以下为chrome、FF、IE9和IE7、8中的测试结果
本人能力有限,其中有不足的地方欢迎各位道友不吝指正
DOM何时Ready的更多相关文章
- DOM加载过程中ready和load的区别
在浏览器地址栏输入URL地址,浏览器开始加载页面时,有以下几个过程 1.浏览器开始解析HTML文档 2. 浏览器遇到HTML文档中的<script>元素以及CSS样式文件,并且没有asyn ...
- jquery的ready方法(DOM是否加载完)详解与使用
jquery的ready方法(准备DOM触发)还是比较复杂的,我们先看流程图:
- jQuery实现DOM加载方法源码分析
传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... } 但 ...
- (转载)jQuery 1.6 源码学习(二)——core.js[2]之extend&ready方法
上次分析了extend方法的实现,而紧接着extend方法后面调用了jQuery.extend()方法(core.js 359行),今天来看看究竟core.js里为jQuery对象扩展了哪些静态方法. ...
- DOJO DOM 功能
In this tutorial, you'll learn about how to use Dojo to manipulate the DOM in a simple, cross-browse ...
- jQuery的document ready与 onload事件——你真的思考过吗?
在进行实验和资料查询时,我遇到了几个关键问题: 1. window.onload到底是什么加载完触发? 2. body为什么会有onload事件? 3. 为什么是window.onload,而不是do ...
- $(document).ready vs $(window).load vs window.onload
原文地址: $(document).ready vs $(window).load vs window.onload $(document).ready We execute our code whe ...
- jquery ready 延迟
$.holdReady(true);//延迟 $.holdReady(false);//解延迟 用于下载文件的时候,异步操作 $.holdReady(true); $.getScript(" ...
- $( document ).ready()&$(window).load()
$( document ).ready() https://learn.jquery.com/using-jquery-core/document-ready/ A page can't be man ...
随机推荐
- 如何优化sql语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
- 开始研究tigase和android客户端的实现
2015.7.5. 昨晚总算把tigaase7.0的开发环境搭起来了.稍微看了下代码结构. 主要是auth,db,compnent,cluster,server,xmpp,这几块,准备先发点时间看看开 ...
- [Linux] mail 命令,进入邮箱及删除邮件
1. 命令行输入mail 2. 删除邮件 d 删除当前邮件,指针下移: d 1 删除标号为1的邮件: d 2-4 删除标号2到4的邮件: 3. 保存 q 退出mail命令平台,保存之前的操作,比如删除 ...
- 一个程序员眼中的好UI
最近接到一个项目发来的UI设计图,我觉得她给的材料很专业,特此分享. 发的RAR压缩包里面有一个images目录,里面放的都是切片好的图片. 图片切片基本上都是靠近边线切的,边上留的空白很少,这样切的 ...
- java学习教程
java依然是目前比较流行的语言.虽然,本人是C#开发者,但是由于公司决定使用java开发,所以只好开始学习java.在学校时候只是接触过没有过深的学习过,而且参加工作后基本也一直在搞C#.好在,现在 ...
- appcan切换帐号无法提交SVN
C:\Documents and Settings\Administrator\Application Data\Subversion\auth\svn.simple
- easy ui 零散技巧
1.Jquery带上下文查找: 格式:$(selector,context) 例如:$("input",window.document),查找当前文档下的说有input元素,也等价 ...
- Spark如何使用Akka实现进程、节点通信的简明介绍
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- Ado.net中简单的DBHelper类(增删改查)
private static string connString = "server=.;database=hotel;uid=aa;pwd=123";//最好从配置文件中取出 p ...
- seaJS 简单例子,理解seaJS
学习心得: 记得第一次学underscore的时候,去的官网(不管什么都是官网好),呼啦一长列语法,我就一个个看,看完也不知道underscore是做什么的.就是现在underscore我也用不上,学 ...