javascript - 如何在正文元素的末尾动态添加脚本标签
问题描述
我想删除渲染阻塞 javascript。所以,我试图在页面加载后在元素script
末尾动态添加标签。body
我有 7 个script
要动态添加的标签。其中一个script
标签jQuery
使用 CDN 加载。其余 6 个script
标签加载依赖于jQuery
.
我已将所有指向 javascript 文件的链接放在一个数组中,然后使用循环创建一个script
元素,在其上添加所需的属性并将其附加到body
元素中。
问题:
问题是当我在浏览器中查看页面时,我在控制台中收到有关jQuery
未定义的错误。
我正在script
以正确的顺序添加标签,并且我已经验证script
标签确实添加在body
元素的末尾并以正确的顺序添加。
jQuery
每次初始加载时都会出现此问题,如果我刷新页面,则有时脚本会正确加载,有时我会遇到未定义的相同错误。
由于这个问题,网页上的一些动画没有被触发,而且我正在使用slick
轮播。当 javascript 没有正确加载时,所有应该在slick
轮播中显示的图像都会一个接一个地显示。
问题:
为什么jQuery
依赖于的其他脚本jQuery
执行时未定义?script
在中动态添加标签的正确方法是html
什么?
代码:
这就是我script
在html
. 所有脚本都是从本地文件系统加载的,除了jQuery
通过slick carousel
CDN 加载的脚本。
<script>
function loadJs() {
const arr = [
"https://code.jquery.com/jquery-3.3.1.min.js",
"//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js",
"./js/jquery.waypoints.min.js",
"./js/jquery.counterup.min.js",
"./js/wow.min.js",
"./js/lazysizes.min.js",
"./js/loso.js",
];
for (let srcLink of arr) {
let script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", srcLink);
document.body.appendChild(script);
}
}
window.addEventListener("load", () => {
loadJs();
});
</script>
解决方案
@Nick 我发现了一些问题,希望对您有所帮助。
在加载 js 和 css 文件的数组中,您错过了 https:// 光滑轮播 js 和 css 文件
当您尝试使用这样的计时器加载 js 时
for (let srcLink of arr) { setTimeout(() => { let script = document.createElement("script"); script.setAttribute("type", "text/javascript"); script.setAttribute("src", srcLink); document.body.appendChild(script); }, 100); }
文件将一个接一个地加载,因此我们不会出错。错误的发生取决于您的互联网连接速度,因此通过这种加载文件的方式,我们可以避免错误
正如您在图片中看到的那样,加载文件时没有发现任何问题,已经刷新了几次并检查了。
尝试
- 加载带有普通脚本标签的文件
- 使用计时器加载文件。
推荐阅读
- sql - EXECUTE IMMEDIATE SELECT INTO 语句中缺少关键字 - Oracle PL/SQL
- javascript - 如何在node js中设置不同的变量分配给不同的环境
- android - 在 android studio 中修改 .html 文件
- excel - 按钮上的范围背景颜色更改
- python - 如何避免正则表达式匹配“Revert”“Revert”
- kubernetes - kubelet如何计算nodefs,imagefs?然后驱逐一个 Pod
- javascript - 如何注入 Adsense
- python - 如何将字典的文本文件读入 DataFrame
- c++ - 从其他类的静态数据成员初始化映射
- android - 完成创建广告的所有步骤后,插页式广告不会显示在 Android 模拟器上