JavaScript判断页面加载完之后再执行预定函数的技巧


Posted in Javascript onMay 17, 2016

JavaScript 脚本语言的执行,是需要触发的。一般的做法就是在网页中,直接编写几个函数,有的在代码被加载的时候就被浏览器处理,或者使用类似下面的代码来触发实现函数的相关功能。

<div id=”link” onclick=”fun()” ></div>

上面代码的意思就是,当鼠标点击 id 为 link 的元素的时候,就触发了它的 onclick 事件,然后执行使用 JavaScript 定义的 fun 函数。这样的做法肯定是很不合理的,因为触发操作直接写进了 HTML 结构里面,内容和行为没有隔离开,对日后的二次开发或者修改带来不便。
需要注意的是,当事件处理与对应元素绑定起来的时候,只有在那个元素加载完之后才能进行操作。如果说把处理的脚本放在了 head 区域,浏览器会报错。因为下面的 HTML 元素还没有加载出来,head 中的处理脚本已经被处理了。

一个好的执行 JavaScript 代码的方法应该是 行为内容分离的、在页面加载后处理 的。所以,处理 JavaScript 代码我们要用到 监听器 和 window 对象的 load 事件。

监听器

监听器实际上的功能就是行为与内容分离的。以前需要在 HTML 中加上一些触发事件来触发 JavaScript 的相关函数,而现在直接在 JavaScript 中对某个元素的使用监听器,监听这个元素的事件,如果这个元素被触发了某些事件,在监听器中又定义了这个事件对应的处理函数,那么就会处理这个函数。

W3C 的标准方法叫做 addEventListener ,被IE9,chrome,firefox,opera所支持,写法:

window.addEventListener(‘load',function,false);

早期 IE 中有 attachEvent 方法效果类似:

window.attachEvent(‘onload',function);

使用监听器的方法也很简单,就是先获取页面中的某个元素,然后对这个元素使用监听器,定义监听的事件和对应的事件处理函数,就上文例子:

document.getElementById(‘link').addEventListener(‘click',fun,false);

关于监听器更加详细的使用说明,请见文末补充资料。
window.onload 事件

onload 事件只有在整个页面已经完全载入的时候才会被触发,我们将 JavaScript 代码写进 onload 事件中,就可以保证在 HTML 元素被加载完成之后,浏览器才会处理我们的 JavaScript 代码。基础的写法:

window.onload = function(){
 //code
}

这样,这个函数里面的 code 会在加载完成之后被处理。但是,这种方法有个缺陷,就是只能用于这一个函数。页面中无法出现多个 window.onload 事件,如果出现了多个 onload 事件,那么后面的内容会覆盖前面的。
那么,我们可以这样做,在一个 window.onload 事件中,写上所有需要加载的函数名,然后在外面定义函数:

window.onload = function(){
  func1();
  func2();
 }
function func1(){…}
function func2(){…}

这样做虽然可以,但是很不方便,因为我们需要把所有要加载的函数名都写进去,修改起来就会很麻烦。当然办法肯定是有的,jQuery 就特别提供了很强大的多脚本加载方法,那么原生的 JavaScript 肯定也有办法。

window.onload 同时处理多个函数

我们需要编写一个处理函数,先看一下代码:

function addLoadListener(fn){
    if (typeof window.addEventListener != ‘undefined'){
      window.addEventListener(‘load',fn,false);
    }else if(typeof document.addEventListener != ‘undefined'){
      document.addEventListener(‘load',fn,false);
    }else if (typeof window.attachEvent != ‘undefined'){
      window.attachEvent(‘onload',fn);
    }else{
      var oldfn = window.onload;
      if(typeof window.onload != ‘function'){
        window.onload = fn;
      }else{
        window.onload = function(){
          oldfn();
          fn();
        };
      }
    }
  }

简单的来解析一下,这个自定义的 addLoadListener 函数,传递一个 函数名称 作为参数。它首先判断浏览器是否支持相关的 监听器,如果支持 监听器,就使用 监听器 监听 window 对象的 onload 事件,然后处理这个函数。这段代码使用 if 语句判断了所有浏览器的监听事件,是跨浏览器兼容的。
我们把这段代码放在 JavaScript 代码段的最上面,然后在下面定义相关函数,然后使用下面语句来加载 JavaScript 函数了。

addLoadListener(func);
function func() {…}

这样,有什么 JavaScript 函数是需要在页面加载完成之后处理的,直接使用 addLoadListener 函数即可,而且可以使用多个。通常来说,所有的 JavaScript 最好都使用 onload 事件加载,以避免意外情况发生。

Javascript 相关文章推荐
jquery实现兼容浏览器的图片上传本地预览功能
Oct 14 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
用javascript对一个json数组深度赋值示例
Jul 27 Javascript
JavaScript实现动画打开半透明提示层的方法
Apr 21 Javascript
JavaScript实现的经典文件树菜单效果
Sep 08 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
JS之相等操作符详解
Sep 13 Javascript
判断div滑动到底部的scroll实例代码
Nov 15 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
基于Bootstrap3表格插件和分页插件实例详解
May 17 #Javascript
Winform客户端向web地址传参接收参数的方法
May 17 #Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 #Javascript
js和jq使用submit方法无法提交表单的快速解决方法
May 17 #Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 #Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
May 17 #Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
May 17 #Javascript
You might like
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
php json转换相关知识(小结)
2018/12/21 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
初入社会应届生求职信
2013/11/18 职场文书
质检员岗位职责
2013/12/17 职场文书
2014年教师节寄语
2014/08/11 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
公司员工离职感言
2015/08/03 职场文书
用python自动生成日历
2021/04/24 Python
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技