zoukankan      html  css  js  c++  java
  • 在HTML中使用JavaScript

    Go ahead,someone is waiting for you in the future.

    <script>元素

    使用<script>元素可以把JavaScript插入到HTML页面中,或包含外部的JavaScript文件。

    1.<script>元素的基本属性

    HTML4.01为<script>元素定义了5个属性:

    • charset:可选,表示通过src属性指定的代码的字符集,但大多数浏览器会忽略它的值。
    • defer:可选,表示脚本可以延迟到文档完全被解析和显示后再执行,只对外部脚本文件有效,IE7及更早版本可以对嵌入脚本使用。
    • language:已废弃,原来用于表示编写代码使用的脚本语言,大多数浏览器会忽视这个属性。
    • src:可选,表示要执行代码的外部文件。
    • type:可选,可以看成是language的替代属性,也可称为MIME类型(多用途互联网邮件扩展类型)。

    虽然text/javascript和text/ecmascript都已经不被推荐使用,但人们一直使用的都还是text/javascript。
    虽然服务器在实际传送JavaScript文件时使用的MIME类型通常是application/x-javascript,但是将type属性设置为application/x-javascript却可能导致脚本被忽略。
    另外,在非IE浏览器中还可使用以下值作为type的值:application/javascript和application/ecmascript。 考虑到约定俗成和兼容性,目前type属性的默认值依旧还是text/javascript。


    勘误:在《JavaScript高级程序设计第3版》的第二章中写到:

    HTML4.01为<script>元素定义了下列6个属性:

    • async:可选,表示应该立即下载该脚本,但不应该妨碍页面中的其他操作,只对外部脚本文件有效。
    • charset:可选,。。。

    此处async属性是HTML5新增的,而非HTML4.01定义的。


    2.使用<script>元素的方式

    使用<script>元素的方式有两种:直接在页面嵌入JavaScript代码,和包含外部JavaScript文件。
    包含<script>元素内部的JavaScript代码将被从上至下依次解释,只有解析完前面的一个<script>元素中的代码后,才会开始解析下一个。
    在解释器对<script>元素(不使用defer和async属性)内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示。
    使用<script>标签嵌入JavaScript代码时,避免在代码中间出现</script>字符串从而导致脚本提前结束,必要时可以通过转义字符</script>来解决这个问题。
    在XHTML文档中,可以将<script></script>标签简写为<script />,但不能在HTML文档中使用这种语法。
    在包含外部JavaScript文件的<script>元素,即带有src属性的<script>元素中,不应该在其<script></script>标签之间包含额外的JavaScript代码,因为这些额外代码会被忽略。

    3.<script>元素的位置

    交互性优先的网页一般会把<script>标签放在<head>标签里面,强调用户体验而交互性稍后的网页一般会把<script>标签放在<body>标签底部。
    <script>标签放在<head>标签里面,意味着必须等到全部JavaScript代码和其他代码(<head>元素中可能还包含CSS文件)都解析执行完毕,才能开始呈现网页内容(浏览器解析<body>标签时才开始呈现内容),在这段延迟期页面都是一片空白,因此目前流行的做法,是把全部JavaScript引用放在<body>元素中页面内容的后面,即页面底部。

    4.延迟执行脚本

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

    HTML4.0.1(IE6也支持)为<script>标签定义了defer属性,这个属性的用途是表明脚本在执行时不会影响页面的构造,也就是说浏览器会立即下载脚本,但延迟到整个页面都解析完(即解析到</html>标签)才执行。
    虽然HTML5规范要求脚本按照它们出现的先后顺序执行,且延迟脚本会先于DOMContentLoaded事件执行,但是实际情况中,延迟脚本并不一定按顺序执行,也不一定在DOMContentLoaded事件触发前执行,所以最好只包含一个延迟脚本。
    HTML5中已明确规定,defer属性只适用于外部脚本文件,支持HTML5的浏览器会忽略嵌入脚本的defer属性(IE4-IE7仍支持嵌入脚本的defer属性,IE8+则完全支持HTML5的规定)。
    IE4、Firefox 3.5、Safari 5和Chrome是最早支持defer属性的浏览器,其他浏览器会忽略这个属性,周全起见,把延迟执行脚本放在页面底部依然是最佳选择。

    5.异步脚本

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

    HTML5为<script>标签定义了async属性。与defer属性类似,async只适用于外部脚本文件,它会告诉浏览器立即下载脚本。与defer不同的是,标记为async的脚本下载完会立即执行。
    异步脚本同样不保证按照指定的顺序先后执行,因此这些脚本之间应互不依赖。
    添加异步脚本的目的,是为了不让页面等待脚本下载和执行,从而异步加载页面其他内容,因此最好不要在异步脚本中修改DOM。
    异步脚本一定会在load事件前执行,但可能会在DOMContentLoaded事件之前或之后执行。
    在XHTML文档中,要把async属性设置为async="async"。
    支持异步脚本的浏览器:Firefox 3.6、Safari 5和Chrome。

    6.不推荐使用的语法

    早期,不支持JavaScript的浏览器(如Mosaic)会把<script>元素内的内容直接输出到页面,当时的解决方案是将JavaScript代码包含在一个HTML注释中,如下:

    <script><!-- function(){ alert("hi"); }(); --></script>

    如此,不支持JavaScript的浏览器会忽略<script>标签中的内容,而支持的则必须进一步确认是否包含需要解析的JavaScript代码。由于目前所有浏览器都已支持JavaScript,因此不再推荐这种语法。
    在XHTML模式下,脚本会因包含在XML注释中而被忽略。

    嵌入代码与外部文件

    在HTML中嵌入JavaScript代码虽然没有问题,但一般的做法是尽可能使用外部文件来包含JavaScript代码,这里并没有硬性规定必须要使用外部文件,但是这样做有诸多优点:

    • 可维护性:在不触及HTML代码的情况下集中精力编辑JavaScript。
    • 可缓存:如果有多个页面使用同一个文件,那这个文件只需下载一次。
    • 适应未来:HTML和XHTML包含外部文件的语法是相同的,从而规避了一些问题。

    文档模式

    IE5.5引入了文档模式的概念,它通过使用文档类型切换来实现。最初的两种文档模式是:混杂模式和标准模式,后又加入一个准标准模式。
    如果在文档开始处没有文档类型说明,则浏览器默认开启混杂模式(不同浏览器在此模式下差异巨大)。
    标准模式开启可以使用多种文档类型:

    • HTML 4.01 严格型
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    • XHTML 1.0 严格型
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    • HTML 5
      <!DOCTYPE html>

    准标准模式可以使用过渡型或框架集型文档类型来触发:

    • HTML 4.01 过渡型
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    • HTML 4.01 框架集型
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    • XHTML 1.0 过渡型
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transtional.dtd">
    • XHTML 1.0 框架集型
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

    因为准标准模式与标准模式差异很小,所以标准模式通常指的是两者之中任意一种。

    <noscript>元素

    早期,不支持JavaScript的浏览器都面临着一个问题,如何让页面平稳的退化为普通页面。最终的解决方案是创造一个<noscript>元素,用来在不支持JavaScript的浏览器中显示替代内容。这个元素可以包含能出现在<body>中的任何HTML元素---除了<script>
    当且仅当符合以下任意一个条件,浏览器都会显示<noscript>的内容:

    • 浏览器不支持脚本;
    • 浏览器支持脚本,但脚本被禁用。
  • 相关阅读:
    Vue数据绑定和响应式原理
    JavaScript实现MVVM之我就是想监测一个普通对象的变化
    缓存的理解
    理解promise 02
    线段与线段的交点
    线段与线段交点的推导公式
    promise你懂了吗?
    wx import require的理解
    webgl example1
    sublime2常用插件
  • 原文地址:https://www.cnblogs.com/zhangjun2013551829/p/8657520.html
Copyright © 2011-2022 走看看