在页面加载之后执行JavaScript

 更新时间:2022-06-04 00:17:10   作者:佚名   我要评论(0)

我们都知道,页面加载是有顺序的。让我们先来理一下页面的展示过程:
当你输入url并按下回车时
首先从本地查找域名,有的话直接用hosts文件里

我们都知道,页面加载是有顺序的。让我们先来理一下页面的展示过程:

当你输入url并按下回车时

  1. 首先从本地查找域名,有的话直接用hosts文件里的ip地址,否则查询DNS,得到ip地址
  2. 建立TCP连接——进行“三次握手”
  3. 客户端发送http请求
  4. 服务端处理,并返回结果给客户端
  5. 关闭TCP连接——需要“四次挥手”
  6. 浏览器收到结果,开始解析资源(JS、CSS、HTML),解析HTML生成的dom树,和同时解析css生成的cssom树结合生成渲染树
  7. 根据渲染树渲染页面

当然,再详细的比如:如何解析生成DOM树、浏览器在三次握手四次挥手的同时做了什么、CSSOM树是怎么和DOM树 一一对应的… 这些如果你不是在做系统,似乎是无关紧要的 —— 至少对本文来说是这样的。

经过上面的步骤,浏览器已经拿到了想要的结果,下一步:浏览器渲染进程启用多个线程协助完成页面渲染

  • GUI渲染线程 ,负责渲染浏览器界面,解析HTML、css,构建DOM树和RenderObject树,布局和绘制 ——一旦界面因为某种操作引发了回流,此线程就会执行
  • JS引擎线程 ——和GUI线程互斥,在js引擎执行时,GUI线程被挂起
  • 事件触发线程 ——依赖js的队列机制完成(当一个事件触发时该线程会把事件添加到待处理队列的队尾,等待js引擎处理)
  • 定时器触发线程 ——依赖js的队列机制完成
  • 异步http请求线程

这其中有一个重要的地方:JavaScript执行线程和渲染线程互斥 !而且JavaScript线程的优先级最高!
所以一旦在HTML中发现了<script> ,浏览器便会暂停其余HTML元素的显示转而去“马上加载JS代码”,这可能会导致两个问题的发生:

  • 页面「一片空白」
  • 报错 —— JS无法访问未知(还没开始的)加载内容

所以,我们需要一种方法来“暂停”JS执行。

很多人第一时间会选择 window.onload :恕我直言,这确实不是好的方法,它让用户等的太久了。你稍微一查就能知道:onload方法会等待页面上所有的文字、table、img加载完成后才触发。如果你真的要用,笔者倒是更推荐 DOMContentLoaded ,这个onload的“变异产品”会等到文字加载完成后立即触发 —— 你完全不必考虑图片的大小对页面初始加载时间的影响,如果你不会“调用”图片的话(前面说了,JS无法访问未知加载内容)。

但事实上,我们更需要一种方法,让JS在“浏览器获得内容后、真正展示在屏幕上前”就开始执行。
比较幸运(也可能是不幸)的是,jQuery实现了这个方法:

$(document).ready(function(){
	//...
})

不过据说jQuery的ready和原生JS的DOMContentLoaded效果是一样的:网页中所有 DOM 结构绘制完毕后就执行(可能 DOM 元素关联的内容并没有加载完)
除此之外,JS中的 window.onload 和jQuery中的 $(window).load() 是等价的

哦,这里并不是“盲目推崇”jQuery,你完全可以去自己封装一个。比如 jQuery的 ready() 和JS的 DOMContentLoaded 实际上都实现了(或“基于”)这样一段代码:

function init(){
	if(arguments.callee.done) return;
	arguments.callee.done=true;
	if(timer) clearInterval(timer);
	//...
}

//判断浏览器
//针对Mozilla/Opera9
if(document.addEventListener){
	document.addEventListener('DOMContentLoaded',init,false)
}
//针对IE
document.write ("<script id='__ie_onload defer' src='javascript:void(O);'><\/script>" );
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
	if( this.readyState == " complete" ) {
		init() //调用加截处理器
	};
}
//针对Safari 
if (/WebKit/i.test(navigator.userAgent)) {
	var timer = setinterval( function (){
		if( /loaded | complete/.test(document.readyState)) {
			init() //调用加载处理器
		}
}. 10);
//针对其他浏览器
window.onload = init;

到此这篇关于在页面加载之后执行JavaScript的文章就介绍到这了,更多相关页面加载后执行js内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • 页面加载完成后再执行JS的jquery写法以及区别说明
  • 如何让页面加载完成后执行js

相关文章

  • 在页面加载之后执行JavaScript

    在页面加载之后执行JavaScript

    我们都知道,页面加载是有顺序的。让我们先来理一下页面的展示过程: 当你输入url并按下回车时 首先从本地查找域名,有的话直接用hosts文件里
    2022-06-04
  • JS实现页面滚动到关闭时的位置与不滚动效果

    JS实现页面滚动到关闭时的位置与不滚动效果

    目录滚动不滚动标题显而易见,要说两种情况:重新打开页面或者返回某个页面时滚动到上次离开时的位置,以及不滚动保持在顶部。 滚动 这也有两
    2022-06-04
  • Android项目开发常用工具类LightTaskUtils源码介绍

    Android项目开发常用工具类LightTaskUtils源码介绍

    目录LightTaskUtils概述LightTaskUtils截图LightTaskUtils源码版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfh
    2022-06-04
  • C++和OpenCV实现图像字符化效果

    C++和OpenCV实现图像字符化效果

    目录实现原理功能函数代码作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 图
    2022-06-04
  • Java深入分析讲解反射机制

    Java深入分析讲解反射机制

    目录反射的概述获取Class对象的三种方式通过反射机制获取类的属性通过反射机制访问Java对象的属性反射机制与属性配置文件的配合使用资源绑定
    2022-06-04
  • netty 实现tomcat的示例代码

    netty 实现tomcat的示例代码

    目录netty 实现tomcat自定义基础类netty 服务端使用测试netty 实现tomcat 自定义基础类 TomcatServlet public abstract class TomcatServlet
    2022-06-04
  • Java超详细讲解排序二叉树

    Java超详细讲解排序二叉树

    目录排序二叉树概念排序二叉树类的定义添加节点中序遍历查找节点查找某一节点的父节点删除节点排序二叉树概念 二叉排序树(Binary Sort Tree
    2022-06-04
  • 深入解析vue中的权限管理

    深入解析vue中的权限管理

    目录vue要做权限管理该怎么做?一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结vue要做权限管理该怎
    2022-06-04
  • Java超详细分析讲解哈希表

    Java超详细分析讲解哈希表

    目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的
    2022-06-04
  • 聊聊vue番茄钟与electron?打包问题

    聊聊vue番茄钟与electron?打包问题

    目录序动手准备工作功能规划开发工具开发过程创建项目配置项目界面编写主进程和渲染进程文件读存通信打包序 平时对自己学习工作计划安排可以
    2022-06-04

最新评论