2.HTML中使用javascript

160 阅读1分钟

<script> 元素

将js插入html中主要方法是使用 script元素,主要具有以下几个属性,都是可选的

属性描述
async表示应该立即下载脚本,但是异步下载, 下载完后立即执行(针对外部脚本)
defer表示应该立即下载脚本,但是异步下载, 会等待页面其他内容加载完毕之后才会去执行脚本(针对外部脚本)
src需要外部引入的js文件(支持跨域)
type代码块中的脚本语言内容类型,按照惯例,这个值始终是 text/javascript , 如果这个值是 module ,代码会被当作 es6 的模块进行解析,只有这个时候,代码中才支持 importexport

使用 <script> 方式有两种,一种是直接写在标签体内, 一种是通过 src 去引入外部的 js 文件

  • 标签内

包含在 <script>标签内的代码会被从上到下进行解析

在使用行内js的时候, 要注意代码中不能出现字符串</script>

<script>
    console.log('</script>') // error: Unterminated string literal
</script>

浏览器在解析的时候看到</script>后,会当作他是闭标签,想避免这个问题,只需要加上转义字符即可

<script>
    console.log('<\/script>')    
</script>
  • 外部引入

如果要使用外部引入的js,就必须要使用src去指向一个外部的地址,

如果使用了src属性,标签内部的代码就不会被执行了,浏览器只会下载并执行脚本文件,而会忽略标签内的代码

推迟执行脚本

<script>元素定义了 defer 的属性,这个属性表示告诉浏览器立即执行下载脚本,但是会延迟执行,会等整个页面都解析完毕之后在运行

异步执行脚本

<script>元素定义了async的属性,这个属性表示告诉浏览器立即执行下载脚本,但是会延迟执行,与defer 不同的是,defer会等整个页面都解析完毕之后在运行,而async会等下载完之后立即执行,标记为async的属性不能保证能按照他们出现的次序执行

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Static Template</title>
  <script async src="./async1.js"></script>
  <script defer src="./defer.js"></script>
  <script async src="./async2.js"></script>
</head>

<body>
  <script>
    console.log('行内script')
  </script>
</html>

image.png

image.png

动态加载脚本

除了<script>标签,我们还可以使用js中的DOM API 去创建一个script标签进行加载

<script>
    const script = document.createElement('script');
    script.src = "./async1.js"
    document.head.appendChild(script)
    console.log('行内script')
</script>

默认情况下,这种方式创建的js会被附上async 属性,如果你不想使用异步方式,可以手动更改为false

script.async = false;

<noscript>标签

针对早起的浏览器不支持script标签,需要一个页面的优雅降级的方法,最终<noscript>出现,用于给不支持js的浏览器提供代替的内容

符合以下条件会显示<noscript>标签内容

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

总结

js是通过<script>标签嵌入html中的, 要么是将js脚本写在标签内部,要么通过src去引入外部脚本,src的优先级大于标签内部的

可以使用asyncdefer来改变js的加载顺序

对于不支持js的浏览器,可以使用<noscript>标签来进行优雅降级