熟悉的< script >标签

作为前端开发的小伙伴,一看到< script >标签,是不是特别熟悉,因为前端开发的小伙们每天基本都会使用该标签,但是仔细想想真的对< script >标签了解吗,它的的作用是什么?它的位置应该放在哪?为啥这样放?它有几个属性?每个属性是干什么的?当然有些小伙伴已经知道个大概了,那么咱们就带着这几个问题,来真正的了解一下熟悉的< script>标签

1 < script > < /script >标签的产生

我们经常使用的< script > < /script >标签,大家都知道它是放在web核心语言HTML的标签,当初在开发JavaScript的时候,远景公司,为了解决一个重要的问题,就是如何做到JavaScript既能与HTML页面共存,又不影响页面的显示效果,经过尝试、纠错和争论,最终决定就是给web增加统一的脚本支持。这些早期的很多做法也被保留了下来,并正式纳入HTML规范当中。这就是< script>的产生 ,可以查看《有关javascript的发展史》

2 < script > < /script >标签的属性

前端开发的小伙伴看这个熟悉的< script > < /script >标签,能回答出来有几个属性吗?可能聪明的小伙伴已经知道了,6个!没错就是6个。

  • 1 type
  • 2 src
  • 3 defer
  • 4 async
  • 5 language
  • 6 charset

大家对这个6个属性,比较熟悉的可能依次是 type、src、async、defer,剩下的哪两个可能就不太熟悉了,接下咱们就一起看一下这些属性的用途,这6个属性都是可选的。

2.1 type属性。

前端小伙伴一下到type属性就会想到type='text/javascript',其实type属性默认值就是text/javascript,type是代替已经废弃的language属性,表示编写代码使用的脚本语言的内容类型(也可以成为MIME类型),虽然text/javascript和text/ecmascript都已经不被推荐使用了。但是大家一致用text/javascript,它还有其他属性值如
application/x-javascriot(但是这个属性会导致脚本会被忽略)
application/javascript|applicationecmascript(考虑到浏览器兼容,当然现在的浏览器不用考虑这些)

2.2 src属性

前端小伙伴对src的属性的熟悉度不会低于type,因为现在js的开发一把都是放在js文件中,这样有利于集中开发和html文档清洁。
一般的情况下大家都会在src的属性值中填写一个相对路径或者与当前域名一直的js路径,因为这样可以保证js文件的来源和安全
某些情况下src的属性值也可能是一个非同域名的地址,但是这个地址最好是自己知道并可以维护的地址,这样可能会出现跨域脚本攻击,得到以下敏感信息,来操作你的用户信息和账户金额等
大家看一下下面,会不会在控制台输出index.js字符串

<html>
<head></head>
<body></body>
< script src='/index.js' > 
    console.log('index.js')
< /script >
</html>

复制代码

答案是不能,因为当使用了src外部资源的时候,浏览器就不会再解析执行< script>内部的代码块了。

2.3 defer属性

该属性是html4.01为< script>标签放在< head>中定义的
,在执行的时候不会影响到页面构造。

//index.js
   document.getElementById('root')
// index.html
<html>
<head>
< script src='/index.js' defer='defer' > < /script >
</head>
<body>
    <div id ='root'></root>
</body>

</html>
复制代码

目的是告诉浏览器,可以立即下载js,但是延迟执行代码。

//index1.js
   document.getElementById('root')
// index.html
//index2.js
   document.getElementById('root')
// index.html
<html>
<head>
< script src='/index1.js' defer='defer' > < /script >
< script src='/index2.js' defer='defer' > < /script >
</head>
<body>
    <div id ='root'></root>
</body>

</html>
复制代码

但是在HTML5的规范中要求脚本按照它们出现的先后顺序执行,因此第一个延迟执行的脚本会先于第二个延迟执行,而这两个脚本会先于DOMContentLoaded事件执行。
实际上在不支持html5规范的浏览器上,延迟不一定会按照顺序执行,也不一定会先于DOMContentLoaded事件执行,因此一个最好包含一个延迟脚本

2.4 asycn 异步脚本

HTML5为< script>元素定义了async属性。这个属性与咱们看的上面的defer类似,async只适合外部脚本文件,告诉浏览器立即下载文件,但于defer不同的async并不保证按照它们的出现先后顺序执行

//index1.js
   document.getElementById('root')
// index.html
//index2.js
   document.getElementById('root')
// index.html

<!DOCTYPE html>
<html>
<head>
< script src='/index1.js' async > < /script >
< script src='/index2.js' async > < /script >
</head>
<body>
    <div id ='root'></root>
</body>

</html>
复制代码

上面代码不确定 index1.js会先执行与index2.js,所以一定要保证index2.js不依赖与index1.js

2.5 language 属性

该属性已被废弃,咱们大家只做了解,原来用于表示编写怠慢使用的脚本语言,(JavaScript、JavaScript1.2或者VBScript),但是大多数浏览器都会忽略这个属性,因此没有必要在使用了。

2.6 charset 属性

可选。表示通过 src 属性指定的代码的字符集。由于大多数浏览器会忽略它的值, 因此这个属性很少有人用。

3 < script > < /script >的使用

3.1 嵌入使用,看代码

<!DOCTYPE html>
<html>
<head>


</head>
<body>
    <div id ='root'></root>
