这篇文章主要介绍“怎么实现在页面加载之后执行JavaScript”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么实现在页面加载之后执行JavaScript”文章能帮助大家解决问题。
我们都知道,页面加载是有顺序的。让我们先来理一下页面的展示过程:
当你输入url并按下回车时
首先从本地查找域名,有的话直接用hosts文件里的ip地址,否则查询DNS,得到ip地址
建立TCP连接——进行“三次握手”
客户端发送http请求
服务端处理,并返回结果给客户端
关闭TCP连接——需要“四次挥手”
浏览器收到结果,开始解析资源(JS、CSS、HTML),解析HTML生成的dom树,和同时解析css生成的cssom树结合生成渲染树
根据渲染树渲染页面
当然,再详细的比如:如何解析生成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/Opera9if(document.addEventListener){document.addEventListener('DOMContentLoaded',init,false)}//针对IEdocument.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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。