我们知道,当我们将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. AOJ 2200 Mr. Rito Post Office(Floyd+单调DP)

    [题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 [题目大意] 一张图中有陆路和水路,水路必须要有船才能走,当船 ...

  2. 普林斯顿大学算法课 Algorithm Part I Week 3 自我总结

    要熟练掌握比较器Comparator public final Comparator<T> MY_COMPARATOR = new myComparator(); //定义比较器 .... ...

  3. 04737_C++程序设计_第3章_函数和函数模板

    例3.1 传对象不会改变原来对象数据成员值的例子. #define _SCL_SECURE_NO_WARNINGS #include <iostream> #include <str ...

  4. HDU 4729 An Easy Problem for Elfness (主席树,树上第K大)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一个带边权的图.对于每一个询问(S , ...

  5. 2014.12.01 B/S之windows8.1下安装IIS

    1.打开 控制面板——程序——程序和功能——启用或关闭windows功能 2.找到Internet信息服务         3.等待安装完毕即可 4.控制面板——系统和安全——管理工具——Intern ...

  6. json(转)

    转自:http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如何使用J ...

  7. js 和 jsp关系

    http://stackoverflow.com/questions/11718063/use-javascript-or-jquery-inside-a-cif-statement 纠结了半天的问题

  8. c++常用IDE

    vs2013. CodeLite (c/c++/PHP) codeBlocks Qt Creator Xcode

  9. gets()函数

    基本信息: 可以无限读取,不会判断上限,以回车结束读取(这个换行符也被读取了),所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出. 函数原型: char*gets(char*b ...

  10. JavaWeb核心编程之(三.2)Servlet配置

    Servlet配置 1.配置Serlvet加载时机 2.配置多映射 配置加载时机 新建项目config->创建包com.xiaoan.config->创建类FirstServlet imp ...