发布日期:2025-07-07 14:23:05
在HTML中,script标签有defer和async两个属性可用于延迟加载脚本。
defer属性(用于指示脚本在文档解析完成后、DOMContentLoaded事件触发前按顺序执行):给script标签添加defer属性,浏览器会在文档解析时下载脚本,等到文档解析完成后再执行脚本。例如:
<script src="third - party - script.js" defer></script>
async属性(用于指示脚本在下载完成后立即执行,不保证执行顺序):添加async属性后,脚本会异步下载,下载完成后立即执行,不会等待文档解析。例如:
<script src="third - party - script.js" async></script>
通过JavaScript动态创建script标签并插入到文档中,可以实现脚本的延迟加载。示例代码如下:
javascript
var script = document.createElement('script');
script.src = 'third - party - script.js';
document.body.appendChild(script);
可以在页面加载完成后,或者根据特定的用户交互事件来触发这个脚本的加载。
Intersection Observer API(用于异步观察目标元素与其祖先元素或顶级文档视口的交叉状态)可以实现脚本的懒加载。当脚本所在的元素进入浏览器视口时,再加载脚本。示例代码如下:
javascript
var observer = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var script = document.createElement('script');
script.src = 'third - party - script.js';
document.body.appendChild(script);
observer.unobserve(entry.target);
}
});
});
var target = document.getElementById('target - element');
observer.observe(target);
根据用户的特定操作来加载脚本。例如,当用户点击某个按钮时,再加载与该按钮功能相关的第三方脚本。示例代码如下:
javascript
var button = document.getElementById('myButton');
button.addEventListener('click', function() {
var script = document.createElement('script');
script.src = 'third - party - script.js';
document.body.appendChild(script);
});
预加载(提前加载资源,以便后续使用)和预连接(提前建立网络连接)可以优化脚本的加载性能。可以在HTML的head标签中使用link标签进行预加载和预连接。例如:
<link rel="preload" href="third - party - script.js" as="script">
<link rel="preconnect" href="https://third - party - domain.com">
可以通过JavaScript检测用户的设备和网络状况,根据不同情况决定是否加载脚本。例如,当用户使用移动设备且网络较慢时,不加载一些非必要的第三方脚本。示例代码如下:
javascript
if (navigator.connection && navigator.connection.effectiveType === 'slow - 2g') {
// 不加载脚本
} else {
var script = document.createElement('script');
script.src = 'third - party - script.js';
document.body.appendChild(script);
}
1. defer和async属性有什么区别?
defer属性会让脚本在文档解析完成后、DOMContentLoaded事件触发前按顺序执行,保证脚本执行顺序;而async属性会让脚本异步下载,下载完成后立即执行,不保证执行顺序。
2. Intersection Observer API适用于哪些场景?
Intersection Observer API适用于需要懒加载的场景,比如图片懒加载、脚本懒加载等。当目标元素进入视口时再加载资源,可以有效减少初始加载时间,提升性能。