我们知道,当我们将JS代码脚本放到<head></head>标签之间时,这是的js代码加载要先于DOM加载,而我们往往会在JS代码脚本中写一些获取DOM元素的代码,而此时的DOM是不完整的,

所以我们通常的解决方法是将函数放入到window.onload里面去,window.load事件是网页加载完毕时会触发的一个事件,如果将我们的函数与之绑定,我们的函数也会在页面加载完毕之后执行.

如下代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var aa = document.getElementById("target");
alert(aa.nodeName);
</script>
</head>
<body>
<div id="target"></div>
</body>
</html>

这段代码在浏览器执行时就会报错,aa is null;因为在js获取id=target的div时,该div还没有加载完毕。所以我们需要这样来解决这个问题,代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
window.onload = bb;
function bb() {
var aa = document.getElementById("target");
alert(aa.nodeName);
}
</script>
</head>
<body>
<div id="target"></div>
</body>
</html>

这个时候代码正常输出:DIV;  nodeName默认输出标签名的大写形式;

这似乎已经解决了我们的问题,但是不够perfect,如下代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
window.onload = bb;
cc();
function bb() {
var aa = document.getElementById("target");
alert(aa.nodeName);
}
function cc() {
var dd = document.getElementById("Div1");
alert(dd);
}
</script>
</head>
<body>
<div id="target"></div>
<div id="Div1"></div>
</body>
</html>

这个时候任然会报错:dd id null;错误原因和上面一样;

解决办法有两个:

1、将需要绑定window.onload事件的两个函数写到一个匿名函数里面,在将该匿名函数与window.onload事件绑定,ok,问题解决!

但是这个方法只能解决需要绑定window.onload事件的函数较少的情况,一旦那些函数有很多,这个方法就不是很好!

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
window.onload = ee;
function bb() {
var aa = document.getElementById("target");
alert(aa.nodeName);
}
function cc() {
var dd = document.getElementById("Div1");
alert(dd.firstChild.nodeValue);
}
function ee() {
bb();
cc();
}
</script>
</head>
<body>
<div id="target"></div>
<div id="Div1">asdas</div>
</body>
</html>

2、这是一个弹性最佳的解决方案       不管你打算在页面加载完毕是执行多少个函数,他都能应付自如;代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
addOnLoadEvent(aa);
addOnLoadEvent(bb);
function aa() {
var aa=document.getElementById("ab");
alert(aa.firstChild.nodeValue);
}
function bb() {
var bb = document.getElementById("abc");
alert(bb.firstChild.nodeValue);
}
//定义一个addOnLoadEvent的函数
function addOnLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != "function") {
window.onload = func; //如果window.onload事件没有绑定任何function则正常绑定
}
else {
//如果window.onload事件已经绑定了函数,则在原来的基础上,继续添加新的函数
window.onload = function () {
oldonload();
func();
};
}
}
</script>
</head>
<body>
<div id="ab">1</div>
<div id="abc">2</div>
</body>
</html>

上面的addOnloadEvent()方法解决了我们的问题,但是还不够全面,因为当需要绑定的方法过多时,我们就要写多条addOnLoadEvent(方法);所以为了减少代码量这里的代码还可以这样改,

代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
var onloadlist = [aa,bb];//定义一个数组,数组里面都是需要在页面加载完毕之后才执行的函数引用
addOnLoadEvent(onloadlist);
function aa() {
alert(1);
}
function bb() {
alert(2);
}
function addOnLoadEvent(eventlist) {
//循环遍历数组依次加到队列中
window.onload = function () {
for (var i = 0; i < eventlist.length; i++) {
eventlist[i]();
}
}
}
</script>
</head>
<body>
<div id="ab">1</div>
<div id="abc">2</div>
</body>
</html>

这样就一定程度上减少了代码量,还便于管理方法的执行先后顺序。

