Связанный объект CEFSharp потерян при загрузке нового сайта - PullRequest
0 голосов
/ 30 сентября 2018

Я использую CEFSharp в одном из моих проектов, и пока все работает отлично.Я все еще на V63 CEFSharp (никогда не трогайте работающую систему :-))

Я использую его в 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 с browser.ExecuteScriptAsync ..... это в основном список событий, который будет запускать связанный объект, когдасобытие происходит (например, mousclick).

Это также до сих пор работает на 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 ]

0 голосов
/ 25 июля 2019

Для тех, кто пытается сделать то же самое в C # (как и я):

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

Я добавил проверку состояния IsLoading, так как нет причины привязывать объект, когда браузер начинает загрузка (по крайней мере, в моем случае).

0 голосов
/ 24 ноября 2018

Последнее предложение 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

А потом позже в Sub, которая обрабатывает событие browser_LoadingStateChangedAsync, я просто добавил эту строку перед любым другим введенным JS:

 'use new binding V2 method by calling CefSharp.BindObjectAsync:
 browser.ExecuteScriptAsync("CefSharp.BindObjectAsync(""bound"");")

Надеюсь, это поможет другим, использующим CEFsharpin VB.NET, если они столкнутся с той же проблемой.

...