Jim*_*Lin 5 html javascript object
我目前有一个运行基于Javascript的全局API的Web应用程序,它初始化如下:
var Api = {
someVar: "test",
someFunction: function() {
return "foo";
}
}
Run Code Online (Sandbox Code Playgroud)
此API在Web应用程序中的许多"窗口小部件"中共享,它们应该全部运行此单个Api实例,以便它们可以相互传递数据.
AJAX目前用于加载这些小部件,例如在小部件/ mywidget.html中,它放在,例如, <div id='widget_<random number>'>...</div>
代码的某些其他部分可能会选择添加更多功能Api,目前它的执行方式如下:
Api.myExtension = {
myNewFunction: function() {
return "bar";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这种用法会产生一些问题:
问题一:如果一个小部件(这些可能由第三方提供)决定隐藏一些代码,并做类似的事情Api = {},摧毁Api一切所有的全局变量,并打破整个应用程序,该怎么办?是否有可能保护此Api变量不被外部覆盖?只允许"扩展"(添加新内容),但不允许"删除/更改".即:
Api.foo = { test: "bar" } // allowed
Api.someVar = "changing the existing someVar"; // not allowed
Run Code Online (Sandbox Code Playgroud)
以下代码位于"内部" Api,例如:
var Api = {
Debug: {
Messages = new Array,
Write: function() {
Api.Debug.Messages.push("test"); // allowed
}
}
}
Api.Debug.Messages.push("test 2"); // not allowed
Run Code Online (Sandbox Code Playgroud)
我想到的可能的解决方案:
假设我们只是使用框架来解决这个问题.Api提供的s现在彼此分开.但是,Api如果我有很多Widgets正在运行,则一次又一次地加载会产生额外的开销,并且它们无法再与小部件的"主机"(帧所在的页面)进行通信,例如,我可能想告诉主机显示通知:Api.Notify.Show("Test"),但它不能这样做,因为它Api完全独立于其他实例,并且它无法与"主机"通信
使用诸如"getter"和"setter"之类的功能来读取和写入Api.我不确定如何实现这一点,所以欢迎任何关于如何实现这一点的指导方面的帮助!
1/2的混合物?
保护全局变量的唯一方法(至少我能想到的)是防止小部件直接访问它。正如您所建议的,这可以通过使用框架函数来实现。您应该创建一个包含 Widget 应该能够使用的所有功能的对象,并将其传递给每个 Widget。例如:
var Api = {
widgetApi = {
someFunction: function(){
// ...
}
},
addWidget:function(){
var temp = this.widgetApi.constructor();
for(var key in this.widgetApi)
temp[key] = clone(this.widgetApi[key]);
return temp;
}
// Include other variables that Widgets can't use
}
Run Code Online (Sandbox Code Playgroud)
这样,小部件就可以执行函数并与主机或全局变量进行通信Api。要设置变量,小部件将编辑其私有对象,而不是全局对象。对于每个框架(代表一个 Widget),您必须初始化或创建该对象的副本widgetApi,并且可能将其存储在数组中,以便将Widget 的实例Api存储在主对象中。
例如,给定<iframe id="widget"></iframe>
您将执行以下操作:
var widget = document.getElementById("widget");
widget.contentWindow.Api = Api.addWidget();
widget.contentWindow.parent = null;
widget.contentWindow.top = null;
Run Code Online (Sandbox Code Playgroud)
此外,在每个框架中,您需要将parent和top变量设置为 null,以便小部件无法访问主框架的数据。我已经有一段时间没有测试这个方法了,所以可能有一些方法可以绕过将这些变量设置为空。
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |