要求:<script> 标签放在 <head></head>标签内部
大家都知道的:
<html>
<head>
<script>
window.onload=function(){
.....
}
</script>
</head>
<body>
<div></div>
</body>
</html>
可若是这样:
<html>
<head>
<script src='one.js'></script> // 要求dom加载完后执行
<script src='two.js'></script> // 要求dom加载完成后执行
...
</head>
<body>
<div></div>
</body>
</html>
若是:
one.js
window.onload=function(){ ....}
two.js
window.onload=function(){....}
则 two.js 中的window.onload 会 覆盖 one.js中的,所以也就成了: 只能执行two.js中的代码了。
有没有办法让one.js 和 two.js 都能够在dom加载完成后执行??
不包括这样的方法:
<script defer='defer' src'one.js'></script>
<script defer='defer' src'two.js'></script>
用 dom lv3 的 api,需要 html5 支持。
window.addEventListener('DomContentLoaded', func);
为什么不用jquery啊
jquery里的document.ready就可以解决,可以多个,而且会在dom生成完毕就执行,而不是所有资源加载完毕
这个问题的本质是DOM ready
,常见的解决方案有window.onload()
事件,jQuery
等。。。
参考《DOM编程艺术》里的addLoadEvent方法
function addLoadEvent(func){
var oldonload=window.onload;
if(typeof window.onload!='function'){
window.onload=func;
} else{
window.onload=function(){
oldonload();
func();
}
}
}
在添加了addLoadEvent这个函数之后,如果我们想让刚才那两个函数都在页面加载完毕时得到执行,只需要写出以下代码就能完成上文匿名函数的功能了:
addLoadEvent(Function1);
addLoadEvent(Function2);
具体可以看这里:http://zhaoyuxiang.cn/blog/archivers/addLoadEvent
采用事件注册方式注册一个事件就可以了,注册事件有hack;可以去研究下jquery的ready方法,毕竟人家的兼容性好些
addEventListener注册事件,会把注册的回调函数都执行,不会覆盖。
另外,文档加载完成的事件是DomContentLoad这个事件是HTML文档解析完成的事件。而onload事件是HTML里面的外部资源等下载完成的事件。
这里有若干种解决方案,当然最方便的就是把两段代码放在同一个 window.onload 里面。
一个简单易懂的解决方案是:
window.onload = function() {
};
var prev = window.onload;
window.onload = function() {
if (prev) {
prev();
}
// do something
};
只是这种写法不是那么漂亮,可以考虑用绑定事件的形式来完成,类似jQuery的作法。
function listen(event, elem, func) {
if (elem.addEventListener) // W3C DOM
elem.addEventListener(evnt,func,false);
else if (elem.attachEvent) { // IE DOM
var r = elem.attachEvent("on"+evnt, func);
return r;
}
else window.alert('I\'m sorry Dave, I\'m afraid I can\'t do that.');
}
listen('load', window, function() {});
当然,执行顺序可能会和绑定顺序不同。需要一致的话,就更复杂一些,维护一个队列。下面的两个链接里面有这种解决方案。
注:参考了问题一,问题二
可以加个three.js
然后在three.js里面写
window.onload=function(){
//one.js 中的方法
//two.js 中的方法
}
在两个js文件里只声明函数,在另外的地方用window.onload进行调用
如果使用window.onload的话,需要将两个js中的方法都写在window.onload里面,因为一个window对象只可以绑定一个onload事件,但是JQuery中的document.ready可以绑定多个,况且题主要求dom加载完成后才执行,window.onload其实是等到文件加载完成后才执行(除了dom之外还包括css,img等),而document.ready是真正的dom加载完成后执行。
另外可以使用addEventListener对window对象绑定事件,但感觉没有JQuery优雅啊。
?要我直接用jquery,就没这么操蛋的问题了,以前老喜欢把script放head里。现在都是在body结尾之前