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

时间:2018-09-30 15:00:02

标签: cefsharp

我在我的一个项目中使用CEFSharp,到目前为止,所有项目都运行良好。 我仍在CEFSharp的V63上(永远不要触摸正在运行的系统:-))

我正在VB.NET中使用它

在CEFSharp初始化后,在Public Sub New()中创建绑定对象,如下所示:

 CefSharpSettings.LegacyJavascriptBindingEnabled = True
        Dim obj As New BoundObject()
        obj.browser = browser
        browser.RegisterJsObject("bound", obj)
        AddHandler browser.LoadingStateChanged, AddressOf obj.Browser_LoadingStateChanged

然后,在浏览器的每个“ LoadingStateChanged”事件发生后,我用浏览器执行JS脚本。ExecuteScriptAsync.....其基本上是一个事件列表器,它将在事件发生时触发绑定的对象(例如mousclick)。 / p>

到目前为止,这也可以100%正常运行。...该事件将触发并调用绑定对象,并通过绑定对象将变量传递给我的VB.NET代码。

现在我的问题是,在加载新页面后,绑定的对象丢失了。

事件列表器将尝试调用绑定的对象,但是我只收到类似“未捕获的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 个答案:

答案 0 :(得分:1)

最后一个建议是解决了这个问题。现在,它可以在各种站点上正常运行。原则上,我只是在原始工作代码中替换了这两行:

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的其他人遇到同样的问题有所帮助。

答案 1 :(得分:0)

对于任何想在C#中做相同事情的人(像我一样):

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

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