开发者问题收集

加载新网站时 CEFSharp 绑定对象丢失

2018-09-30
3411

我在我的一个项目中使用了 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:绑定未定义”的错误

看起来好像在 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"");")

但仍在努力使其工作 :-(

2个回答

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 的人遇到同样的问题,我希望这能有所帮助。

Oscar Diez
2018-11-24

对于任何试图在 C# 中做同样事情的人(比如我):

Browser.JavascriptObjectRepository.Register("myObject", interf, true);
Browser.LoadingStateChanged += (s, a) =>
{
    if (a.IsLoading) return;
    Browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(\"myObject\");");
};

我添加了检查 IsLoading 状态,因为当浏览器 开始 加载时没有理由绑定对象(至少在我的用例中)。

Marc
2019-07-25