Execution of code in <script>
Execution of code in <script>
标记上的代码何时开始执行?它是顺序的吗?
<html>
<head>
<title>Canvas tutorial</title>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('tutorial');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
}
}
</script>
<style type="text/css">
canvas { border: 1px solid black; }
</style>
</head>
<body onload="draw();">
<canvas id="tutorial" width="150" height="150"></canvas>
</body>
</html>
上面是一段工作代码。为什么脚本位于画布元素之上?
有多种选择可用于放置稍后调用的脚本函数。
-
在
<head>
部分中。此处的脚本将立即可用,并且可以由加载文档时执行的任何其他脚本使用。 -
在
<body>
部分混合了HTML。这些脚本将在解析文档中的位置时执行。DOM中脚本之前的所有内容都将就绪。脚本之后的所有内容都还不可用。 -
在正文的最后,就在
</body>
标记之前。在执行这些脚本时,之前的整个文档都将准备就绪。
在您的特定情况下,在<head>
部分中定义了一个函数,以便稍后可以执行。由于代码在<head>
部分中的显示方式,该代码只是一个函数定义。解析该代码时,实际上什么都不执行。当页面及其图像通过此行中指定的onload处理程序完成加载时,函数本身就会执行:
<body onload="draw();">
只有到那时,代码才会被实际调用并运行。draw()
函数可以在上述三个位置中的任何一个位置定义,因为onload处理程序位于所有三个选项之后。至于为什么脚本位于画布元素之上,这只是页面设计者的一个选择。如果他们愿意的话,他们可以将脚本定位在画布元素之后,并且页面仍然可以正常工作。
一个好的工作实践是尽可能晚地将脚本放在<body>
中,因为这样可以更快地加载和显示页面内容。但是,在创建页面的过程中需要一些脚本(例如,选择使用document.write()
的脚本),因此它们必须提前放置,以便在需要时可用。脚本也可以被标记为defer
或async
以进一步延迟它们的加载以允许内容首先被显示。
首选的方法是将脚本放在结束正文标记的正下方。
但是,如果必须立即在页面上使用脚本,最好将其保留在页眉中。
因为脚本只定义了一个函数,在页面完全加载之前(通过onload
body属性)不会调用该函数。
内联元素将按顺序执行,就像您的示例中的情况一样。然而,当前代码所做的只是定义一个函数。它不执行该函数。
在您的案例中,您使用了body onload=
事件来实际执行draw()函数。这就是为什么您对代码没有问题,这似乎是您最初问题的要点。
出于这个原因,除非绝对必要,否则通常建议不要将javascript放在head部分,而是将其放在尽可能靠近关闭body标记的位置。
话虽如此,在这种情况下,您定义了一个函数,但定义它和执行它是两件不同的事情。定义一个函数并不是问题,直到DOM准备好,并且要使用的DOM元素已经呈现,才执行该函数。
话虽如此,当您在head部分加载外部javascript文件时,可能会导致页面的呈现受阻,根据您以这种方式加载的脚本的大小和数量,建议将这些文件放在页面的末尾。这将避免在执行试图操作DOM元素的函数之前,对DOM元素的存在性的担忧。
不要在body
元素上使用onload
属性。。。事实上,永远不要在body
元素上使用任何属性。
<head>
<script type="application/javascript">
//<![CDATA[
window.onload = function() {/*load multiple functions here*/}
//]]>
</script>
</head>
- 在<页眉>标签
- 如何更改<svg>标记为<img>用js标记
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- Ajax文件加载和<输入>文件加载
- 为什么要使用0>javascript中的0
- 在<script src=“"></脚本>标签
- 等效于<script src=“;something1.json”></脚本>
- 是否在Script Src标记中包含Script<脚本>(JavaScript等)
- 显示“<script src='some.js'></脚本>"在Html文档中
- <script src=“//代码.jquery.com/jquery-1.11.1.min.js”></
- 类似于htmls<script src=“">xaml的标签
- Cordova接受<script src=“;myfile.js”>在<头部>
- 为什么我不得到“;NetworkError”;当我使用<script src=“;false _ ip”>
- 我可以在<script src=“;ftp://”>
- 如何使用<c: 对于每个>在JSP页面上的script标记中
- 为什么可以't我将JS代码置于<script src=“">代码</脚本>
- 将用户输入动态地附加到<script src=“">来自Java Script中的文本框
- 如何在Java Script中从长字符串中获取特定的字符串值?我想获得<tax_amt>标签
- 通过Javascript而不是<script src=“;external.aspx”>
- 迁移& lt; script>…& lt; / script>To .js文件失败