加载新网站时 CEFSharp 绑定对象丢失
CEFSharp bound object lost when new website is loaded
我在我的一个项目中使用 CEFSharp,到目前为止一切正常。
我仍在使用 CEFSharp 的 V63(永远不要触摸 运行 系统 :-))
我在VB.NET
中使用它
绑定对象是在 Public Sub New() 中 CEFSharp 初始化后创建的,如下所示:
CefSharpSettings.LegacyJavascriptBindingEnabled = True
Dim obj As New BoundObject()
obj.browser = browser
browser.RegisterJsObject("bound", obj)
AddHandler browser.LoadingStateChanged, AddressOf obj.Browser_LoadingStateChanged
然后我在浏览器的每个 "LoadingStateChanged" 事件之后执行一个带有 browser.ExecuteScriptAsync 的 JS 脚本......它基本上是一个事件监听器,它将在事件发生时触发绑定对象(例如鼠标点击)。
到目前为止这也 100% 正常....事件触发并调用绑定对象并通过绑定对象将变量传递给我的 VB.NET 代码。
现在我的问题是加载新页面后绑定的对象丢失了。
事件监听器将尝试调用绑定的对象,但我只是收到类似 "Uncaught ReferenceError: bound is not defined"
的错误
看起来正在 CEFSharp 中加载一个新页面,绑定的对象丢失了。
我也尝试使用 FrameLoadEnd 事件代替上述初始化代码,但它的行为与 LoadingStateChanged 事件完全相同。
有人知道我在加载新网站时如何处理(或更新)绑定对象吗?
谢谢
更新:
同时,我尝试了推荐的绑定方法 V2。
使用以下代码进行测试:
'########### TEST CODE TEST CODE TEST CODE ##################
'try to use new binding V2 method by calling CefSharp.BindObjectAsync:
browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(""myObject"");")
'now register object:
browser.JavascriptObjectRepository.Register("myObject", New BoundObject(), True)
'now do test execution of myObject:
browser.ExecuteScriptAsync("myObject(""test"");")
但仍在努力让它工作:-(
amaitland 的最后一个建议解决了这个问题。它现在可以在各种站点上很好地工作。原则上我只是在我原来的工作代码中替换了这两行:
Dim obj As New BoundObject()
obj.browser = browser
'browser.RegisterJsObject("bound", obj) 'replaced by next line (JS binding V2)
browser.JavascriptObjectRepository.Register("bound", obj, True, Nothing)
AddHandler browser.LoadingStateChanged, AddressOf obj.Browser_LoadingStateChanged
然后在处理 browser_LoadingStateChangedAsync
事件的 Sub 中,我刚刚在任何其他注入的 JS 之前添加了这一行:
'use new binding V2 method by calling CefSharp.BindObjectAsync:
browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(""bound"");")
我希望这可以帮助其他使用 CEFsharpin VB.NET 的人,如果他们遇到同样的问题。
对于任何试图在 C# 中做同样事情的人(比如我):
Browser.JavascriptObjectRepository.Register("myObject", interf, true);
Browser.LoadingStateChanged += (s, a) =>
{
if (a.IsLoading) return;
Browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(\"myObject\");");
};
我添加了检查 IsLoading
状态,因为没有理由在浏览器 开始 加载时绑定对象(至少在我的用例中) .
我在我的一个项目中使用 CEFSharp,到目前为止一切正常。 我仍在使用 CEFSharp 的 V63(永远不要触摸 运行 系统 :-))
我在VB.NET
中使用它绑定对象是在 Public Sub New() 中 CEFSharp 初始化后创建的,如下所示:
CefSharpSettings.LegacyJavascriptBindingEnabled = True
Dim obj As New BoundObject()
obj.browser = browser
browser.RegisterJsObject("bound", obj)
AddHandler browser.LoadingStateChanged, AddressOf obj.Browser_LoadingStateChanged
然后我在浏览器的每个 "LoadingStateChanged" 事件之后执行一个带有 browser.ExecuteScriptAsync 的 JS 脚本......它基本上是一个事件监听器,它将在事件发生时触发绑定对象(例如鼠标点击)。
到目前为止这也 100% 正常....事件触发并调用绑定对象并通过绑定对象将变量传递给我的 VB.NET 代码。
现在我的问题是加载新页面后绑定的对象丢失了。
事件监听器将尝试调用绑定的对象,但我只是收到类似 "Uncaught ReferenceError: bound is not defined"
的错误看起来正在 CEFSharp 中加载一个新页面,绑定的对象丢失了。
我也尝试使用 FrameLoadEnd 事件代替上述初始化代码,但它的行为与 LoadingStateChanged 事件完全相同。
有人知道我在加载新网站时如何处理(或更新)绑定对象吗?
谢谢
更新: 同时,我尝试了推荐的绑定方法 V2。 使用以下代码进行测试:
'########### TEST CODE TEST CODE TEST CODE ##################
'try to use new binding V2 method by calling CefSharp.BindObjectAsync:
browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(""myObject"");")
'now register object:
browser.JavascriptObjectRepository.Register("myObject", New BoundObject(), True)
'now do test execution of myObject:
browser.ExecuteScriptAsync("myObject(""test"");")
但仍在努力让它工作:-(
amaitland 的最后一个建议解决了这个问题。它现在可以在各种站点上很好地工作。原则上我只是在我原来的工作代码中替换了这两行:
Dim obj As New BoundObject()
obj.browser = browser
'browser.RegisterJsObject("bound", obj) 'replaced by next line (JS binding V2)
browser.JavascriptObjectRepository.Register("bound", obj, True, Nothing)
AddHandler browser.LoadingStateChanged, AddressOf obj.Browser_LoadingStateChanged
然后在处理 browser_LoadingStateChangedAsync
事件的 Sub 中,我刚刚在任何其他注入的 JS 之前添加了这一行:
'use new binding V2 method by calling CefSharp.BindObjectAsync:
browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(""bound"");")
我希望这可以帮助其他使用 CEFsharpin VB.NET 的人,如果他们遇到同样的问题。
对于任何试图在 C# 中做同样事情的人(比如我):
Browser.JavascriptObjectRepository.Register("myObject", interf, true);
Browser.LoadingStateChanged += (s, a) =>
{
if (a.IsLoading) return;
Browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(\"myObject\");");
};
我添加了检查 IsLoading
状态,因为没有理由在浏览器 开始 加载时绑定对象(至少在我的用例中) .