捕获22:如果依赖于脚本存在的元素,则加载脚本

VSO*_*VSO 3 html javascript

我的目标是<head>只在某个元素存在的情况下加载javascript <body>.

但是,我遇到了一个问题:我正在加载一个Web组件,它只是在<script>其他地方托管,并被引入:

<script src="https://someurl.com/some-web-component.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

这个Web组件文件非常庞大,所以除非我们的内容管理系统(CMS)将其插入到正文中,否则我不想将其拉入.

我工作的限制是:

<head>页面之间共享,因此我需要条件逻辑

•我无法控制<body>CMS插入的内容,它可能包含<my-web-component>标记

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

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

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

有什么方法吗?

Mot*_*ets 6

您可以使用DOMContentLoaded事件.

完全加载和解析初始HTML文档时会触发DOMContentLoaded事件,而无需等待样式表,图像和子帧完成加载.

在这种情况下,您可以查找Component并使用以下内容添加脚本

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)
  }
});
Run Code Online (Sandbox Code Playgroud)

可能更好的方法是script在头部添加async属性,然后在找不到组件时将其删除.像这样的东西

<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>
Run Code Online (Sandbox Code Playgroud)

有关DOM生命周期事件的
更多信息有关异步脚本加载的更多信