首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从html中卸载javascript?

如何从html中卸载javascript?
EN

Stack Overflow用户
提问于 2010-12-06 17:47:44
回答 5查看 37.6K关注 0票数 26

如何从DOM中卸载包含所有已定义对象的JavaScript资源?

我正在开发一个简单的框架,可以将html片段加载到一个“主”html中。每个片段都是自包含的,并且可以包含对其他JS和CSS文件的引用。JS和CSS资源被解析并动态地添加到html。当从DOM中删除/替换该片段时,我希望删除它的JS和CSS。

如果我删除下面示例中的script元素,在page1.js中定义的函数仍然可用。

代码语言:javascript
复制
<html>
  <head>
    <script src="page1.js" type="text/javascript"></script>
  </head>
<body>
...

有没有办法从DOM卸载page1.js对象?

使用=======对测试代码执行=========

我尝试了我在下面的评论中得到的建议:使用清理函数删除添加的对象-但即使这样也失败了。我用来测试的源码:

代码语言:javascript
复制
<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来源:

代码语言:javascript
复制
var foo = function(){
    alert("hello from foo");
}
EN

回答 5

Stack Overflow用户

发布于 2010-12-06 17:52:01

这是做不到的。

执行脚本时,会将函数定义添加到全局window对象中。可能存在附加到函数的调试符号,这些符号指示函数的来源,但此信息对脚本不可用。

要实现这样的效果,唯一的方法就是在脚本中创建一个伪命名空间,然后在完成后丢弃整个命名空间。然而,这个问题提示我,你正试图以错误的方式做一些事情。也许详细阐述您的方案将有助于我们提供替代解决方案。

票数 17
EN

Stack Overflow用户

发布于 2010-12-06 17:50:12

也许你需要考虑有条件地加载它,而不是有条件地卸载它……

票数 6
EN

Stack Overflow用户

发布于 2010-12-06 17:51:39

不,这不可能。您可以构建一个简单的清理函数来删除该文件中定义的所有变量:

代码语言:javascript
复制
var foo = 'bar';
var cleanup = function () {
    delete window.foo;
    delete window.cleanup;
};

// unload all resources
cleanup();

另一种方法是对你的片段使用模块化的对象结构,这些片段在它们自己之后就会被清除。这涉及到稍微高一点的开销,但可能是值得的,因为它使代码更容易阅读和维护:

代码语言:javascript
复制
// creates the object using the second parameter as prototype.
// .create() is used as constructor
GlobalModuleHandlerThingy.addModule('my_module', {
    create: function () {
        this.foo = 'bar';
        return this;
    },
    foo: null,
    destroy: function () {
        // unload events, etc.
    }
});

GlobalModuleHandlerThingy.getModule('my_module').foo; // => bar
GlobalModuleHandlerThingy.unloadModule('my_module'); // calls .destroy() on the module and removes it.
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4365062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档