JavaScript之共享onload的更多相关文章

  1. JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    摘要: 原始数据类型和引用数据类型的副本作为参数传递给函数. 原文:JavaScript 是如何工作的:JavaScript 的共享传递和按值传递 作者:前端小智 Fundebug经授权转载,版权归原 ...

  2. 【Python全栈-JavaScript】JavaScript的window.onload()与jQuery 的ready()的区别

    JavaScript的window.onload()与jQuery 的ready()的区别 做web开发时常用Jquery中$(document).ready()和JavaScript中的window ...

  3. 原生javascript 共享onload事件

    在工作时,我们给一个元素绑定了事件,如果dom还没加载完成,就执行了js代码,就不会绑定成功.常规解决方案就是用: window.onload = EventFunction; 可是如果有两个 事件, ...

  4. javascript的window.onload()方法和jQuery的$(document).ready()的对比

    jQuery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...

  5. JavaScript:window.onload问题

    前几天做一个点击按钮,就实现切换图片效果的小demo时,代码看上去没问题,就是达不到效果.让我百思不得其解. 代码如下: <!DOCTYPE html> <html> < ...

  6. JavaScript向window onload添加加载函数

    有时候我们需要在页面加载事件后完成一些函数操作,对于函数比较多的情况下可以写一个统一的加载函数 .本函数来自于JavaScript DOM 编程艺术: function addLoadEvent(fu ...

  7. 共享onload事件

    在做前端工作中,我们想要设置某个函数prepare,让它在网页加载完毕后执行,会触发一个onload事件,这个事件与windows对象相关联,必须把prepare函数绑定到这个时间上,语法如下:win ...

  8. javascript --- 将共享属性迁移到原型中去

    当我们用一个构造函数创建对象时,其属性就会被添加到this中去.并且被添加到this中的属性实际上不会随着实体发生改变,这时,我们这种做法显得会很没有效率.例如: function her(){ th ...

  9. js共享onload事件

    问题:通过js进行事件绑定,必须在HTML文档加载完成后再执行js脚本,否则可能因DOM不完整导致无法完成预计的效果,但对于不同的需求如何选用最佳的实现方式呢,这里做了整理,可以做参考. 一.对于小型 ...

随机推荐

  1. IOS研究院之打开照相机与本地相册选择图片

    如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样.最终点击发送将按钮将图片2进制图片上传服务器. 下面我 ...

  2. Matrix(类似kruskal)

    Matrix Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  3. OceanBase中主备Rootserver如何管理切换

    主RootServer会不断给备RootServer发送lease.被RootServer收到该lease后会保存到几个变量中: int ObCheckRunnable::renew_lease(co ...

  4. 【java读书笔记】——java开篇宏观把控 + HelloWorld

    学完java有一段时间了,一直没有做对应的总结,总认为有一种缺憾.从这篇博客開始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,基本的目的是扫盲.原来仅 ...

  5. shape和selector是Android UI设计中经常用到的

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...

  6. SharePoint解决方案由VS2010升级到VS2013部署页面报错

    “/”应用程序中的服务器错误.----------------------------------------文件“/_CONTROLTEMPLATES/....../XXXUserControl.a ...

  7. Oracle EBS 如何月结、对账[Z]

    在Oracle系统处理月结业务时,需要遵循一定的操作顺序.这些业务,牵涉到相应的模块,包括:应付模块.采购模块.库存模块.应收模块.薪资模块.固定资产和总帐模块等 在Oracle系统中,总帐模块处于财 ...

  8. oracle查看系统资源占用情况

    1,连上服务器,使用top命令,可以查看cpu使用率以及内存的使用情况等等,还有当前各用户的使用情况 2,用pl/sql developper,tool里面选sessions,就可以看到当前sessi ...

  9. iOS多态 动态绑定

    多态和动态绑定是为了解决父类调用子类的问题 首先,声明三个类aa bb cc 都继承于fist类 #import <Foundation/Foundation.h> @interface ...

  10. php curl详解用法[真的详解]

    目前为目最全的CURL中文说明了,学PHP的要好好掌握.有很多的参数.大部份都很有用.真正掌握了它和正 则,一定就是个采集高手了. 通用函数: function curl_file_get_conte ...