</body>
< script  > 
    function sayHi(){
         console.log('Hi')
    }
  
< /script >
</html>
复制代码

包含着< script>内部的代码将被从上到下依次解释,解释器解释一个函数的定义,然后将该定义保存到自己的环境中。在解释器对< script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或者显示。
在使用< script> 嵌入JavaScript代码时,不要在代码证任何地方出现“”字符串。

<!DOCTYPE html>
<html>
<head>


</head>
<body>
    <div id ='root'></root>
</body>
< script  > 
    function sayHi(){
         console.log("< /script >"")
    }
  
< /script >
</html>
复制代码

在浏览器中加载时会出现一个错误。

3.2 外部引入

<!DOCTYPE html>
<html>
<head>
< script src='/index1.js' async > < /script >
</head>
<body>
    <div id ='root'></root>
</body>

</html>
复制代码

这种引入方式和嵌入的加载顺序一样,但是多了一步下载流程。但是他的好处是非常大的,

  • 1可以统一集中的管理开发js
  • 2相比嵌入式对html的整洁性有很大的太高
  • 3 有利于分离开发

虽然有好处很大,但是也会出现以下加载位置或者加载顺序的问题。
从上面的得到,在浏览器加载的时候,浏览器只会一心一意的加载解析js代码,其他的工作都会先放下,那么问题来了。

<!DOCTYPE html>
<html>
<head>
< script src='/index1.js'> < /script >
</head>
<body>
    <div id ='root'></root>
</body>

</html>
复制代码

如果index1.js代码解析的比较慢的话,页面就会出现一个空白页面。
如果index1.js代码解析的很快的话,由于index1.js中操作了某个dom其实,是无效的。
根据咱们了解的< script>标签的 async 和 defer的属性咱们可以解决,空白页面的问题。
但是async 和 defer的属性都有自己的局限性

  • 1 async 能够保证不立即执行js代码,但是无法保证两个外链代码的执行顺序
  • 2 defer 虽然规定了,能够保证不立即执行js代码,保证外链代码的执行顺序,但是一般浏览器不是这么做的

那么最好的解决方案是,需要把< script >标签放在底部

这就是我们常用的< script>大家是不是有跟进一步的了解这这个标签,欢迎大家补充不足的地方,欢迎留言点赞

转载于:https://juejin.im/post/5c47ce39e51d4544390b4e4b

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来为您详细解答一下。 1. HTML和HTML5的基本结构 HTML5相对于HTML4,增加了很多新的特性和标签,比如video, audio, canvas等等。HTML5的结构相对于HTML4也更加严谨,其中头部元素和文档类型声明的标签也有所变化。 HTML5的结构如下: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>页面标题</title> </head> <body> 页面内容 </body> </html> ``` 其中,`<!DOCTYPE html>`声明文档类型为HTML5,`<html>`表示页面的根元素,`<head>`包含了网页的元数据,如标题、描述、关键字等等,`<meta>`用于设置网页的元数据,`<title>`定义网页的标题,`<body>`包含了页面的主要内容。 2. HTML头部相关标签 HTML头部相关标签主要包括`<meta>`、`<title>`和`<link>`标签。 `<meta>`标签用于设置网页的元数据,如网页的编码格式、关键字、描述等等。下面是一个例子: ``` <meta charset="UTF-8"> <meta name="keywords" content="关键字1, 关键字2"> <meta name="description" content="网页描述"> ``` `<title>`标签用于设置网页的标题,显示在浏览器的标题栏中。 ``` <title>网页标题</title> ``` `<link>`标签用于引入外部资源,如CSS文件和JavaScript文件。 ``` <link rel="stylesheet" href="style.css"> <script src="script.js"></script> ``` 3. HTML图像标签的用法 HTML图像标签主要是`<img>`标签,用于在网页中插入图片。下面是一个例子: ``` <img src="image.jpg" alt="图片描述"> ``` 其中,`src`属性指定图片的URL,`alt`属性用于设置图片的描述,当图片无法显示时,会显示该描述。 4. HTML文本控制标签的用法 HTML文本控制标签主要包括标题标签`<h1>`~`<h6>`、段落标签`<p>`、加粗标签`<strong>`、斜体标签`<em>`等等。 ``` <h1>标题1</h1> <h2>标题2</h2> <h3>标题3</h3> <p>段落</p> <strong>加粗文本</strong> 斜体文本 ``` 实现图片混排效果,可以使用CSS的`float`属性和`clear`属性来控制图片的位置和换行。下面是一个例子: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图片混排效果</title> <style> img { float: left; margin-right: 10px; margin-bottom: 10px; } p { clear: both; } </style> </head> <body> <img src="image1.jpg" alt="图片1"> <p>这是一段文字,这是一段文字,这是一段文字,这是一段文字,这是一段文字,这是一段文字,这是一段文字。</p> <img src="image2.jpg" alt="图片2"> <p>这是另一段文字,这是另一段文字,这是另一段文字,这是另一段文字,这是另一段文字,这是另一段文字,这是另一段文字。</p> </body> </html> ``` 上面的例子中,我们使用了`float`属性将图片向左浮动,同时设置了右边和下边的外边距,使得图片与文字之间有一定的间隔。为了避免文字紧贴着图片排列,我们使用了`clear`属性清除浮动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值