美文网首页
2.从头学前端之如何在html中使用javascript

2.从头学前端之如何在html中使用javascript

作者: 我的昵称好听吗 | 来源:发表于2019-07-24 11:08 被阅读0次
    • 使用<script>元素
    • 嵌入脚本与外部脚本
    • 文档模式对JavaScript的影响
    • 考虑禁用 JavaScript 的场景
    使用<script>元素

    script 元素有6个属性:

    • async: 可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本。只对外部脚本文件有效。(个人理解:如果多个js指定了async属性,无法保证js按照顺序加载;如果js中有可以阻断js运行的代码如报错,或者alert,还是可能会阻断页面中的操作的)

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

    • defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有 效。IE7 及更早版本对嵌入脚本也支持这个属性。(个人理解:该属性和async一样,浏览器会单独开启一个线程去下载js,但是不会下载完成后和async一样立即执行,而是等到文档加载完成后再去解析,多个js文件使用defer属性可以保证加载的顺序)

    • language:已废弃。原来用于表示编写代码使用的脚本语言(如 JavaScript、JavaScript1.2 或 VBScript)。大多数浏览器会忽略这个属性,因此也没有必要再用了。

    • src:可选。表示包含要执行代码的外部文件。

    • type:可选。可以看成是 language 的替代属性;表示编写代码使用的脚本语言的内容类型(也称为 MIME 类型)。虽然 text/javascripttext/ecmascript都已经不被推荐使用,但人们一直以来使用的都还是 text/javascript。实际上,服务器在传送 JavaScript 文件时使用的 MIME 类型通常是 application/x–javascript,但在 type 中设置这个值却可能导致脚本被 忽略。另外,在非 IE 浏览器中还可以使用以下值: application/javascriptapplication/ecmascript。考虑到约定俗成和最大限度的浏览器兼容性,目前 type 属性的值依旧还是 text/javascript。不过,这个属性并不是必需的,如果没有指定这个属性,则其默认值仍为 text/javascript

    • 下图是google中js的类型(Content-TypeMIME):

      image.png

    使用<script>元素的方式有两种(在解析外部 JavaScript 文件(包括下载该文件)时,页面的处理也会暂时停止):

    • 直接在页面中嵌入 JavaScript 代码;
    • 包含外部 JavaScript 文件。

    在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属性。然后,像下面这 样把 JavaScript 代码直接放在元素内部即可:

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

    如果要通过<script>元素来包含外部 JavaScript 文件,那么 src 属性就是必需的。这个属性的值 是一个指向外部 JavaScript 文件的链接,例如:

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

    !!!需要注意的是,带有 src 属性的<script>元素不应该在其<script>和</script>标签之间再 包含额外的 JavaScript 代码。如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码 会被忽略

    无论如何包含代码,只要不存在 defer 和 async 属性,浏览器都会按照<script>元素在页面中 出现的先后顺序对它们依次进行解析。换句话说,在第一个<script>元素包含的代码解析完成后,第 二个<script>包含的代码才会被解析,然后才是第三个、第四个......

    标签的位置

    Web 应用程序一般都把全部 JavaScript 引 用放在<body>元素中页面内容的后面

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

    延迟脚本

    HTML 4.01 为<script>标签定义了defer 属性。这个属性的用途是表明脚本在执行时不会影响页 面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在<script>元素中设置 defer 属性,相当于告诉浏览器立即下载,但延迟执行。

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

    在这个例子中,虽然我们把<script>元素放在了文档的<head>元素中,但其中包含的脚本将延迟 到浏览器遇到</html>标签后再执行HTML5 规范要求脚本按照它们出现的先后顺序执行,因此第一 个延迟脚本会先于第二个延迟脚本执行,而这两个脚本会先于 DOMContentLoaded 事件(详见第 13 章) 9 执行。在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在 DOMContentLoaded 事件触发 前执行,因此最好只包含一个延迟脚本
    前面提到过,defer 属性只适用于外部脚本文件。这一点在 HTML5 中已经明确规定,因此支持 HTML5 的实现会忽略给嵌入脚本设置的 defer 属性。IE4~IE7 还支持对嵌入脚本的 defer 属性,但 IE8 及之后版本则完全支持 HTML5 规定的行为。
    IE4、Firefox 3.5、Safari 5 和 Chrome 是最早支持 defer 属性的浏览器。其他浏览器会忽略这个属 性,像平常一样处理脚本。为此,把延迟脚本放在页面底部仍然是最佳选择。

    异步脚本

    HTML5 为<script>元素定义了 async 属性。这个属性与 defer 属性类似,都用于改变处理脚本的行为。同样与defer类似,async只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer不同的是,标记为 async 的脚本并不保证按照指定它们的先后顺序执行。例如:

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

    在以上代码中,第二个脚本文件可能会在第一个脚本文件之前执行。因此,确保两者之间互不依赖 非常重要。指定 async 属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。 为此,建议异步脚本不要在加载期间修改 DOM
    异步脚本一定会在页面的 load 事件前执行,但可能会在 DOMContentLoaded 事件触发之前或之 后执行。支持异步脚本的浏览器有 Firefox 3.6、Safari 5 和 Chrome。

    嵌入代码与外部文件

    在 HTML 中嵌入 JavaScript 代码虽然没有问题,但一般认为最好的做法还是尽可能使用外部文件来 包含 JavaScript 代码。不过,并不存在必须使用外部文件的硬性规定,但支持使用外部文件的人多会强 调如下优点。

    • 可维护性:遍及不同 HTML 页面的 JavaScript 会造成维护问题。但把所有 JavaScript 文件都放在 一个文件夹中,维护起来就轻松多了。而且开发人员因此也能够在不触及 HTML 标记的情况下, 集中精力编辑 JavaScript 代码。
    • 可缓存:浏览器能够根据具体的设置缓存链接的所有外部 JavaScript 文件。也就是说,如果有两个 页面都使用同一个文件,那么这个文件只需下载一次。因此,最终结果就是能够加快页面加载的 速度。
    • 适应未来:通过外部文件来包含 JavaScript 无须使用前面提到 XHTML 或注释 hack。HTML 和 XHTML 包含外部文件的语法是相同的。

    <noscript>元素

    早期浏览器都面临一个特殊的问题,即当浏览器不支持 JavaScript 时如何让页面平稳地退化。对这 个问题的最终解决方案就是创造一个<noscript>元素,用以在不支持 JavaScript 的浏览器中显示替代 的内容。这个元素可以包含能够出现在文档<body>中的任何 HTML 元素——<script>元素除外。包含 在<noscript>元素中的内容只有在下列情况下才会显示出来:

    • 浏览器不支持脚本;
    • 浏览器支持脚本,但脚本被禁用。

    符合上述任何一个条件,浏览器都会显示<noscript>中的内容。而在除此之外的其他情况下,浏览器不会呈现<noscript>中的内容。 请看下面这个简单的例子:

        <html>
          <head>
              <title>Example HTML Page</title>
              <script type="text/javascript" defer="defer" src="example1.js"></script>   
              <script type="text/javascript" defer="defer" src="example2.js"></script>
          </head>
          <body>
              <noscript> 
                <p>本页面需要浏览器支持(启用)JavaScript。
              </noscript> 
          </body>
    </html>
    

    这个页面会在脚本无效的情况下向用户显示一条消息。而在启用了脚本的浏览器中,用户永远也不 会看到它——尽管它是页面的一部分。

    小结

    把 JavaScript 插入到 HTML 页面中要使用<script>元素。使用这个元素可以把 JavaScript 嵌入到 HTML 页面中,让脚本与标记混合在一起;也可以包含外部的 JavaScript 文件。而我们需要注意的地方有:

    • 在包含外部 JavaScript 文件时,必须将 src 属性设置为指向相应文件的 URL。而这个文件既可 以是与包含它的页面位于同一个服务器上的文件,也可以是其他任何域中的文件。
    • 所有<script>元素都会按照它们在页面中出现的先后顺序依次被解析。在不使用deferasync 属性的情况下,只有在解析完前面<script>元素中的代码之后,才会开始解析后面 <script>元素中的代码。
    • 由于浏览器会先解析完不使用 defer 属性的<script>元素中的代码,然后再解析后面的内容, 所以一般应该把<script>元素放在页面最后,即主要内容后面,</body>标签前面
    • 使用defer属性可以让脚本在文档完全呈现之后再执行。延迟脚本总是按照指定它们的顺序执行。
    • 使用async 属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。
    • 使用<noscript>元素可以指定在不支持脚本的浏览器中显示的替代内容。但在启用了脚本的情况下,浏览器不会显示<noscript>元素中的任何内容。

    相关文章

      网友评论

          本文标题:2.从头学前端之如何在html中使用javascript

          本文链接:https://www.haomeiwen.com/subject/wcitrctx.html