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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
Jquery颜色选择器ColorPicker实现代码
Nov 14 Javascript
比较新旧两个数组值得增加和删除的JS代码
Oct 30 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
May 16 Javascript
详解AngularJS中ng-src指令的使用
Sep 07 Javascript
原生js实现焦点轮播图效果
Jan 12 Javascript
js获取ip和地区
Mar 10 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 Javascript
微信小程序商品到详情的实现
Jun 27 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
Sep 28 Javascript
详解Angular5 路由传参的3种方法
Apr 28 Javascript
jQuery实现列表的增加和删除功能
Jun 14 jQuery
基于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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
对于Python的Django框架部署的一些建议
2015/04/09 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
python修改字典内key对应值的方法
2015/07/11 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Python如何输出整数
2020/06/07 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
抄作业检讨书
2014/02/17 职场文书
运动会广播稿150字
2014/02/19 职场文书
绿色环保标语
2014/06/12 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
社区活动策划方案
2014/08/21 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
小学数学国培研修日志
2015/11/13 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
如何写好活动总结
2019/06/21 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
python基础之//、/与%的区别详解
2022/06/10 Python