HTML中的JavaScript

<script>元素

形式

  • 行内

    其中的代码会被从上到下解释。计算完成之前,页面其余内容不会被加载,也不会被显式。

  • 外部

    下载与解析都会阻塞HTML解析,扩展名.js不是必需的,前提是确保服务器返回正确的MIME类型。

    同时行内有JavaScript代码的话,行内代码会被忽略。

    浏览器在解析资源时,会向src指定的路径发送一个GET请求,以取得相应资源。这个初始的请求不受浏览器同源策略限制(但仍受父页面HTTP/HTTPS协议的限制),但返回并被执行的JavaScript则受限制。

    优点

    • 可以让我们通过不同的域分发JavaScript(确保是自己所有或者可信来源)
    • 可以动态加载和执行JavaScript代码
    • 可以将内容集中管理,提高可维护性,可独立编辑,可多处共享,可更好利用缓存(提高加载速度)
    • 不至于让HTML文件过大
    • 兼容HTML和XHTML(不必额外考虑XHTML中的注释hack)
    • 对于支持SPDY/HTTP2的浏览器,可以轻量、独立JavaScript组件形式向客户端送达脚本,从同一个地方取得一批文件,并将它们逐个放到浏览器缓存中。(Push Cache?)

属性

  • src:要执行的代码的外部文件。一个URL。

  • type:代码块中脚本语言的内容类型(MIME类型)

    惯例为"text/javascript"。

    JavaScript文件的MIME类型通常是"application/x-javascript",不过给type设置这个值可能导致脚本被忽略。

    设置为"module"会被当作ES6模块,可使用import和export关键字。行为类似加defer,模块依赖关系也会被下载,等HTML解析完成后执行;如果再设置async,行为类似async,模块依赖关系都下载完后就开始执行(无论HTML解析是否完成)

  • defer(只对外部脚本文件有效,IE7及更早版本中行内脚本也可指定)不阻塞文档解析

    脚本下载与HTML解析并行,等HTML解析完成后每个脚本会有序执行(HTML5规定的有序,并在DOMContentLoaded事件(所有同步js代码执行完毕后触发)之前执行,实际不一样按顺序,且加载慢的话可能在Loaded事件之后执行,因此最好只包含一个这样的脚本)

    考虑兼容,最好还是把要延迟执行的脚本放在页面底部。

    XHTML中指定defer需要写成:defer="defer"

  • async(只对外部脚本文件有效)下载过程不阻塞文档解析

    下载脚本与HTML解析并行。不阻塞其他页面动作(如下载资源或其他脚本加载(读取?))

    脚本执行时还是会中断HTML解析,不保证执行顺序与插入DOM的顺序一致。

    动态导入的脚本(createElement,.src),默认append到文档中的script会异步执行(类似async),如果需要的js按顺序执行,需要设置async为false。

    不应在页面加载期间修改DOM,与其他异步脚本没有依赖关系

    保证会在页面的load事件(所有资源完成加载后触发)前执行。

    XTML中指定async需要写成:async="async"

  • language:(废弃)

  • charset:(很少用),使用src属性时指定的代码字符集

  • crossorigin:配置相关请求的CORS(跨源资源共享)设置。默认不使用CORS。

    属性值:

    • anonymous 配置文件请求不必设置凭据标志(不携带cookie)

    • use-credentials 设置凭据标志,意味着出站请求会包含凭据(携带cookie)

    • 空或非法值 默认当作anonymous

    这个配置主要是想在当前项目中引用跨域的资源文件时,能捕捉到具体的报错信息(window.onerror

    如果设置了crossorigin,浏览器启用CORS访问检查,服务器端必须返回一个Access-Control-Allow-Origin的header,否则资源无法访问。

  • integrity:允许 比对接收到的资源和指定的加密签名以验证子资源完整性(SRI, Subresource Integrity)。(不是所有浏览器都支持)

    如果接收到的资源的签名与该属性指定的签名不匹配,则页面报错,脚本不执行。可用于确保CDN(内容分发网络,Content Delivery Network)不会提供恶意内容(XSS风险)。

放置位置

head还是body?

过去都集中放置在页面的<head>标签内,这会导致必须把所有JavaScript代码都下载、解析和解释完后,才开始渲染页面。如果JavaScript内容过多,就会导致页面渲染的明显延迟。

现代Web应用通常把所有JavaScript引用放在<body>元素中的内容后面。防止渲染被阻塞导致的白屏。JS只能获取已经解析的DOM。

动态加载脚本

使用DOM API。默认以异步方式加载,相当于添加了async属性。不是所有浏览器都支持async属性,要统一行为,可以明确设置async为false(同步加载)。

以此种方式获取的资源对浏览器的预加载器不可见。会严重影响它们在资源获取队列中的优先级。可能会严重影响性能。要让预加载器知道这些动态请求文件的存在,可以在文档头部显式地声明它们:

<link rel="preload" href="xxx.js">

XHTML

必须指定type属性且为"text/javascript"

编写代码的规则比HTML中严格,在HTML中,解析<script>元素会应用特殊规则,但XHTML中没有这些规则。例子:小于号<被解释成一个标签的开始

  1. 把小于号替换成对应的HTML实体形式&lt; ——影响阅读

  2. 把所有代码都包含到一个CDATA块中——可以包含任意文本的区块,其内容不作为标签来解析

    <script type="text/javascript"><![CDATA[
    function () {}
    ]]></script>

    在不支持CDATA块的非XHTML兼容浏览器中,需要使用JavaScript注释来抵消:

    <script type="text/javascript">
    //<![CDATA[
    function () {}
    //]]>
    </script>

XHTML模式会在页面的MIME类型被指定为"application/xhtml+xml"时触发,不是所有浏览器都支持

兼容

  • xml中的应用

  • noscript以及不支持JavaScript的浏览器

    • (Netscape联合Mosaic)把脚本代码包含在一个HTML注释中,如:

      <script><!--
      function () {}
      //--></script>

      现在已不必再使用。在XHTML模式下,这样写也会导致脚本被忽略,因为代码处于有效的XML注释当中。

    • <noscript>元素

      可以包含任何可以出现在<body>中的HTML元素。触发条件:

      浏览器不支持脚本;浏览器对脚本的支持被关闭

文档模式的影响doctype

主要区别:主要体现在通过CSS渲染的内容方面,对JavaScript也有一些关联影响(副作用)

  • 混杂模式quirks mode

    让IE像IE5一样(支持一些非标准特性)

    以省略文档开头的doctype声明作为开关。——在不同浏览器中差异非常大,需要hack

  • 标准模式standards mode

    让IE具有兼容标准的行为

    <!-- HTML 4.01 Strict -->
    <!DOCTYPE ....> <!-- XHTML 1.0 Strict -->
    <!DOCTYPE ...> <!-- HTML5 -->
    <!DOCTYPE html>
  • 准标准模式almost standards mode

    主要区别在于,如何对待图片元素周围的空白。

    通过过渡性文档类型(Transitional)和框架集文档类型(Frameset)来触发。

    <!-- HTML 4.01 Transitional -->
    <!DOCTYPE ....> <!-- HTML 4.01 Frameset -->
    <!DOCTYPE ....> <!-- XHTML 1.0 Transitional -->
    <!DOCTYPE ...> <!-- XHTML 1.0 Frameset -->
    <!DOCTYPE ...>

JavaScript高级程序设计笔记02 HTML中的JavaScript的更多相关文章

  1. JavaScript高级程序设计笔记(一)

    ---恢复内容开始--- 前三章为基础知识,为了方便以后查看,所以比较啰嗦.这里对函数的基本操作没有记录. 1.JavaScript的实现 虽然 JavaScript 和 ECMAScript 通常都 ...

  2. JavaScript高级程序设计笔记之面向对象

    说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...

  3. javascript高级程序设计--笔记01

    概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型( ...

  4. javascript高级编程笔记02(基本概念)

    ParseInt()函数: 由于Number函数在转换字符串时比较复杂而且不合理,我们常常转换字符串都用parseInt函数, Parseint函数规则: 忽略字符串前面的空格,直到找到第一个非空格字 ...

  5. javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记

    1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获 ...

  6. JavaScript高级程序设计笔记 事件冒泡和事件捕获

    1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body> <div> click me! </div> & ...

  7. <javascript高级程序设计>笔记

    1.要讲一个值转换成其对应的Boolean类型 ,可以调用转型函数Boolean(). var message=“hello world!”; var messageAsBoolean=Boolean ...

  8. Javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)

    var obj = {'a':'a'}; var fun = function (){} console.log(typeof obj);//object console.log(typeof fun ...

  9. javaScript高级程序设计笔记 2

    Undefinde Null Boolean Number String    基本类型 Object    引用类型 只有引用类型才能动态的添加属性 赋值基本类型和引用类型也不相同,复制的基本类型的 ...

  10. javaScript高级程序设计笔记 1

    核心  ECMAScript 文档对象模型  DOM 浏览器对象模型 BOM 延迟脚本  defer typeof操作符      判断字符类型  返回   undefined  boolean  s ...

随机推荐

  1. python移动文件

    #移动文件(目录) shutil.move("oldpos","newpos") shutil.move("D:/知乎日报/latest/一张优惠券, ...

  2. ASP.NET Core WebAPI如何获得远程文件返回文件流给前端?

    一.根据网络路径把文件保存成byte[]返回给前端 项目采用的是前后端分离的模式,后端使用ASP.NET Core WebAPI方式,将文件流返回给前端. /// <summary> // ...

  3. 去中心化组件共享方案 —— Webpack Module Federation(模块联邦)

    在大型应用中, 我们可能会对其进行拆分,分成容器.主应用和多个子应用,使拆分后的应用独立开发与部署,更加容易维护.但无论是微应用.公共模块应用,都需要放到容器中才能使用. 如果多个应用之间希望资源共享 ...

  4. 洛谷 P1336 最佳课题选择 题解

    P1336 最佳课题选择 题解 状态:考虑\(f_{i,j}\)表示前\(i\)种论文里面,一共写了\(j\)篇,的最少花费时间. 转移策略:我们一次考虑每一种论文写多少篇.假设写\(k\)篇,\(k ...

  5. jmeter 二次开发详解

    背景: JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求.通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求.例如,可能需要添加自定义的 测试元件.报 ...

  6. Laf & 中大猫谱:让每一只流浪猫都有家

    猫谱简介 中大猫谱是一款辅助校园流浪猫救助的开源小程序项目,服务端使用 Laf 云开发. 猫谱主要功能包括:猫咪信息登记.照片分享.拍照识猫.公告和留言等.项目创立的初衷,是解决校园猫猫交流群里的一个 ...

  7. 细谈商品详情API接口设计

    一.引言 随着互联网技术的发展,商品详情信息的展示和交互变得越来越重要.为了提供更好的用户体验,我们需要设计一套高效.稳定且易于扩展的商品详情API接口.本文将详细探讨商品详情API接口的设计,包括接 ...

  8. Codeforces 1462F The Treasure of The Segments

    题意 给\(n(1\leq n\leq 2*10^5)\)个线段$[l_i,r_i] (1≤l_i≤r_i≤10^9) $,问最少删除几个线段,使得剩下线段中,有至少一个线段与所有线段相交. 分析 对 ...

  9. Hadoop单击模式运行wordcount例子

    1.进入Hadoop安装目录 cd /zwy/soft/hadoop-2.7.1 2.创建文件夹input mkdir input 3.写一段文字到文件file.txt echo "hell ...

  10. sqlite/mysql 省市县三级联动

    这个是sqlite的, 改下表结构, 就可以给mysql用了 CREATE TABLE ProvinceCityZone ( _id INTEGER PRIMARY KEY AUTOINCREMENT ...