JavaScript之共享onload

时间:2022-04-24
本文章向大家介绍JavaScript之共享onload,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我们知道,当我们将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>

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