今天查看百度空间源代码,发现多了个util.js文件,打开看看。里面里面定义了addDOMLoadEvent。这是干什么用的?
仔细查看代码,发现在Mozilla添加了DOMContentLoaded事件,这个在以前一直没有用过。 if (document.addEventListener)
document.addEventListener("DOMContentLoaded", init, false);
好久就是为了兼容实现DOMContentLoaded事件。
网上找了点有关DOMContentLoaded的资料拿来看看。
DOMContentLoaded是firefox下特有的Event, 当所有DOM解析完以后会触发这个事件。
与DOM中的onLoad事件与其相近。但onload要等到所有页面元素加载完成才会触发, 包括页面上的图片等等。
如果页面的图片很多的话, 从用户访问到onload触发可能需要较长的时间, 而在Ajax运用中,
常常需要在onload中加入许多初始化的动作, 如果由于网络问题引起的图片加载过慢( 见: Ajax优化(2) -- lazierLoad
img && js), 则必然影响用户的体验。
在这种情况下firefox的DOMContentLoaded事件, 恰恰是我们需要的。
目前,跨平台的DOMContentLoaded的解决方案有很多, 比如jQuery, Prototype...等等, 其实现原理大同小异.
在项目中, 我使用了Prototype工具, 以往调用初始化的方法是:
Event.observe(window, "load", init);
现在有了DOMContentLoaded, 可以替换成如下的方法:
document.observe('contentloaded', init);
最新的prototype中自定义事件已经重新命名, 使用"dom:loaded" 代替了 “contentloaded”.
document.observe('dom:loaded', init);
附:
Andrea Giammarchi
的OnContent函数提供了一个跨平台的DOMContentLoaded的解决方案My DOMContentLoaded Final Solution
文件名称:DOMContentLoaded.js
-
function
onContent
(
f
)
{
- var
a =
onContent,
- b =
navigator
.
userAgent
,
- d =
document
,
- w =
window
,
- c =
"onContent"
,
- e
=
"addEventListener"
,
- o =
"opera"
,
- r =
"readyState"
,
- s =
"<scr"
.
concat
(
"ipt defer src='//:' on"
,
r,
"change='if(this."
,
r,
"==\"complete\"){this.parentNode.removeChild(this);"
,
c,
"."
,
c,
"()}'></scr"
,
"ipt>"
)
;
- a[
c]
=
(
function
(
o)
{
- return
function
(
)
{
- a[
c]
=
function
(
)
{
}
;
- for
(
a =
arguments
.
callee
;
!
a.
done;
a.
done =
1)
f(
o ?
o(
)
:
o)
- }
- }
)
(
a[
c]
)
;
- if
(
d[
e
]
)
d[
e
]
(
"DOMContentLoaded"
,
a[
c]
,
false
)
;
- if
(
/
WebKit|
Khtml/
i.
test
(
b)
|
|
(
w[
o]
&
&
parseInt
(
w[
o]
.
version
(
)
)
<
9)
)
(
function
(
)
{
/
loaded |
complete
/
.
test
(
d[
r]
)
?
a[
c]
(
)
:
setTimeout
(
arguments
.
callee
,
1)
- }
)
(
)
;
- else
if
(
/
MSIE/
i.
test
(
b)
)
d.
write
(
s)
;
-
-
}
;
util.js:
addDOMLoadEvent = (function(){
// create event function stack
var load_events = [],
load_timer,
script,
done,
exec,
old_onload,
init = function () {
done = true;
// kill the timer
clearInterval(load_timer);
// execute each function in the stack in the order they were added
while (exec = load_events.shift())
setTimeout(exec, 10);
if (script) script.onreadystatechange = '';
};
return function (func) {
// if the init function was already ran, just run this function now and stop
if (done) return func();
if (!load_events[0]) {
// for Mozilla/Opera9
if (document.addEventListener)
document.addEventListener("DOMContentLoaded", init, false);
// for Internet Explorer
/*@cc_on
@*/
/*@if
(@_win32)
document.write("<script id=__ie_onload defer src=//0><\/scr"+"ipt>");
script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
if (this.readyState == "complete")
init(); // call the onload handler
};
/*@end
@*/
// for Safari
if (/WebKit/i.test(navigator.userAgent)) { // sniff
load_timer = setInterval(function() {
if (/loaded|complete/.test(document.readyState))
init(); // call the onload handler
}, 10);
}
// for other browsers set the window.onload, but also execute the old window.onload
old_onload = window.onload;
window.onload = function() {
init();
if (old_onload) old_onload();
};
}
load_events.push(func);
}
})();
function insertWBR(string, step){
var textarea = document.createElement('TEXTAREA');
textarea.innerHTML = string.replace(/</g,"<").replace(/>/g,">");
string = textarea.value;
var step = (step || 5), reg = new RegExp("(\\S
{" + step + "})", "gi");
return string.replace(/(<[^>]+>)/gi,"$1<wbr/>").replace(/(>|^)([^<]+)(<|$)/gi, function(a,b,c,d){
if(c.length < step) return a;
return b + c.replace(reg, "$1<wbr/>") + d;
});
}
相关推荐
主要介绍了Javascript封装DOMContentLoaded事件实例,DOMContentLoaded是FF,Opera 9的特有的Event, 当所有DOM解析完以后会触发这个事件,需要的朋友可以参考下
《JS、CSS与img对DOMContentLoaded事件的影响》 在前端开发中,理解DOM(Document Object Model)的加载过程至关重要,特别是DOMContentLoaded事件的触发机制。DOMContentLoaded事件是网页加载过程中的一个重要节点...
在JavaScript编程中,DOMContentLoaded事件是一个非常重要的概念,它标志着文档对象模型(DOM)已经构建完成,即HTML页面的结构已经解析完毕,但不包括图片、样式表等资源的加载。这个事件对于优化用户体验至关重要...
描述中提到了window.onload事件与DOMContentLoaded事件的区别。window.onload事件是等整个页面完全加载完成后才会触发,这包括所有图片、脚本、样式表、iframe等资源,通常会较晚触发,而DOMContentLoaded仅需DOM树...
现在更推荐的做法是使用原生JavaScript的DOMContentLoaded事件或者在现代JavaScript框架中处理事件监听。 在代码示例中,i和j两个变量被用作标志位,每次对应的事件触发时,标志位递增。这里存在一个逻辑问题,因为...
3. 触发DOMContentLoaded事件 4. 注入5+ API 5. 触发plusready事件 这样导致5+ API生效时间比较延后,在html中引用js执行之后才能调用5+ API,通常采用以下代码调用5+ API: document.addEventListener('plusready'
1. **原生DOMContentLoaded事件**:在JavaScript中,可以直接监听DOMContentLoaded事件,当DOM结构加载完毕,但不等待所有资源加载完成后,该事件会被触发。这比等待window.onload事件更快,因为它不会等待图片和...
3. **DOMContentLoaded事件**:当HTML文档解析完成,但不包括外部资源(如图片、字体等)时,会触发DOMContentLoaded事件。在这个事件的回调函数中执行的JavaScript代码可以访问到所有已解析的DOM元素。 4. **事件...
1. DOMContentLoaded事件: 这个事件标志着浏览器已经解析完HTML文档,并构建了DOM树,但不包括外部资源如图片、字体或异步脚本。这意味着开发者可以在事件处理函数中访问DOM节点并进行操作,而无需等待所有资源...
DOMContentLoaded事件在文档的DOM结构解析完成时触发,但不等待样式表、图像和子框架的加载。使用Promise来处理这个事件,我们可以这样做: ```javascript const domContentLoadedPromise = new Promise((resolve...
使用DOMContentLoaded事件确保DOM完全加载后再运行JavaScript代码。 addEventListener方法为添加按钮、完成按钮和删除按钮设置点击事件处理函数。 使用appendChild方法将新的待办事项项添加到列表中。 通过这个...
- **DOMContentLoaded事件**:此事件在浏览器完成解析HTML,但不等待所有外部资源(如图片、样式表)加载时触发。这对于那些需要尽早执行的脚本来说非常有用,因为它们不需要等待所有资源。 ```javascript document...
2. **监听DOMContentLoaded事件**:在JavaScript中,我们可以使用`window.addEventListener('DOMContentLoaded', function() {...})`来监听DOM的加载完成事件。当DOM解析完成时,这个事件会被触发,我们可以在这个回...
- `defer` 属性:脚本会在整个HTML文档解析完成后、DOMContentLoaded事件触发之前按顺序执行。 2. **JavaScript基本数据类型**:包括Number、String、Boolean、Undefined、Null、Symbol和BigInt。其中,`null`是一...
1. **DOMContentLoaded事件**:页面加载过程中,jQuery会监听DOMContentLoaded事件,这个事件会在DOM结构加载完成但不等待样式表、图片等外部资源加载时触发。此时,预加载指示器开始显示,告诉用户页面正在准备内容...
14. **domContentLoadedEventStart**:DOMContentLoaded事件开始触发的时间。 15. **domContentLoadedEventEnd**:DOMContentLoaded事件结束触发的时间。 16. **domComplete**:DOM树、样式和子资源加载完成的时间。...