如果用户选择某个选项,我只需要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更重要?
答案 0 :(得分:3)
Loader.loadScript()
向DOM添加新的<script>
标记(在本例中为HTML标题),然后浏览器会运行该脚本。
您可以从DOM中删除脚本,但在大多数浏览器中,AFAIK,加载脚本中声明的变量/函数/对象仍然可用。你可以delete
他们。
这是一个测试,从ExtJS加载jQuery(我不知道你为什么要这样做;):
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类在内存环境中的内存影响非常低。现代客户,无论是小巧的智能手机......