我们有时可能需要一些在页面加载完成之后执行的方法,其实js原生就提供了onload方法,所以我们最简单的办法就是直接给onload赋值一个函数,在页面加载完成之后就会自动执行

widnow.onload = function(e) {
// do some things
}

或者我们也可以使用addEventListener,来监听多个load事件,此处我们先暂时不考虑低版本的ie

document.addEventListener("load", function(e) {
// do some things
}, false);

这个时候,我们考虑到,明显jq的ready方法更好使用,而且简单很多,所以我们也可以通过切片编程的方法来实现一个onload方法

// after切片,可以在方法之后增加after,顺序执行
Function.prototype.after = function(func) {
var _self = this;
// 返回一个新的可执行方法
return function() {
var ret = _self.apply(this, arguments);
// 当上一个方法返回false,则不会执行下一个after
if(ret === false) {
return false;
}
func.apply(this, arguments);
return ret;
}
} $ = function(func) {
window.onload = (window.onload || function() {}).after(func);
} // 使用
$(function() {}); $(function() {});

当然,感觉可能实现还不如无限次的调用addEventListener,虽然这个方法可以保证执行顺序

而实际上,你在使用该方法的时候,会发现这个方法始终会在jq的ready之后执行,是因为jq的ready实现,是监听了DOMContentLoaded,这个事件是在文档加载完成之后就会触发,而不必等待所有的资源包括异步资源加载完成。所以我们最后的实现可以这样

var $ = (function() {
var funcs = []; // 保存所有需要执行的方法
var ready = false; // 页面准备完毕之后,修改为true // 当文档处理完毕,调用事件处理程序
function handler(e) {
// 如果执行过了,直接返回
if(ready) {
return;
} // 如果发生过readysyayechange事件,但是状态不为complete,那么文档没有准备好
if(e.type === "readystatechange" && document.readyState !== "complete") {
return;
} // 运行所有注册函数
for(var i = 0; i < funcs.length; i++) {
funcs[i].call(document);
} // 设置ready为true,并移除所有方法
ready = true;
funcs = null;
} // 为接收到的任何事件注册处理程序
if(document.addEventListener) {
document.addEventListener("DOMContentLoaded", handler, false);
document.addEventListener("readystatechange", handler, false);
document.addEventListener("load", handler, false);
} else if(document.attachEvent) { // 处理ie兼容
document.attachEvent("onreadystatechange", handler);
document.attachEvent("onload", handler);
} // 返回__whenReady函数
return function __whenReady(f) {
if(ready) {
f.call(document);
} else {
funcs.push(f);
}
}
}());

核心就是在判断几个加载事件执行的时候,文档是否准备好,如果没有准备好,则将需要执行的函数按照顺序缓存起来,然后在监听到文档准备好之后依次执行。

基于DOMContentLoaded实现文档加载完成后执行的方法的更多相关文章

  1. window.onload在文档加载完成后执行

    验证a .b两点疑惑: a.<script src="./main.js"></script>中的window.onload是在html全部加载完了才执行, ...

  2. js 文档加载完成之后执行 备用

    //文档加载完成之后执行 (function(){ var _globeCallback; window.$$ = function(callback){ _globeCallback = callb ...

  3. spring 容器加载完成后执行某个方法

    理论 刚好再开发过程中遇到了要在项目启动后自动开启某个服务,由于使用了spring,我在使用了spring的listener,它有onApplicationEvent()方法,在Spring容器将所有 ...

  4. jQuery在HTML文档加载完毕后自动执行某个事件;

    原来onchange=“fucntionname(parms)”: <select name="country" id="selCountries_{$sn}&qu ...

  5. vs关于“当前不会命中断点 还没有为该文档加载任何符号”的解决方法

    首先调式的时候确定在debug模式下, 解决方法:工具-选项-调试 -(启用“仅我的代码”)勾去掉.

  6. js中defer实现等文档加载完在执行脚本

    我们可以使用defer来实现类似window.onload的功能: <script src="../CGI-bin/delscript.js" defer></s ...

  7. vs2015“当前不会命中断点 还没有为该文档加载任何符号”的解决方法

    解决方法:工具-选项-调试 -(启用“仅我的代码”)勾去掉

  8. spring启动容器加载成功后执行调用方法

    需求: 由于在微服务架构中各服务之间都是通过接口调用来进行交互的,像很多的基础服务,类似字典信息其实并不需每次需要的时候再去请求接口.所以我的想法是每次启动项目的时候,容器初始化完成,就去调用一下基础 ...

  9. document.write : 什么是在html输出中使用,什么是文档加载后使用?

    理解:您只能在 HTML 输出中使用 document.write.如果您在文档加载后使用该方法,会覆盖整个文档. Javascript中只能在 HTML 输出流中使用 document.write, ...

随机推荐

  1. linux常用命令:/etc/group文件详解

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和 用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用 ...

  2. CentOS安装JDK的三种办法

    方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# mkdir/usr/java[root@localhost ~]# c ...

  3. web前端----jQuery事件

    事件 常用事件 click(function(){...}) hover(function(){...}) blur(function(){...}) focus(function(){...}) c ...

  4. Linux学习笔记之如何让普通用户获得ROOT权限

    在学习sodu的时候,我发现一些命令只能由root用户使用,普通用户使用会提示此用户没有使用sudo的权限.我想到的解方法是把正在使用的普通用户获得root权限,于是我通过百度和询问老师知道了如何去实 ...

  5. JavaScript 实现表格隔行变色

    JavaScript 实现表格隔行变色 版权声明:未经授权,严禁分享! 构建界面 界面HTML代码 <style> #data,th,td{ border: 1px solid #aaaa ...

  6. Mysql错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    昨晚添加完索引之后, 查询整表的时候抛出Lock wait timeout exceeded; try restarting transaction, 吓死小白的我, 为什么条件查询可以, 整表查不了 ...

  7. 20135234mqy-——信息安全系统设计基础第十周学习总结

    ls1:显示当前目录下的文件. ls2:查看文件的详细信息(用户名,群组名,大小,创建时间,读写权限等). who:读取需要的信息到存储器,并用标准输出函数打印到屏幕上 filesize:计算文件的字 ...

  8. tcp网络通信的三次握手与三次挥手

    背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在 ...

  9. [VS 2015] VS2015 完整ISO镜像包

    区别 :https://www.visualstudio.com/zh-cn/products/compare-visual-studio-2015-products-vs 完整ISO镜像:下载 VS ...

  10. 安装Qt5.9

    目前,作为一个重量级编程开发工具,Qt 已经正式发布了 5.9.0 版本.相比之前的 5.7,5.8 版本,新版本在性能和功能上有了大幅改善和提高,并由此获得了官方的明确表态:这将是继 5.6 之后的 ...