我正在使用 FireBreath 开发网络插件,我在这方面还是个新手。到目前为止,我已经开发了相当复杂的插件 API 类(带有注册的方法、属性和一些其他变量和结构)。
我正在使用 javascript 和默认对象 id="plugin0" type="application/x-myapp> 标签将其加载到页面上。
但是现在我需要重定向到另一个 html 页面,并且我需要保留以前填充的所有变量页面。使用带有 OBJECT 标记的相同模型,我想我创建了插件的另一个实例,因为所有变量都未定义。所以我的问题是如何保留一个插件实例并使其在多个 html 页面中可访问?
具体来说,我有一个页面,我在带有登录屏幕的插件 API 类中存储变量和指针,登录后我需要重定向到另一个页面并能够访问以前填充的变量和指针。
1 回答
简单的答案?你不能。插件特定于单个页面。任何给定的插件实例都将被销毁,其中包含它的对象标记被销毁 -句号。这条规定没有例外。
也就是说,您可以尝试以下几种选择:
1) 将您的网站重写为 AJAX 和 javascript 驱动,以便所有页面实际上是具有不同主题标签等的同一页面。请参阅http://backbonejs.org/以获得有助于此的一个框架。从插件的角度来看,这绝对是最简单的解决方案,但它可能需要重写整个网站,这可能会出现问题。
2) 使用您的 Web 应用程序维护状态并将数据传递回每个页面上的插件。插件实例化后,您可以通过参数标签或函数调用来做到这一点
3) 使用您的插件创建某种“会话”,并将数据存储在全局内存空间中;然后,您可以在另一个页面上恢复“会话”。例如:
if (!plugin.restoreSession("userid")) {
plugin.createSession("userid");
}
在此示例中,createSession 和 restoreSession 将用于初始化或恢复给定会话。这样做的挑战是您不知道使用您的插件打开了多少选项卡或页面,因此您很容易在访问相同全局数据的页面之间发生冲突。此外,有人可能会创建另一个网页来使用您的插件并恢复会话并更改或访问数据,因此存在安全风险。您可以通过将域名与会话一起存储并仅允许从同一域访问会话来缓解这种情况,但是……好吧,现在您基本上只是重新创建了 cookie。
另外,浏览器实际上并不能保证你的插件模块会被加载多久;如果没有活动实例(在页面请求之间),它可以随时将其卸载给您。实际上,在浏览器关闭之前,插件模块更有可能不会被卸载,这意味着您在插件中存储在全局内存中的任何数据都不会被释放,并且会继续占用内存,直到您关闭浏览器。
4) 创建一个使用您的插件并跨多个页面请求工作的浏览器扩展程序。我不知道如何做到这一点,但我从其他人那里听到的事情让我相信这是可能的。请记住,您必须为每个支持的浏览器制作一个,这在 IE 上可能是不可能的;可能只在 Firefox/Chrome 上。
由于您是 StackOverflow 的新手,因此我欢迎您访问该站点,并在您发布问题(不仅仅是这个问题!)时提醒您,为有用的答案投票并尝试始终将其标记为正确。