页面中脚本标记的位置如何影响其中定义的 JavaScript 函数?

IT技术 javascript html function tags
2021-03-05 07:10:42

我读了你应该在定义JavaScript函数<head>的标签,但如何做的位置<script>(是否在<head><body>或任何其他标记)影响的JavaScript函数。

具体来说,它如何影响函数的范围以及您可以从哪里调用它?

6个回答

告诉人们<SCRIPT>只在头部添加听起来是一件合理的事情,但正如其他人所说,不推荐甚至不实用的原因有很多 - 主要是速度和动态生成 HTML 页面的方式。

这是HTML 4 规范所说的

SCRIPT 元素将脚本放置在文档中。该元素可以在 HTML 文档的 HEAD 或 BODY 中出现任意次数。

和一些示例 HTML。看起来不是都格式化在这里吗:)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>A document with SCRIPT</TITLE>
<META http-equiv="Content-Script-Type" content="text/tcl">
<SCRIPT type="text/vbscript" src="http://someplace.com/progs/vbcalc">
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT type="text/javascript">
...some JavaScript...
</SCRIPT>
</BODY>
</HTML>

HTML 5 中值得期待的东西

中的新异步属性<SCRIPT>

注意:有多种方法可以执行脚本:

async 属性为“true”:脚本将与页面的其余部分异步执行,因此脚本将在页面继续解析的同时执行。

async 属性为“false”,但 defer 属性为“true”:当页面解析完成时,脚本将被执行。

带有大写标签的代码是从W3.org 规范中直接复制/粘贴的
2021-04-18 07:10:42
你的链接坏了。它是否应该是解释异步属性使用的“引用”的来源?无论来源如何,这种说法都令人困惑,因为它给人的印象是应该将属性值设置为“true”或“false”。但是, async 属性不支持值“true”或“false”。它的简单存在意味着“真”,例如<script async src='...,如果它丢失,那么它就是“假”。有关更详细的说明,请参阅:html 5 sepc
2021-04-24 07:10:42
@m4bwav - 我主要想提出一个尚未提出的附加点,即对于任何认为不应该将 SCRIPT 放入 BODY 的人来说,这是可以的。此外,提到的雅虎“性能规则”文章非常值得一读,并彻底涵盖了这个问题
2021-04-27 07:10:42
只是看到所有标签都用大写字母写成,这使得这个答案的可信度大大降低......
2021-04-28 07:10:42
@SebNilsson 我想知道将脚本标签放在正文部分是否可以。这个答案说我可以,那么,为什么上限会降低它的可信度?
2021-04-28 07:10:42

正常的比赛规则仍然有效;在定义之前不要使用东西。:)

另外,请注意“将所有内容放在底部”的建议并不是书中唯一规则——在某些情况下它可能不可行,而在其他情况下将脚本放在其他地方可能更有意义。

将脚本放在文档底部的主要原因是为了提高性能,与其他 HTTP 请求不同,脚本不会并行加载,这意味着它们会减慢页面其余部分的加载速度。将脚本放在底部的另一个原因是您不必使用任何“DOM 就绪”函数。由于脚本标记位于所有元素下方,因此 DOM 将准备好进行操作!

编辑:阅读:http : //developer.yahoo.com/performance/rules.html#js_bottom

@MarkRogers,你说它会影响 seo。它以好的方式还是以坏的方式影响seo?谢谢
2021-04-17 07:10:42
我听说在底部添加也会影响 seo
2021-05-02 07:10:42
@Brian - 我向 Jennyfofenny 询问了这个问题,她说如果 javascript 加载发生在文件末尾会更好。通过这种方式,可以首先加载和索引上下文,从而可以更轻松地为页面编制索引,并且可以更自然地加载页面内容。
2021-05-08 07:10:42

放置的方面之一是性能。请参阅YSlow 讨论中的这篇精美文章,了解为什么有时建议您将它们放在文档底部。

至于作用域问题,据我所知,Javascript 的常用可见性规则(在函数内部或外部定义的变量、局部、全局、闭包等)不受影响。

此链接似乎已断开。
2021-04-23 07:10:42
@CaptainBlammo - 感谢您注意到这一点。我已将链接更新为更通用(希望更永久)的 YSlow 页面。
2021-05-09 07:10:42

脚本标签的位置很重要。如果您将函数与文档元素绑定,那么在我们实现函数之前必须首先加载文档元素。假设 getTeachers() 是 getTeachers.js 文件中的函数。这会给你一个错误:

<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Unit Teachers</title>
<head>
 <script type="text/javascript" src="getTeachers.js"></script>
 <script type="text/javascript">
document.getElementById("buttonId").onclick=function(){getResults()};

</script>
 </head>
 <body>
 <form>
 <input type = "button" id="buttonId" value = "Press for Results"  /><br />
 </form>

<span id="results" /></span>
</body>
</html>

它在首先加载 head 之前给出错误,并且找不到指定 id 的元素。下面的代码是更正:

<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Unit Teachers</title>
<head>
 <script type="text/javascript" src="getTeachers.js"></script>

 </head>
 <body>
 <form>
 <input type = "button" id="buttonId" value = "Press for Results"  /><br />
 </form>
<script type="text/javascript">
document.getElementById("buttonId").onclick=function(){getResults()};

</script>
<span id="results" /></span>
</body>
</html>
很好的例子,为什么你需要带有 getTeachers.js 标签的脚本?它只是抛出一个错误。
2021-05-05 07:10:42

如果您的脚本引用了页面上的 ID 而页面尚未呈现(即脚本在 HTML 之前,或者您的脚本是在 onload 时执行的,而不是 DOM 已准备好),您也会收到错误消息。