我们有时可能需要一些在页面加载完成之后执行的方法,其实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. 2018-2019-2 20165209 《网络对抗技术》Exp7: 网络欺诈防范

    2018-2019-2 20165209 <网络对抗技术>Exp7: 网络欺诈防范 1 基础问题回答和实验内容 1.1基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击. ...

  2. ajax 请求发出了,数据更改了,但是没进入success 函数 把success 换成 complete

    $(function(){ $(document).on('tap','.w-location-group .mui-table-view-cell',function(){ var bool = $ ...

  3. 利用canvas来绘制一个会动的图画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 【Python】【Flask】前端调用后端方法

    后端代码: @app.route("/test",methods=['POST','GET']) def test(): return "我是测试的" 前端代码 ...

  5. java service wrapper日志参数设置及优化

    一般在容器比如tomcat/weblogic中运行时,我们都是通过log4j控制日志输出的,因为我们现在很多服务端使用java service wrapper(至于为什么使用jsw,原先是比较排斥使用 ...

  6. Cortex-M3基础

    (一)寄存器 1 寄存器组      R0-R12: 通用寄存器 ------------------------------------------------------------------- ...

  7. 微内核VS宏内核【转】

    本文转载自:https://segmentfault.com/a/1190000002711544 内核按照体系结构分为两类 : 微内核(microkernel)与宏内核(macrokernel). ...

  8. Spring编译AOP项目报错

    警告: Exception encountered during context initialization - cancelling refresh attempt: org.springfram ...

  9. Python实现自平衡二叉树AVL

    # -*- coding: utf-8 -*- from enum import Enum #参考http://blog.csdn.net/niteip/article/details/1184069 ...

  10. UVa 818 切断圆环链(dfs+二进制枚举)

    https://vjudge.net/problem/UVA-818 题意:有n个圆环,其中有一些已经扣在了一起.现在需要打开尽量少的圆环,使得所有圆环可以组成一条链,例如,有5个圆环,1-2,2-3 ...