加载Ext.Loader.loadScript后可以卸载javascript文件吗?

时间:2013-07-25 20:00:54

标签: extjs

如果用户选择某个选项,我只需要three.js库。它像这样加载。 (并且这样称为“var motion = bd.code.tcCrowdSim.wglRndr(a,b)”。使用后是否可以卸载?tia

Ext.define('bd.code.tcCrowdSim', {

statics: {
    wglRndr: function (caller, data) { 
        this.preLoader(caller, data);
    },

    preLoader: function(caller, data) {
        Ext.Loader.loadScript({
            url: 'js/Three.js',
            scope: this,
            onLoad: function() {
                Ext.Loader.loadScript({
                    url: 'js/ShaderExtrasCrowd.js',
                    scope: this,
                    onLoad: function() {
                        Ext.Loader.loadScript({
                            url: 'js/PostProcessingCrowd.js',
                            scope: this,
                            onLoad: function() {
                                this.crowd2(caller, data);
                             }
                        })
                    }
                })
            }
        })
    },

    crowd2: function(caller,data) { .....

....不确定编辑原文或添加评论到特定答案是最好的沟通方式吗?

init : function(){
    var len = $('script[src*="js/Three2.js"]').length;
    if (len === 0) {
        console.log('SCRIPNOTLOADED');
        this.preLoader(this.caller, this.data); // preLoader.onLoad calls doScene
    }
    else{
        this.doScene(this.caller, this.data);
    }
},

代码检测是否加载了js,并添加了

preLoader: function(caller, data) {
    Ext.Loader.setConfig({
        preserveScripts: false
    })
    Ext.Loader.loadScript({ .....
每次强制脚本被刷新时,

强制加载?因为它是用

开始的
this.motion = bd.code.tcCrowdSim.wglRndr(a,b)
来自Deft ViewController的

,想知道什么时候应用“删除False和可选地垃圾收集异步加载的脚本”?在开头方面,持有所有webGL / Threejs内容的canvas对象是在一个模态的extjs弹出窗口上创建的,因此用户关闭窗口继续。在这一点上,说没有相关的html / dom足迹是真的吗?也许这比装载两个版本的ThreeJS更重要?

2 个答案:

答案 0 :(得分:3)

Loader.loadScript()向DOM添加新的<script>标记(在本例中为HTML标题),然后浏览器会运行该脚本。

您可以从DOM中删除脚本,但在大多数浏览器中,AFAIK,加载脚本中声明的变量/函数/对象仍然可用。你可以delete他们。

这是一个测试,从ExtJS加载jQuery(我不知道你为什么要这样做;):

http://jsfiddle.net/ny49m/5/

Ext.Loader.setConfig({
    enabled:true
});

console.log(typeof jQuery == 'undefined'); //true

Ext.onReady(function(){

    Ext.Loader.loadScript({

      url:'http://code.jquery.com/jquery-1.10.1.min.js',

      onLoad:function(){

        console.log(typeof jQuery == 'undefined'); //false

         //remove the script tag from the DOM:
         var scripts = document.getElementsByTagName('script');
         for(var i=0; i<scripts.length; i++){
            if(scripts[i].src.indexOf('jquery') != -1){
                scripts[i].parentNode.removeChild(scripts[i]);
            }
         }

         console.log(typeof jQuery == 'undefined'); //false

         delete(jQuery); 

         console.log(typeof jQuery == 'undefined'); //true
    }
});

});

答案 1 :(得分:1)

我不会教您如何“卸载脚本”(但如果您愿意,可以由其他人讲授:How to unload a javascript from an html?)。

所以,你真正想要的是不要从内存或DOM中的标签卸载文件。你真正想要的是delete这个脚本创建的所有引用(变量),以便垃圾收集器认为它是终止的目标。

如果您的代码是像这样的vanilla javascript,那可能相对容易:

// Manual Ext.ns
window.bd = window.bd || {};
bd.code = bd.code || {};

bd.code.tcCrowdSim = { ... };

这就足够了:

delete bd.code.tcCrowdSim;

现在,考虑到bd.code.tcCrowdSim是一个Ext类,Ext的内部保留了很多对它的引用,所以这还不够。在与Neil讨论后,看来Ext提供了一个仅用于此目的的函数:Ext.ClassManager.undefine

提供Ext开发人员是可靠的,然后应该这样做:

Ext.ClassManager.undefine('bd.code.tcCrowdSim');

话虽如此......使用Ext类加载系统延迟加载可选脚本是一个非常好的主意吗?考虑到有一天你可能最终将你的应用程序编译成一个大的缩小的javascript文件,其中将出现这个类......而且这并没有谈到单个Ext类在内存环境中的内存影响非常低。现代客户,无论是小巧的智能手机......