gpt4 book ai didi

javascript - catch 22 : Load Script if Element That Depends on Script Exists

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:17 25 4
gpt4 key购买 nike

我的目标是在 <head> 中加载 javascript仅当某个元素存在于 <body> 中时.

但是,我有一个问题:我正在加载一个 Web 组件,它只是一个 <script>托管在别处并被拉入:

<script src="https://someurl.com/some-web-component.min.js"></script>

这个 Web 组件文件很大,所以我不想将它拉入除非我们的内容管理系统 (CMS) 将它插入正文。

我工作的限制是:

<head>在页面之间共享,所以我需要条件逻辑

• 我无法控制 <body>由 CMS 插入,其中可能包含 <my-web-component>标记

• 我需要脚本来加载 Web 组件,所以我不能使用 jQuery 的 $(document).ready,至少我认为我不能 - 会抛出一个错误,因为浏览器不知道元素存在

这个 plunker 部分显示了我的问题,减去所有网络组件的复杂性:

https://plnkr.co/edit/GGif2RNHX1iLAvSk1nUw?utm_source=next&utm_medium=banner&utm_campaign=next&p=preview

有什么办法解决这个问题吗?

最佳答案

您可以使用 DOMContentLoaded事件。

The DOMContentLoaded event is fired when the initial HTML document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading.

在这种情况下,您可以查找组件并添加类似以下内容的脚本

document.addEventListener("DOMContentLoaded", function(event) {
if(document.querySelector('Component')){
var script = document.createElement('script');
script.src = 'https://someurl.com/some-web-component.min.js';
document.head.appendChild(script)
}
});

可能更好的方法是在头部添加 scriptasync 属性,如果找不到该组件,稍后将其删除。像这样

<script async src = "https://someurl.com/some-web-component.min.js"> </script> 
<script >
document.addEventListener("DOMContentLoaded", function(event) {
if (document.querySelector('Component') == null) {
var script = document.querySelector('script[src="https://someurl.com/some-web-component.min.js"]')
document.head.removeChild(script)
}
});
</script>

更多关于 DOM lifecycle events
更多关于 async script loading

关于javascript - catch 22 : Load Script if Element That Depends on Script Exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47168015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com