【问题标题】:How can I load and unload(remove) css and javascript imports/files on will?如何加载和卸载(删除)css 和 javascript 导入/文件?
【发布时间】:2020-08-13 19:35:33
【问题描述】:

在某个用户交互(单击按钮)后,我尝试在我的网页中动态加载 CSS 文件和脚本文件,并且效果很好。 CSS 文件引入了一些应用于网页的样式。在 Javascript 文件中,我在 setInterval() 中放入了一些代码,该代码从 IIFY 执行,以便代码可以以 1 秒的间隔无限运行。

但是当我尝试卸载(删除)它们时,CSS 文件很容易被删除,但脚本文件却产生了问题。通过从 index.html 文件中删除<link rel="stylesheet" href="res/demo.css">,由它引入的样式也会从 index.html 中删除。通过删除<script src="res/demo.js"></script>,底层代码继续运行。

GIT 存储库中的示例代码:

https://github.com/anirbannath/loading-unloading-css-js.git

除了完全刷新页面之外,我如何停止脚本并清除它所占用的内存?

【问题讨论】:

  • 这能回答你的问题吗? remove appended script javascript
  • 脚本标签可以从 DOM 中移除,但底层脚本仍然有效。有没有办法停止并清除底层脚本?
  • 您可以通过设置disabled 属性来禁用样式表。我不知道其中任何一个的实际卸载。我的 an old answer 是关于脚本的,但那更具有实验性和 hackish ...

标签: javascript


【解决方案1】:

如果您有一个匿名间隔,那么您可以遍历所有间隔并停止它们无需接触您正在导入的脚本(因此它适用于第 3 方脚本):

//Your imported script file
(function() {
  setInterval(() => {
    console.log('Hello again!')
  }, 1000)
})()

//Your main script file
const btn = document.querySelector('.btn');
btn.addEventListener('click', () => {
  for (var i = 1; i < 99; i++) {
      window.clearInterval(i);
  }
  //remove script
})
&lt;a href="javascript:;" class="btn"&gt;STOP IT!&lt;/a&gt;

如果您可以控制导入的脚本,那么您可以:

  1. 为 IIFE 命名以便以后重新分配它
  2. 在 IIFE 之外创建一个变量
  3. 将区间分配给 IIFE 中的该变量
  4. 当您单击按钮时,首先清除间隔,然后重新分配变量 到其他对象(使其符合垃圾回收条件),最后删除脚本标记。

//Your imported script file
let interval;
(function theFunc() {
  interval = setInterval(() => {
    console.log('Hello again!')
  }, 1000)
})()

//Your main script file
const btn = document.querySelector('.btn');
btn.addEventListener('click', () => {
  clearInterval(interval)
  interval = null;
  theFunc = null;
  //remove script
})
&lt;a href="javascript:;" class="btn"&gt;STOP IT!&lt;/a&gt;

【讨论】:

  • 这是假设您可以完全控制脚本的内容,从 GitHub 页面我得到的印象是事实并非如此
  • 你是对的,@Joeri,这是假设。他是从他自己的文件夹结构而不是从第三方添加 demo.js,所以我认为这是可能的。
  • 您的答案的快速变化。这也适用于第三方脚本,认为它不那么优雅。 jsfiddle.net/6chLbq72
  • 是的,我知道这些解决方案。正如@Joeri 所说,我正在尝试使用第 3 方库并且无法控制它。有办法解决吗?
  • 好的@ProgrammerForFun,我已经更新了答案,即使它来自第三方脚本也能够停止间隔。
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多