0

目前我们有一个广泛的基于 Web 的办公应用程序,用 PHP、javascript 来管理各种流程(计费、订购、用户管理、报告、订阅管理、文章管理、仓储等)。

该应用程序使用 iframe 加载在主应用程序界面中执行各种功能的页面。从主页创建选项卡,以便您可以在需要时访问所有打开的页面。每个页面都有自己的 javascript 包含文件、css 等来执行复杂的任务。所有 iframed 页面(大约 600 个)都在同一个域/主机上。

由于许多人将使用 iframe 描述为“邪恶”,因此我正在研究如何将应用程序转换为仅使用 div。

我的问题是:

1) 在没有 iframe 的情况下,我是否需要在主起始页上包含每个使用的 javascript 文件?或者是否可以根据您访问的页面将javascript文件动态加载到内存中?(包括新的函数声明等)

2)当有人关闭页面时,这些包含文件可以完全从内存中删除吗?(在这种情况下是一个 div)。这样可以避免不同文件的函数名和变量之间可能发生的冲突,也不会增加浏览器的内存使用量。

3)或者也许iframe毕竟不是那么“邪恶”,这是使用iframe的正确方法?

谢谢你的建议

奶酪帕特里克

4

2 回答 2

0

您是否尝试过任何代码或只是询问?

你可以使用jquery(见这里

$.getScript("ajax/test.js", function(data, textStatus, jqxhr) {
   console.log(data); //data returned
   console.log(textStatus); //success
   console.log(jqxhr.status); //200
   console.log('Load was performed.');
});
于 2013-05-08T10:27:05.877 回答
0

只要您的 javascript 是模块化的,您就可以随时卸载它。

如果您不知道,Javascript 中的函数就是对象。使用对象,您可以这样做:

var a = {b:10, c:20, d:30}; //Some memory is allocated for object a
a = null; //Object a will be deleted, and no longer need any memory

你如何使用它来处理函数?这是最简单的解释:

var myFunction = function(a,b,c) {
    alert(a+b+c);
}; //Here we have a function stored in memory
myFunction = null; //And now we don't

您可以通过这种方式制作整个函数库,然后通过一次操作将它们删除。例子:

var MyMath = {};
MyMath.abs = function(a) {
    return (a<0)?-a:a;
};
MyMath.min = function(a,b) {
    return a>b?b:a;
}; //MyMath uses some memory.
alert(MyMath.min(5,10));
MyMath = null; //Now it does not

因此,将所有库包装到对象中,并在需要时卸载这些对象。

添加:

当您的浏览器看到一些新的 Javascript 代码时,它会立即执行所有这些代码。它也确实将其保存在内存中,但不再使用它(基本上它的存储方式hello与存储在 中的方式相同<div>hello</div>)。因此,最好的解决方案是:

1)<script>动态添加标签以按需加载所需的Javascript文件。它看起来像:

if (MyMathLibrary == null || MyMathLibrary == undefined) {
    createScriptElementForMathLibrary();
}

alert(MyMathLibrary.calculateEnthropyOfTheUniverse());

2) 每当您不再需要该库时,您只需MyMathLibrary = null. 此时你也可以从 DOM 中删除它,它不会造成任何伤害,正如我所说,此时它只不过是不可见的 div。

但老实说,你确定这值得费心吗?现在人们纯粹用 Javascript 编写3D 射击游戏,并且计算机具有 4-16 GB 的内存。此外,通常的做法是首先制作一个工作程序并仅在它滞后时才进行优化。否则,您很可能会花费一个月的时间来做一些用户永远不会注意到的事情。

于 2013-05-08T11:10:33.543 回答