在 HTML 中使用 JavaScript

本章内容

  • 使用 <script> 元素
  • 嵌入脚本与外部脚本
  • 文档模式对JavaScript的影响
  • 考虑禁用JavaScript的场景

2.1 <script>元素

向HTML中插入Javascript的主要方法就是通过<script>元素,所以它是一个HTML元素。HTmML4.01为<script>定义了下列6个属性。

  • async: 可选。表示立即下载脚本,单不妨碍页面中其他操作。只对外部脚本文件有效。
  • charset: 可选。表示通过src属性指定的代码的字符集。(很少用)
  • defer: 可选。表示脚本可以延迟到文档完全解析和*显示之后再执行。
  • language: 已废弃。
  • src: 可选。表示包含要执行的外部文件代码地址。
  • type:可选。language的替代属性;表示编写代码使用的脚本语言的内容类型(MIME),一般不设置默认为 text/javascript

一般使用<script>元素内部的JavaScript代码时,只需为它指定 type 属性,如下:

<script type="text/javascript">
  function sayHi(){
    alert("Hi!")
  }
</script>

注意!!! 不要在代码中任何地方出现“</script>”,因为出现此标签,解析器就会认为这是结束标签而出现错误,解决方法是 将结束标签转义后 <\/script>

外部js文件引用需要制定src属性,如下:

<script type="text/javascript" src="example.js"></script>

2.1.1 标签的位置

按照惯例,所有的 <script>元素都应该放到页面的 <head>元素中,如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Example Page</title>
    <script type="text/javascript" src="example.js"></script>
  </head>
  <body>
    <!-- 这里放内容 -->
  </body>
</html>

但是这样会阻塞页面渲染,因为解析器是单线程解析文档对象,所以在开发中一般会将<scrit>元素放到页面元素之后,如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Example Page</title>
  </head>
  <body>
    <!-- 这里是内容 -->

    <script type="text/javascript" src="example.js">
  </body>
</html>

2.1.2 延迟脚本

之前提过,HTML 4.01 为<script> 标签定义了 defer 属性。这个属性让脚本在执行时不会影响页面的构造,即告诉脚本会被延迟到整个页面解析完成后再运行。 立即下载,延迟运行

<!DOCTYPE html>
<html>
  <head>
      <title>Example Page</title>
      <script type="text/javascript" defer="defer" src="example.js">
  </head>
  <body>
    <!-- 这里是内容 -->
  </body>
</html>

2.1.3 异步脚本

HTML5 为<script>元素定义了async属性。这个和 defer 属性类似,都用于改变处理脚本行为。同样只适用于外部脚本,但不同的是:async属性并不保证按照指定他们的顺序先后执行:

<!DOCTYPE html>
<html>
  <head>
      <title>Example Page</title>
      <script type="text/javascript" async src="example1.js">
      <script type="text/javascript" async src="example2.js">
  </head>
  <body>
    <!-- 这里是内容 -->
  </body>
</html>

上面代码中,第二个脚本可能先于第一个脚本执行。所以运用此属性,首先要确保两个文件之间不互相依赖,异步脚本不要在加载期间修改DOM

2.2 <noscript>元素

此元素存在是因为早起浏览器遇到当浏览器不支持JavaScript时如何让页面平稳的退化。以替代不支持<script>的浏览器页面:

  • 浏览器不支持脚本
  • 浏览器支持脚本, 但脚本被禁止
<html>
  <head>
      <title>Example Page</title>
      <script type="text/javascript" async src="example1.js">
      <script type="text/javascript" async src="example2.js">
  </head>
  <body>
    <!-- 这里是内容 -->
    <noscript>
      <p>本页面需要浏览器开启支持JavaScript</p>
    </noscript>
  </body>
</html>