JS之脚本延迟

自从开了博客,我就一下班回来匆匆吃完饭门一关等一开电脑一打开匆匆的研究东西,以至于朋友们都怀疑我是不是都得了自闭症

其实因为我有恐惧心理怕自己的技术哪天跟不上社会了,说到技术我觉得技术不求越新越好,但求越稳越好,就目前而言,前段框架五花八门,八面玲珑,一一都会

别吹牛了,在我看来找到自己的框架吃透它。不吹牛了,回归正题。

============================================================================================我们今天看下JS的脚本延迟

首先先看下浏览器是如何处理脚本的

1.浏览器一边下载HTML网页,一边开始解析

2.解析过程中,发现<script>标签

3.暂停解析,网页渲染的控制权转交给JavaScript引擎

4.如果<script>标签引用了外部脚本,就下载该脚本,否则就直接执行

5.执行完毕,控制权交还渲染引擎,恢复往下解析HTML网页

如果外部脚本加载时间很长(比如一直无法完成下载),就会造成网页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。

为了避免这种情况,较好的做法是将<script>标签都放在页面底部,而不是头部。

怎样才能阻止这种状态呢

一下属性来解决

1.anync:改属性表示立即下载脚本,但不应妨碍页面的其他操作,改脚本只对外部脚本有效,属于异步脚本处理

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="a.js" async>

</script> 

<script src="b.js" async></script>
</head>
<body>
	<div>
		<p>
			HELLO world
		</p>

	</div>
</body>
</html>

  async属性的作用是,使用另一个进程下载脚本,下载时不会阻塞渲染。

浏览器如何渲染呢?

浏览器开始解析HTML网页 解析过程中,发现带有async属性的script标签 浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本 脚本下载完成,浏览器暂停解析HTML网页,开始执行下载的脚本 脚本执行完毕,浏览器恢复解析HTML网页

注意:async属性可以保证脚本下载的同时,浏览器继续渲染。需要注意的是,一旦采用这个属性,就无法保证脚本的执行顺序。哪个脚本先下载结束,就先执行那个脚本。

2..defer

defer也属于脚本延迟,其区别在于浏览器遇到该属性是不立即执行脚本而是等到加载到</html>在执行脚本,这样大大减少了浏览器假死的状态

步骤

浏览器开始解析HTML网页 解析过程中,发现带有defer属性的script标签 浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本 浏览器完成解析HTML网页,此时再执行下载的脚本

<script src="a.js" defer></script>
<script src="b.js" defer></script>

相比之下async的级别  >defer

==========================================================================================================================================

defer属性知多少

目前所有浏览器都支持defer属性,但是Chrome和Firefox中只有在加载外部脚本时defer才会生效,行内脚本使用defer是没有作用的。而IE中不论什么情况,defer都有效。
  defer的作用就是阻止脚本在下载完成后立刻执行,它会让脚本延迟到所有脚本加载执行完成后,在DOMContentLoaded之前执行,通俗的说就是顺序加载延迟执行。虽然都是在DOMContentLoaded之前执行,但是在不同浏览器之间,执行的各种脚本执行的顺序还是不一样的。看下面这个例子:

<html>
  <meta charset="utf-8">
  <head>
    <script type="text/javascript">
      var result = "" ;
      var head = document.getElementsByTagName("head")[0] ;
      //DOMContentLoaded
      if(window.addEventListener){
        document.addEventListener("DOMContentLoaded",function(){
          result += "DOMContentLoaded\n" ;
        }) ;
      }else{
        document.attachEvent("onDOMContentLoaded",function(){
          result += "DOMContentLoaded\n" ;
        }) ;
      }
      window.onload = function(){
          result += "window loaded\n";
          //console.log("window loaded") ;
      } ;
    </script>
    <!--头部行内延迟脚本-->
    <script type="text/javascript" defer = "defer">
      result += "Head Inline Script defer\n" ;
    </script>
    <!--头部行内脚本-->
    <script type="text/javascript">
      result += "Head Inline Script\n" ;
    </script>
    <!--头部外部延迟脚本 External Head Script defer-->
    <script type="text/javascript" src = "external_head_defer.js" defer="defer"></script>
    <!--头部行内脚本 External Head Script-->
    <script type="text/javascript" src = "external_head.js"></script>
  </head>
  <body>
    <button>SHOW</button>
    <!--Body行内延迟脚本-->
    <script type="text/javascript" defer = "defer">
      result += "Body Inline Script defer\n" ;
    </script>
    <!--Body行内脚本-->
    <script type="text/javascript">
      result += "Body Inline Script\n" ;
    </script>
    <!--Body外部延迟脚本 External Body Script defer-->
    <script type="text/javascript" defer = "defer" src = "external_body_defer.js"></script>
    <!--Body外部脚本 External Body Script-->
    <script type="text/javascript" src = "external_body.js"></script>
    <script type="text/javascript">
      document.getElementsByTagName("button")[0].onclick = function(){console.log(result);} ;
    </script>
  </body>
</html>

  

