在页面加载之后执行JavaScript

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

当你输入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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 页面加载完成后再执行JS的jquery写法以及区别说明

    1.$(function(){ $("#a").click(function(){ //adding your code here }); }); 2.$(document).ready(function(){ $("#a").click(function(){ //adding your code here }); }); 3.window.onload = function(){ $("#a").click(function(){ //add

  • 如何让页面加载完成后执行js

    javascript 当页面dom模型加载完成后才执行javascript不能使用<body onload="">加上 defer 等于在页面完全在入后再执行,相当于 window.onload ,但应用上比 window.onload 更灵活 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/x

  • 在页面加载之后执行JavaScript

    我们都知道,页面加载是有顺序的.让我们先来理一下页面的展示过程: 当你输入url并按下回车时 首先从本地查找域名,有的话直接用hosts文件里的ip地址,否则查询DNS,得到ip地址 建立TCP连接——进行“三次握手” 客户端发送http请求 服务端处理,并返回结果给客户端 关闭TCP连接——需要“四次挥手” 浏览器收到结果,开始解析资源(JS.CSS.HTML),解析HTML生成的dom树,和同时解析css生成的cssom树结合生成渲染树 根据渲染树渲染页面 当然,再详细的比如:如何解析生成D

  • 详解Vue.js在页面加载时执行某个方法

    jQuery中可以这样写 vue中,如果要达到相同效果,可以使用vue的生命周期函数,如create或者mounted 附上vue.js的生命周期函数执行流程 总结 以上所述是小编给大家介绍的Vue.js在页面加载时执行某个方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • js页面加载后执行的几种方式小结

    在实际应用中往往需要在页面加载完毕之后再去执行相关的js代码,之所以这么操作是有道理的,如果是操作dom元素,如果相关元素没有加载完成,而去执行js代码,可能会导致错误,下面就介绍一下如何实现页面加载完成再去执行代码,这是最为基础的知识了,可能初学者还不太了解,寄希望能够给需要的朋友带来一定帮助. 一.window.onload事件: 代码如下: 原生js window.onload=function(){ //code } jquery $(window).load(function(){ /

  • javascript页面加载完执行事件代码

    复制代码 代码如下: <script type="text/javascript" language="JavaScript"> //: 判断网页是否加载完成                 document.onreadystatechange = function () {                    if(document.readyState=="complete") {                       

  • Jquery 在页面加载后执行的几种方式

    方式1: 复制代码 代码如下: $(function(){ initPublish(); }); 说明: initPublish() 即为你要运行的JS函数:这段代码,放在页面最低端. 方式2: 复制代码 代码如下: $(document).ready(function () { // add your code here initPublish(); $(.a).click( function (){ // add your code here }); }); 方式3: 复制代码 代码如下:

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

    JavaScript 脚本语言的执行,是需要触发的.一般的做法就是在网页中,直接编写几个函数,有的在代码被加载的时候就被浏览器处理,或者使用类似下面的代码来触发实现函数的相关功能. <div id="link" onclick="fun()" ></div> 上面代码的意思就是,当鼠标点击 id 为 link 的元素的时候,就触发了它的 onclick 事件,然后执行使用 JavaScript 定义的 fun 函数.这样的做法肯定是很不合理的

  • Javascript代码在页面加载时的执行顺序介绍

    一.在HTML中嵌入Javasript的方法1.直接在Javascript代码放在标记对<script>和</script>之间2.由<script />标记的src属性制定外部的js文件3.放在事件处理程序中,比如:<p onclick="alert('我是由onclick事件执行的Javascript')">点击我</p>4.作为URL的主体,这个URL使用特殊的Javascript:协议,比如:<a href=&q

  • 解析页面加载与js函数的执行 onload or ready

    首先,页面加载顺序:解析HTML结构.加载外部脚本和样式表文件.解析并执行脚本代码.构造HTML DOM模型.加载图片等外部文件.页面加载完毕. 也就是:html → head → title → #text(网页标题) → style → 加载样式 → 解析样式 → link → 加载外部样式表文件 → 解析外部样式表 → script → 加载外部脚本文件 → 解析外部脚本文件 → 执行外部脚本 → body → div → script → 加载脚本 → 解析脚本 → 执行脚本 → img

  • JavaScript提高加载和执行效率的方法

    前言 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行脚本时出现阻塞的原因在于,脚本可能会改变页面或 JavaScript 的命名空间,它们对后面页面内容造成影响. 一个典型的例子就是在页面中使用document.write() . JavaScript 代码内嵌示例 <html> <head> <title>Sourc

  • 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性

    defer和async特性相信是很多JavaScript开发者"熟悉而又不熟悉"的两个特性,从字面上来看,二者的功能很好理解,分别是"延迟脚本"和"异步脚本"的作用.然而,以defer为例,一些细节问题可能开发者却并不一定熟悉,比如:有了defer特性的脚本会延迟到什么时候执行:内部脚本和外部脚本是不是都能够支持defer:defer后的脚本除了会延迟执行之外,还有哪些特殊的地方等等.本文结合已有的一些文章以及MDN文档中对两个特性的阐述,对de

随机推荐