首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vanilla js按需加载脚本文件

使用vanilla js按需加载脚本文件
EN

Stack Overflow用户
提问于 2020-10-08 05:47:43
回答 2查看 3.5K关注 0票数 7

我用手风琴或标签。单击选项卡时,我希望显示一个需要加载一个大javascript文件的地图或其他东西。

若要在不需要时不加载大javascript,我只希望在单击选项卡时加载它。

我怎么能这么做?我用手风琴和点击事件创建了一个很好的起点。

  • 我使用香草js (纯javascript - no jQuery)
  • ,我在一个网页(而不是nodejs)
  • 上使用它,如果它与现代浏览器(IE不需要)

一起工作,我很好。

代码语言:javascript
复制
window.addEventListener('DOMContentLoaded', () => {
  document.querySelector('[data-trigger]').addEventListener('click', () => {
    console.log('Load script from file');
    // CDN example - https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.12.0/mapbox-gl.js
  });
});
代码语言:javascript
复制
ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

label {
  display: flex;
  align-items: center;
}

label:before {
  content: '';
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M13.172 12l-4.95-4.95 1.414-1.414L16 12l-6.364 6.364-1.414-1.414z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  width: 24px;
  height: 24px;
}

input[type=checkbox] {
  display: none;
}

input[type=checkbox]:checked ~ h2 label:before {
  transform: rotate(90deg);
}

p {
  display: none;
}

input[type=checkbox]:checked ~ h2 ~ p {
  display: block;
}
代码语言:javascript
复制
<ul>
  <li>
    <input type="checkbox" id="faq-1">
    <h2 data-trigger>
      <label for="faq-1">Click to load map</label>
    </h2>
    <p>Gummies marzipan croissant chupa chups.</p>
  </li>

  <li>
    <input type="checkbox" id="faq-2">
    <h2>
      <label for="faq-2">Something else</label>
    </h2>
    <p>Cookie bear claw carrot cake croissant.</p>
  </li>
</ul>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-08 09:59:03

由于您习惯于只支持现代浏览器,所以可以使用dynamic import()函数加载文件:

代码语言:javascript
复制
window.addEventListener('DOMContentLoaded', () => {
  document.querySelector('[data-trigger]').addEventListener('click', async() => {
    const module = await import('https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.12.0/mapbox-gl.js');
    console.log(`module is loaded: ${Object.keys(mapboxgl)}`);
  });
});
代码语言:javascript
复制
ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

label {
  display: flex;
  align-items: center;
}

label:before {
  content: '';
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M13.172 12l-4.95-4.95 1.414-1.414L16 12l-6.364 6.364-1.414-1.414z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  width: 24px;
  height: 24px;
}

input[type=checkbox] {
  display: none;
}

input[type=checkbox]:checked~h2 label:before {
  transform: rotate(90deg);
}

p {
  display: none;
}

input[type=checkbox]:checked~h2~p {
  display: block;
}
代码语言:javascript
复制
<ul>
  <li>
    <input type="checkbox" id="faq-1">
    <h2 data-trigger>
      <label for="faq-1">Click to load map</label>
    </h2>
    <p>Gummies marzipan croissant chupa chups.</p>
  </li>

  <li>
    <input type="checkbox" id="faq-2">
    <h2>
      <label for="faq-2">Something else</label>
    </h2>
    <p>Cookie bear claw carrot cake croissant.</p>
  </li>
</ul>

import()返回一个承诺,该承诺在成功获取时得到解决,并在后续调用(在我的测试中)时立即解析,因此您不必专门处理这个问题。

对于特定的mapbox-gl脚本,返回的值不会有用,因为脚本不是作为ES6模块编写的,但是运行脚本的副作用将会到位(在本例中,mapboxgl变量被分配给globalThis)。在加载脚本是模块的场景中(正确使用export ),您可以直接使用已解析的值来避免污染全局命名空间。

票数 2
EN

Stack Overflow用户

发布于 2020-10-08 06:01:33

您可以动态创建脚本标记,并在按下按钮时将其添加到文档中。这将触发脚本立即加载。使用onload回调,您可以运行您的代码,比如创建一个映射,在脚本实际加载之后。

一定要添加{ once: true }作为addEventListener的第三个参数,因为它将确保触发器只能单击一次,并且不能追加脚本一次以上。

代码语言:javascript
复制
function createMap() {
  const map = new mapboxgl.Map({
    ...
  });
}

window.addEventListener('DOMContentLoaded', () => {
  document.querySelector('[data-trigger]').addEventListener('click', () => {
    console.log('Load script from file');
    
    const script = document.createElement('script');
    script.id = 'mapboxgljs';
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/mapbox-gl/1.12.0/mapbox-gl.js'
    script.async = true;
    script.onload = function() {
      console.log('script loaded, you can use it now.');
      createMap();
    }
    document.body.append(script);
  }, { once: true }); // Make sure that the button can only be pressed once.
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64256498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档