我应该在HTML标记的哪里放置<script>标记?

将JavaScript嵌入HTML文档中时,在哪里放置<script>标签和包含的JavaScript 的正确位置我似乎记得您不应该将它们放在本<head>节中,但是放在节的开头也<body>很不好,因为必须在完全呈现页面(或类似的东西)之前解析JavaScript。这似乎将末尾<body>作为<script>标记的逻辑位置

所以,在这里把正确的地方<script>标记?

(此问题引用了这个问题,在该问题中建议将JavaScript函数调用从<a>标签移动<script>标签。我专门使用jQuery,但更通用的答案也是合适的。)

木何鱼2020/03/09 20:52:59

您可以将脚本放在需要的地方,一个脚本并不比另一种方法更好。

情况如下:

页面是线性加载的,“自上而下”,因此,如果将脚本放在头部,可以确保它在所有内容之前都开始加载,现在,如果将其放入与代码混合的正文中,则可能导致页面加载难看。

识别好习惯并不取决于在哪里。

为了支持您,我将提及以下内容:

您可以放置​​:

并且页面将线性加载

页面与其他内容异步加载

该页面的内容将在加载完成之前和之后加载

好的做法是,什么时候实施?

我希望我能有所帮助,任何事情都可以回答我这个问题。

小小Eva2020/03/09 20:52:59

JavaScript标记的最佳位置是在标记后的文档代码末尾编写代码以加载文档,然后执行js代码。如果你写JQuery代码写

$(document).ready(function(){

//your code here...

});
凯阳光2020/03/09 20:52:59

对我而言,将脚本包含在HTML之后更有意义。因为大多数时候我需要在执行脚本之前先加载Dom。我可以将其放在head标签中,但我不喜欢所有文档加载侦听器的开销。我希望我的代码简短,甜美并且易于阅读。

我听说在head标签之外添加脚本时,Safari的旧版本有些古怪,但我说谁在乎。我不知道有人在用那种废话。

顺便问好问题。

宝儿Davaid2020/03/09 20:52:59

为了防止和UI阻塞,在body标记之前结束。

西里Sam2020/03/09 20:52:59

在HTML文档的末尾

因此,在执行时不会影响将HTML文档加载到浏览器中。

米亚小哥斯丁2020/03/09 20:52:59

我认为这取决于网页的执行情况。如果要显示的页面在未先加载JavaScript的情况下无法正确显示,则应首先包含JavaScript文件。但是,如果您无需先下载JavaScript文件就可以显示/呈现网页,则应将JavaScript代码放在页面底部。因为它将模拟快速的页面加载,并且从用户的角度来看,似乎该页面的加载速度更快。

JinJin飞云2020/03/09 20:52:59

您可以将大多数<script>引用放在的末尾<body>
但是,如果页面上有使用外部脚本的活动组件,
则它们的依赖项(js文件)应该在此之前(最好在head标签中)。

鱼二水2020/03/09 20:52:59

脚本阻止DOM加载,直到它被加载并执行。

如果将脚本放在<body>所有DOM 的末尾,则有机会加载和呈现(页面将“显示”得更快)。<script>将有权访问所有这些DOM元素。

另一方面,将其放置在<body>开始或之后的位置将执行脚本(那里仍然没有DOM元素)。

您将包括jQuery,这意味着您可以将其放置在任意位置并使用.ready()

小小2020/03/09 20:52:59
  • 如果您仍然非常关心IE <10的支持和性能,最好始终将脚本标记设置为HTML正文的最后一个标记。这样,您可以确定其余的DOM已加载,并且不会阻塞和渲染。

  • 如果您不再关心IE <10,则可能希望将脚本放在文档的开头,并defer用来确保脚本仅在DOM被加载后才能运行(<script type="text/javascript" src="path/to/script1.js" defer></script>)。如果您仍然希望代码在IE <10中运行,请不要忘记将代码window.onload均匀地包装

理查德Tony2020/03/09 20:52:59

最后要包含脚本的地方主要用于首先显示网站内容/样式的地方。

包括头中的脚本的脚本会尽早加载这些脚本,并且可以在加载整个网站之前使用。

如果最后输入了脚本,则只有在加载了整个样式和设计之后才能进行验证,这对于快速响应的网站是不赞赏的。

小小Jim2020/03/09 20:52:59

取决于脚本及其用法,最好的方式(就页面加载和渲染时间而言)可能是不使用常规的<script>标签本身,而是动态地异步触发脚本的加载。

有一些不同的技术,但是最直接的方法是在触发window.onload事件时使用document.createElement(“ script”)。然后,当页面本身已呈现时,将首先加载脚本,因此不会影响用户必须等待页面出现的时间。

自然,这要求脚本本身不需要呈现页面。

有关更多信息,请参阅Steve Souders(YSlow的创建者,但现在在Google上)发布的耦合异步脚本

村村伽罗Mandy2020/03/09 20:52:59

