首先,我搜索了gitter和github讨论板和维基页面,但仍然没有动作..
所以我第一次问这个问题.....:
最后也可能是最好的事情是我尝试将对象暴露给javascript范围。 https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#Expose_dotNET
好的,这适用于字符串类型的对象。但我有一个复杂的对象,里面有几个字符串数组。
我想保留javascript变量,让我们在浏览器生命周期中将其称为var _myFilters值。
我知道关于cef扩展,我记得这句话:
Extensions Extensions就像窗口绑定,除了它们被加载 进入每个帧的上下文,一旦加载就无法修改。 加载扩展并尝试时,DOM不存在 在扩展加载期间访问DOM将导致崩溃。 使用CefRegisterExtension()函数注册扩展 哪个应该从 CefRenderProcessHandler :: OnWebKitInitialized()方法。
引自网站:https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration
所以我认为这是我可以创建全局javascript变量“_myFilters”的最佳位置。它应该可以在每个浏览器选项卡中访问,但我尝试了,并且看到它(请参阅:“_ myFilters”)在每次重新加载页面时丢失值。
注册对象是一个选项,但不非常适合我复杂的javascript对象(_myFilters)..
browser.RegisterJsObject("bound", new BoundObject());
我试过但只适用于string,int等。
我打算公开一个“对象”(请参阅:_myFilters)数据类型,但这次浏览器崩溃了。
所以问题是:在浏览器loadstart,load end,onbrowse方法上执行javascript文件的文件中使用全局变量的最佳方法是什么?
ps:我想要这个,因为创建这个_myFilters对象是一项花费一些时间(大约3秒)的工作。我希望将其值放在我的全局值中,因此我可以在浏览器生命周期中使用它。
ps2:_myFilters的类型
答案 0 :(得分:1)
如果您希望即使浏览器进程终止也可以存储您的变量,那么我建议您使用类似chrome.storage的存储API。
如果只需要在浏览器流程的整个过程中维护全局变量,我认为您可以在background page
中设置变量它存在于您的扩展的生命周期中,并且一次只有一个活动的实例。
另一种选择是使用Event Pages。它与背景页面类似,只需在manifest.json中设置persistent
false
。
事件页面仅在需要时加载。当事件页面没有主动执行某些操作时,它将被卸载,释放内存和其他系统资源。
然后,您还可以在事件页面中声明全局变量,在事件页面即将卸载时,使用chrome.storage.local.get()
添加listen runtime.onSuspend来存储全局变量的状态。并且在加载事件页面时听取其他事件处理程序,这取决于您的需要,可能是browserAction.onClicked或runtime.onMessage,使用chrome.storage.local.set()