Javascript 卸载外部.js文件

Javascript 卸载外部.js文件,javascript,external,Javascript,External,我正在用AJAX加载一些HTML和JS: main page.html加载一个名为page to load.html的页面 <!-- main-page.html --> <html> ... <script> $.ajax({ type:"POST", url:"page-to-load.html", success:function(data) { $("#some_id").html(data); } }); </s

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

main page.html加载一个名为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>

...
$.ajax({
类型:“POST”,
url:“要加载的页面.html”,
成功:函数(数据){
$(“#some_id”).html(数据);
}
});
...
要加载的页面.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文件的HTML页面

如您所见,我正在加载一个js文件,这个html.js的脚本

这很好用。问题是,如果我再次加载(我的意思是,“#some_id”变为空并加载页面以再次加载.html),所有脚本(此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;
    }
});

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

如果问题是代码正在重复,那么,只加载一次代码而不是多次加载不是更有效吗?因此,在需要时,您只需加载一次代码,并且您有一个变量说明文件是否是的,完美的解决方案是一次加载所有的.js文件,并且只使用AJAX加载HTML片段。不幸的是,大约有50个HTML页面及其相应的.js文件,对于一开始来说,这将是太多的负载是的,但我要说的是用AJAX加载JS,但只有一次,当它第一次被请求时。(其他时候,脚本节点从AJAX请求返回的字符串中剥离出来)我想我可以第一次加载.js文件并创建一个cookie,表明该文件已加载。第二次加载时,我可以检查cookie是否存在,以避免第二次加载(或类似的情况)
{
    myPage: {
        html:   'myhtml.html',
        script: 'myscript.js'
    }
}