📅  最后修改于: 2023-12-03 15:16:05.908000             🧑  作者: Mango
当浏览器解析HTML时,遇到<script>
标签时,它会立即暂停HTML解析,然后执行<script>
中的Javascript代码,这意味着在Javascript执行期间,HTML解析将停止。这可以导致网页的渲染速度明显变慢。但是有两种解决方案:
async
或defer
属性。这些属性允许Javascript代码异步加载,不会暂停HTML解析。普通的Javascript代码是没有async
或defer
属性的。默认情况下,代码会按顺序执行,并阻塞HTML页面的渲染。例如,以下代码会阻塞HTML页面的渲染:
<!DOCTYPE html>
<html>
<head>
<title>Normal Javascript</title>
<script>
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
sleep(5000); // Blocks page rendering for 5 seconds
</script>
</head>
<body>
<p>This is a sample HTML paragraph</p>
</body>
</html>
使用async
属性可以异步加载Javascript代码。这意味着HTML页面不会等待Javascript代码执行完成,可以继续渲染页面,而Javascript代码会在后台异步执行。例如:
<!DOCTYPE html>
<html>
<head>
<title>Async Javascript</title>
<script async>
alert('Hello from Async script tag!');
</script>
</head>
<body>
<p>This is a sample HTML paragraph</p>
</body>
</html>
在这个例子中,Javascript代码的弹出窗口会在HTML页面加载完成后出现。这也意味着,Javascript代码的执行顺序不能被保证。
使用defer
属性可以异步加载Javascript代码,并且保证执行顺序。这意味着HTML页面不会等待Javascript代码执行完成,可以继续渲染页面,但Javascript代码会在HTML解析完成后立即执行。例如:
<!DOCTYPE html>
<html>
<head>
<title>Defer Javascript</title>
<script defer>
alert('Hello from Defer script tag!');
</script>
</head>
<body>
<p>This is a sample HTML paragraph</p>
</body>
</html>
在这个例子中,Javascript代码的弹出窗口会在HTML解析完成后出现。此外,在<script>
标签中可以定义多个具有defer
属性的Javascript代码,这些代码将根据它们在HTML中的位置依次执行。
总结:
async
属性可以异步加载Javascript代码,但执行顺序不能保证。defer
属性可以异步加载Javascript代码,并保证执行顺序。