从上面可以看出几个问题:
  首先,IE9以下不支持DOMContentLoaded(后面会说明这个情况)
  其次,验证了上面说的Chrome和Firefox行内脚本不支持defer属性
  最后,defer确实达到了延迟执行的目的,没有阻塞后面脚本的加载和执行。但是耗时的操作还是会阻塞DOMContentLoaded事件,而大多数情况下大家都会把页面初始化的脚本附加在DOMContentLoaded事件上,所以defer方法还是不能很好解决这个问题

END

虽然通过脚本后置和异步加载可以降低脚本加载对页面的影响,但是就算是实现了异步加载,但是由于浏览器的脚本解析的单线程的,所以脚本执行的时候仍然会阻塞整个页面(当然除了使用Web Worker),这时候用户是无法完成正常交互的,所以要想真正彻底的优化页面加载,还需要从代码的优化开始。

时间: 2024-10-09 22:28:19

JS之脚本延迟的相关文章

JS的脚本语言

js的脚本语言全程javascript在网页里面使用的脚本语言:分类:1.嵌入网页里面2.在外部脚本标签可以写在网页的任何地方,但一般都写在网页的底部:<script type="text/javascript"></script>代表这是一个脚本:二.注释语法样式表的注释:单行注释用//表示:多行注释/**/可以注释多行文字: <!---->是在网页里面的注释:三.数据类型的分类:1.整型(存放整数的数据)用int来表示整型:2.flioat(单精

将js/css脚本放到png图片中的实践。

http://blog.csdn.net/zswang/article/details/7061560 将js/css脚本放到png图片中的实践. 标签: 脚本functionxmlhttprequesturl浏览器加密 2011-12-11 21:50 13788人阅读 评论(26) 收藏 举报  分类: 前端技术 png canvas 压缩 版权声明:本文为博主原创文章,未经博主允许不得转载. 起因 高级浏览器支持data协议,如: 参考:http://en.wikipedia.org/wi

没有文件扩展&quot;.js&quot;的脚本引擎 解决办法

在命令行运行JScript脚本时,遇到如下的错误提示: “输入错误: 没有文件扩展“.js”的脚本引擎.” 这样的错误,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联. 如系统中安装了ULTRAEDIT或者E钻加密软件等,就需要去掉关联: 或者如下解决方法: 在运行中输入“regedit”进入注册表, 只需要把[HKEY_CLASSES_ROOT\.js] 项下的那个默认值改成 "JSFile" 就可以正常运行JS 文件了.

检测app使用了多少个xib和js的脚本(python)

检测app使用了多少个xib和js的脚本(python) by 伍雪颖 #!/usr/bin/env python # coding=utf-8 import os, sys def countTargetFile(targetDir): resultStr = '' targetTypes = ['.nib', '.m', '.js'] for targetType in targetTypes: targetCount = 0 for root, dirs, files in os.walk

让html里的js脚本延迟5秒运行

setTimeout( function(){ //add your code}, 5 * 1000 );//延迟5000毫米

JS(脚本语言)后半部分、语句:①if...else、②switch:break

JS(脚本语言) 七.运算法表达式 1.数字运算符:+   -  *  /  %  强制类语言:整数/整数=整数(小数点舍) 2.逻辑运算符:&&并   :||或   :! 3.其它:①字符串的拼接“+”  ②三元运算符:a==b?"A等于B":"A不等于B"; 4.比较运算符:① ==  等于 ②!=   不等于③  >=  大于等于 ④<=  小于等于 ⑤>  大于 < 小于 语句 一.顺序: 如:var a=10; va

JS(JavaScript)脚本库的积累

在现在互联网盛行的时代,使得B/S架构飞速发展.曾经在大学的时候我一直都梦想着毕业后要找一个像腾讯这样大企业做C/S方面的开发工作(其实现在腾讯也有很多B/S软件),因为C/S体验度非常高,感觉非常好.但是此时此刻,我却没有这样的想法了.这是为什么呢?对于有经验的软件工程师都很清楚,B/S的程序部署在服务器,客户端只需要浏览器即可使用,而C/S需要客户在终端安装客户端程序,所以B/S在维护和升级方面的简易性上,无疑有独有优势,而且对客户端的硬件要求相对于C/S软件一般都要低.B/S当然它也有它的

初学JS之脚本语言简介

1. 什么是脚本语言? 脚本语言又被称为扩建的语言,或者动态语言,是一种编程语言,用来控制软件应用程序,脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译.是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言.(摘自百度百科) 2. 有哪些主流的脚本语言? 在2014年编程语言排行中,排在7,8,9,10,11位的都是主流的脚本语言. 下面就简单的介绍下他们的具体作用和特点: 1.1 PHP :  最初的名字是Personal

投票系统 &amp; 简易js刷票脚本

早就听说有什么刷票脚本,微博投票等等相关的投票都有某些人去刷票. 试一下吧,兴许自己也会刷票呢?捣鼓了几个小时,终于有所眉目. (1)投票系统 要刷票,就得先有个投票界面. 当然,可以直接去各个投票网站就行,不过这里还是自己弄个投票页面,方便自己. 页面大致如下  或者 查看演示 照理,界面很简洁,但也基本有了投票的基本功能. 原始规则是:只能投一次票,然后提示成功,然后按钮不可用. 都是原生JS,DOM操作不灵活的可以借此练练手.当然,用jq将会很便捷. html/css部分 <!DOCTYP