取决于,如果要加载的脚本对于页面的样式设置/使用页面中的操作(例如单击按钮)是必需的,则最好将其放在顶部。如果您的样式是100%CSS,并且按钮操作具有所有后备选项,则可以将其放在底部。

或最好的事情(如果这不是问题)是您可以创建一个模式加载框,将您的JavaScript放在页面底部,并在加载脚本的最后一行时使其消失。这样,您可以避免用户在加载脚本之前在页面中使用操作。并且避免样式不当。

神奇Tony古一2020/03/09 20:52:59

常规的(被广泛接受的)答案是“最底层的”,因为这样,在任何内容开始执行之前,整个DOM都将被加载。

出于各种原因,有一些持不同政见者从可用的实践开始,故意从页面onload事件开始执行。

神奇JinJin2020/03/09 20:52:59
<script src="myjs.js"></script>
</body>

脚本标记应始终在主体关闭之前HTML文件的底部之前使用

那么您可以在加载js文件之前先查看页面的内容

如果需要,请检查此内容:http : //stevesouders.com/hpws/rule-js-bottom.php

Mandy神奇2020/03/09 20:52:59

XHTML不会验证脚本是否位于head元素之外的任何其他位置。 事实证明它可以无处不在。

您可以使用jQuery之类的方法推迟执行,因此放置位置无关紧要(解析期间对性能的影响很小)。

LEY樱2020/03/09 20:52:59

2019年的现代方法是使用ES6模块类型脚本

<script type="module" src="..."></script>

默认情况下,模块是异步加载和延迟的。也就是说,您可以将它们放置在任何位置,它们将并行加载并在页面加载完成时执行。

此处描述了脚本和模块之间的区别:

https://stackoverflow.com/a/53821485/731548

与脚本相比,模块的执行描述如下:

https://developers.google.com/web/fundamentals/primers/modules#defer

支持如下所示:

https://caniuse.com/#feat=es6-module

JimLEYHarry2020/03/09 20:52:59

如果您使用的是JQuery,则将javascript放在最合适的位置,并用于$(document).ready()确保在执行任何功能之前正确加载了所有内容。

附带说明:我喜欢本<head>中的所有脚本标签,因为这似乎是最干净的地方。

A樱2020/03/09 20:52:59

由Yahoo!提倡的标准建议。卓越的性能团队将<script>标签放在文档主体的末尾,以免它们阻碍页面的呈现。

但是,如以下有关Google Analytics(分析)JavaScript文件的加载时间的答案所述,有些新方法可以提供更好的性能

Steve Souders(客户端性能专家)提供了一些很棒的幻灯片这些幻灯片涉及:

  • 并行加载外部JavaScript文件的不同技术
  • 它们对加载时间和页面呈现的影响
  • 浏览器显示什么样的“进行中”指示(例如状态栏中的“正在加载”,沙漏鼠标光标)。
小卤蛋宝儿2020/03/09 20:52:59

如上所述,在结束标签前

http://developer.yahoo.com/performance/rules.html#js_bottom

将脚本放在最下面

脚本引起的问题是它们阻止并行下载。HTTP / 1.1规范建议浏览器每个主机名并行下载最多两个组件。如果您从多个主机名提供图像,则可以并行进行两次以上的下载。但是,在下载脚本时,即使使用不同的主机名,浏览器也不会启动任何其他下载。

小小阿飞2020/03/09 20:52:59

非阻塞脚本标签可以放置在几乎任何地方:

<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
  • async script will be executed asynchronously as soon as it is available
  • defer script is executed when the document has finished parsing
  • async defer script falls back to the defer behavior if async is not supported

Such scripts will be executed asynchronously/after document ready, which means you cannot do this:

<script src="jquery.js" async></script>
<script>jQuery(something);</script>
<!--
  * might throw "jQuery is not defined" error
  * defer will not work either
-->

Or this:

<script src="document.write(something).js" async></script>
<!--
  * might issue "cannot write into document from an asynchronous script" warning
  * defer will not work either
-->

Or this:

<script src="jquery.js" async></script>
<script src="jQuery(something).js" async></script>
<!--
  * might throw "jQuery is not defined" error (no guarantee which script runs first)
  * defer will work in sane browsers
-->

Or this:

<script src="document.getElementById(header).js" async></script>
<div id="header"></div>
<!--
  * might not locate #header (script could fire before parser looks at the next line)
  * defer will work in sane browsers
-->

Having said that, asynchronous scripts offer these advantages:

  • Parallel download of resources:
    Browser can download stylesheets, images and other scripts in parallel without waiting for a script to download and execute.
  • Source order independence:
    You can place the scripts inside head or body without worrying about blocking (useful if you are using a CMS). Execution order still matters though.

It is possible to circumvent the execution order issues by using external scripts that support callbacks. Many third party JavaScript APIs now support non-blocking execution. Here is an example of loading the Google Maps API asynchronously.