如何动态卸载 javascript 文件?

IT技术 javascript
2021-02-01 02:09:36

我包括使用 Ajax 的页面,但我还需要包括它们各自的 javascript 文件,这需要同时从内存中删除以前的 javascript 文件。

如何卸载当前加载的 javascript 文件(以及它们在内存中的代码),以便加载新页面的文件?它们很可能会发生冲突,因此加载了多个独立文件的 javascript 文件。

5个回答

这听起来真的像是您需要重新评估您的设计。要么您需要删除 ajax,要么您的方法名称中没有冲突。

您可以查看此链接:http : //www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

其中提供了有关如何从 DOM 中删除 javascript 的信息。但是,现代浏览器会将代码留在浏览器的内存中。

@ray:与我的回答有关的“现代”是 4 年前。那时 GC 做得不是很好;老实说,我不知道他们今天是否做得更好。
2021-03-24 02:09:36
facebook 使用相同的方法并保持代码干净,所以它们不会混淆。一个合适的面向对象的代码会做得很好,所以不会出现冲突。
2021-03-27 02:09:36
现代浏览器垃圾收集。如果对已删除代码的引用丢失,它最终将成为垃圾收集的候选对象。
2021-04-05 02:09:36
现实世界中有更多的复杂性,“重新评估你的设计”可能会被推广。具有 mixins/traits/di、自定义命名空间解决方案和其他东西的架构可能需要利用这种功能。可重用代码、代码注入/生成可能需要加载 MyClass 类,然后以某种方式进行更改,从而使 SPA 设计中的第一个过时。一种简单的方法是“卸载”该类并将其再次添加到运行时。
2021-04-10 02:09:36

不,你不能那样做。一旦 JavaScript 块在浏览器中加载并执行,它就会存储在浏览器内存中的相应窗口范围内。绝对没有办法卸载它(没有页面刷新/窗口关闭)。

您可以获取一个包含类的 js 文件。您可以使用 eval 和这样的闭包加载类 //where js = 'class MyClass { }'; 公共负载(上下文,js,类名){ js += (function() { return new ${classname}();})()返回函数(){ 返回评估(js);}.调用(上下文);只是不要将它加载到 document.head 或 body 和 eval (不使用 eval.call(context)
2021-03-25 02:09:36

你可以只命名你的代码..这样你就可以防止冲突

var MyJavaScriptCode = {};

MyJavaScriptCode.bla = 函数 () {};

还要小心您导出的内容。您可以通过使用module模式得到了很多控制的:window.someModule = (function () { /* build your module components here */ return { someComponent: myComponent, anotherComponent: myOtherComponent }; }())当然,您应该只使用 RequireJS 或其他库来卸载不必要的问题。
2021-04-12 02:09:36

其实这是很有可能的。您可以替换脚本或链接元素。

function createjscssfile(filename, filetype){
if (filetype=="js"){ //if filename is a external JavaScript file
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", filename)
}

else if (filetype=="css"){ //if filename is an external CSS file
  var fileref=document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
}
  return fileref
}

function replacejscssfile(oldfilename, newfilename, filetype){
var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none" //determine element type to create nodelist using
var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none" //determine corresponding attribute to test for
var allsuspects=document.getElementsByTagName(targetelement)
for (var i=allsuspects.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove
    if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(oldfilename)!=-1){
        var newelement=createjscssfile(newfilename, filetype)
        allsuspects[i].parentNode.replaceChild(newelement, allsuspects[i])
    }
  }
}

您必须将文件名参数填充为 src 属性,并将文件类型填充为“js”或“css”

我认为没有必要解释代码。你也曾在 2009 年发过贴,嘿嘿。也许有人会需要它吧?:)

所有功劳归于:http : //www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

顺便说一句,您可以在那里学习一些技巧。

@cale_b 这不会将其从浏览器的内存中删除,因此这样做没有意义。
2021-03-25 02:09:36
似乎无法即时替换 jQuery。添加了对 i=allsuspects.length 循环的确认。然后让它将当前加载的版本回显到控制台,它给我 1.11.3,而不是替换 3.3.1
2021-03-29 02:09:36
这是否从浏览器内存中删除了代码,或者只是删除了 html 中对代码的引用?
2021-04-07 02:09:36
加载另一个具有相同函数名称的 js 文件,其中空体替换内存。测试和它的工作。
2021-04-14 02:09:36

可以从浏览器中卸载 javaScript 文件以清除整个代码。步骤是:

  1. 给目标“ script ”元素一个ID (例如“ mainJs ”,指向“ main.js ”)
  2. 创建另一个JS文件(如“ flush.js ‘),具有相同的函数和变量在’ main.js ”,并确保函数和变量的内容是空的。
  3. 在“ main.js ”用完后,我们通过删除“ script#mainJs ”元素并将“ flush.js ”动态加载到DOM树中来刷新它

例子

mainJs    = document.getElementById("mainJs");
document.head.removeChild(mainJS);//Remooves main.js from the DOM tree

flushFile = document.createElement("script");
flushFile.setAttribute("src", "flush.js");
document.head.appendChild(flushFile);//Loads flush.js into the DOM tree, overwriting all functions and variables of main.js in browser memory to null

而已

嗨,兄弟。谢谢。带有 id 的想法非常适合识别要排除的特定文件,以防您多次包含相同的文件!!!谢谢
2021-03-30 02:09:36