【发布时间】:2011-05-20 21:17:04
【问题描述】:
如何从 DOM 中卸载包含所有已定义对象的 JavaScript 资源?
我正在开发一个简单的框架,可以将 html 片段加载到“主”html 中。每个片段都是自包含的,并且可能包含对其他 JS 和 CSS 文件的引用。 JS 和 CSS 资源被解析并动态添加到 html 中。当从 DOM 中删除/替换片段时,我想删除它的 JS 和 CSS。
如果我删除下面示例中的脚本元素,page1.js 中定义的函数仍然可用。
<html>
<head>
<script src="page1.js" type="text/javascript"></script>
</head>
<body>
...
有没有办法从 DOM 中卸载 page1.js 对象?
========= 我使用的测试代码=======
我尝试了我在下面的 cmets 中得到的建议;使用清理功能删除添加的对象 - 但即使这样也失败了。我用于测试的来源:
<html>
<head>
<script type="text/javascript">
function loadJSFile(){
var scriptTag = document.createElement("script");
scriptTag.setAttribute("type", "text/javascript");
scriptTag.setAttribute("src", "simple.js");
var head = document.getElementsByTagName("head")[0];
head.appendChild(scriptTag);
}
function unloadJSFile(){
delete window.foo;
delete window.cleanup;
alert("cleanedup. typeof window.foo is " + (typeof window.foo));
}
</script>
</head>
<body>
Hello JavaScript Delete
<br/>
<button onclick="loadJSFile();">Click to load JS</button>
<br/>
<button onclick="foo();">call foo()</button>
<br/>
<button onclick="unloadJSFile();">Click to unload JS</button>
</body>
</html>
simple.js 源码:
var foo = function(){
alert("hello from foo");
}
【问题讨论】:
-
如果您以客观的方式看待它,您正在尝试做与stackoverflow.com/questions/3830133/…中相同的事情。 . iframe 似乎是一种相当正常的方式,可以尽可能多地进行清理。
-
@Ravindra:我不能使用iFrames,因为我不知道片段的维度是多少,另外片段需要与页面上的现有代码进行通信。
-
资源JS是你自己维护的吗?如果是的话,围绕 JS 的一些架构肯定会有所帮助。下面由 cdhowie 和 elusive 提供的答案会有所帮助
-
不,资源不是我维护的。它是供其他人使用的框架。这是我的主要问题,我想让 3rd 方开发人员使用它尽可能简单,而无需遵循特定的设计模式。
-
如果你真的想这样做,在页面顶部放置一个脚本
<script src=load_save.js></script>,它会结束文档加载,然后使用 AJAX 或其他方式请求同一页面并修改脚本,使其成为 pre-src =网址。使用修改的 pre-src 值加载页面文档修改脚本然后看看有什么变化。
标签: javascript dom