Javascript FireBreath插件通过多个页面

Javascript FireBreath插件通过多个页面,javascript,plugins,npapi,firebreath,Javascript,Plugins,Npapi,Firebreath,我正在用FireBreath开发web插件,在这方面我是个新手。到目前为止,我已经开发了相当复杂的插件API类(带有注册的方法、属性和一些其他变量和结构)。我正在使用javascript和默认值将其加载到页面上 对象id=“plugin0”类型=“application/x-myapp>标记。但现在我需要重定向到另一个html页面,并且需要保留上一页面中以前填充的所有变量。对于同一个带有OBJECT标记的模型,我想我创建了插件的另一个实例,因为所有变量都未定义。因此,我的重点是如何保留插件的一个

我正在用FireBreath开发web插件,在这方面我是个新手。到目前为止,我已经开发了相当复杂的插件API类(带有注册的方法、属性和一些其他变量和结构)。我正在使用javascript和默认值将其加载到页面上

对象id=“plugin0”类型=“application/x-myapp>标记。
但现在我需要重定向到另一个html页面,并且需要保留上一页面中以前填充的所有变量。对于同一个带有OBJECT标记的模型,我想我创建了插件的另一个实例,因为所有变量都未定义。因此,我的重点是如何保留插件的一个实例并使其在多个html页面中可访问?
具体来说,我有一个页面,在该页面中,我将变量和指针存储在带有登录屏幕的插件API类中,登录后,我需要重定向到另一个页面,并能够访问以前填充的变量和指针。

简单答案?你不能。插件是特定于单个页面的。任何给定的插件实例都将被销毁,包含它的对象标记将被销毁——句号。这条规则没有例外

也就是说,您可以尝试以下几种选择:

1) 重写您的网站,使其成为AJAX和javascript驱动的,以便所有页面实际上都是具有不同哈希标记的同一页面,等等。请参阅一个有助于实现这一点的框架。从插件的角度来看,这绝对是最简单的解决方案,但可能需要重写整个网站,这可能会有问题

2) 使用web应用程序维护状态,并将数据传递回每个页面上的插件。插件实例化后,您可以通过param标记或函数调用来实现这一点

3) 使用存储在全局内存空间中的数据,使用插件创建某种类型的“会话”;然后,您可以在另一页上继续“会话”。例如:

if (!plugin.restoreSession("userid")) {
    plugin.createSession("userid");
}
在本例中,createSession和restoreSession将用于初始化或恢复给定会话。这样做的挑战是,您不知道使用插件打开了多少选项卡或页面,因此很容易在访问相同全局数据的页面之间发生冲突。此外,有人可能会创建另一个网页,使用您的插件恢复会话并更改或访问数据,因此存在安全风险。您可以通过在会话中存储域名并只允许从同一域访问会话来缓解这种情况,但是。。。好吧,现在你基本上只是重新创建了cookies

此外,浏览器实际上并不保证插件模块的加载时间;它可以在没有活动实例(页面请求之间)的任何时刻将其卸载到您身上。实际上,在浏览器关闭之前,插件模块很可能不会卸载,这意味着在插件的全局内存中存储的任何数据都不会被释放,并将继续占用内存,直到关闭浏览器

4) 创建一个浏览器扩展,该扩展使用您的插件并跨多个页面请求工作。我不知道如何做到这一点,但我从其他人那里听到的事情让我相信这是可能的。请记住,您必须为每个受支持的浏览器制作一个,这在IE上可能是不可能的;可能只在Firefox/Chrome上


因为您是StackOverflow的新手,所以我欢迎您访问该网站,并提醒您无论何时发布问题(不仅仅是这一个!),都要更新有用的答案,并尽量将其中一个标记为正确。

您好,感谢您的帮助和复杂的答案。在我内心深处的某个地方,我认为有可能我做不到这一点。我想我会走1)的路,因为我的网站到目前为止只有2页。请记住,如果你使用CSS使插件显示:无或可见性:隐藏,你会导致它卸载;最简单的解决方案通常是绝对定位它,并在应该隐藏它时使其1px乘以1px