javascript - 卸载外部 .js 文件

标签 javascript external

我正在使用 AJAX 加载一些 HTML 和 JS:

ma​​in-page.html 通过 AJAX 加载一个名为 page-to-load.html 的页面。

<!-- main-page.html -->
<html>
...
<script>
$.ajax({ 
  type:"POST", 
  url:"page-to-load.html", 
  success:function(data) { 
    $("#some_id").html(data);
  }
});
</script>
...
</html>

page-to-load.html 包括 html 和一个 js 文件:

<!-- page-to-load.html --->
<script src="scripts-for-this-html.js"></script>
<p>This is a HTML page working with above external .js file</p>

如您所见,我正在加载一个 js 文件,scripts-for-this-html.js

这非常有效。问题是,如果我再次加载(我的意思是,“#some_id”变空并再次加载 page-to-load.html)所有脚本(scripts-for-this- html.js) 保留在浏览器内存中(例如,如果我在这个 .js 文件中有一个事件,这个事件会重复我加载文件的次数,即使我已经从中删除了脚本元素DOM)。

有什么方法可以完成这项工作吗?我不想一次包含所有 .js 文件(太多了),我想按需加载和卸载它们。

最佳答案

JavaScript 卸载理论上可以通过删除脚本标签(就像您对 .html 所做的那样)并通过消除对与脚本关联的任何对象的所有引用来完成。这涉及删除每个引用和事件监听器. 即使留下一个也可能会将该变量的功能范围保留在内存中,从而导致泄漏。

如果脚本已经加载,使用正则表达式删除脚本会很聪明。 (感谢@JCOC611 剥离标签的想法。)像这样的东西:

var usedScripts = {};

html = html.replace(/<script\s+src="([^"]+)"><\/script>/gi, function(str, file) {
    if(usedScripts[file]) {
        return "";
    } else {
        usedScripts[file] = true;
        return str;
    }
});

如果你的页面数量有限,我更喜欢做的是有一个对象:

{
    myPage: {
        html:   'myhtml.html',
        script: 'myscript.js'
    }
}

然后有一个加载器函数,它同时使用 document.createElement('script') 加载脚本并使用 HTML 加载页面。您可以轻松检查该脚本是否已被使用并跳过加载。

关于javascript - 卸载外部 .js 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781406/

相关文章:

javascript - 如何提高js中Date对象到字符串的加载时间?

ios - 获取AirPlay镜像屏幕的UIWindow

css - 内部样式表不覆盖外部样式表?

c - 为链接器指定外部存储器

javascript - 只有第一个对象保存在 javascript for 循环中

javascript - .click() 事件时 'Open in new tab/window'

javascript - Angular 2 构造函数 ngOnInit 未定义属性 TypeScript

java - 在 java 中传入 args[] 或缺少 args

file - 如何将外部文件中的文本插入到 div 中?

javascript - 使用ripple时PhoneGap错误