Обратный вызов на веб-сайте, не работающем с использованием CefSharp в C # - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь получить обратный вызов с помощью cefsharp на веб-сайте, которым я не владею.

При запуске моего приложения я связываю тег "cb"

chromeBrowser.JavascriptObjectRepository.Register("cb", new BoundObject(), true);

public class BoundObject
{
     public void dosomthing()
     {
          MessageBox.Show("It worked!");
     }
}

Используя следующий JavaScriptскрипт я добавляю объект на сайт:

function insertBefore(el, referenceNode) {
    referenceNode.parentNode.insertBefore(el, referenceNode);
}

var newEl = document.createElement('div');
newEl.className = 'exampleclass';
newEl.innerHTML = '<a onclick="cb.dosomthing();">Do somthing</a>';

var ref = document.getElementById('example-tab');

insertBefore(newEl, ref);

Я выполняю это с помощью:

ExecuteScriptAsyncWhenPageLoaded

Затем, когда я нажимаю на добавленный элемент с текстом «Делать что-то», ничего не происходит.

Что я делаю не так?

1 Ответ

0 голосов
/ 30 сентября 2019

Привязка JavaScript требует, чтобы вы вызвали CefSharp.BindObjectAsync в javascript, прежде чем сможете получить доступ к объекту. Я также рекомендую обернуть ваш код в анонное замыкание, когда его длина превышает одну строку.

Пример будет выглядеть примерно так:

(async function()
{
    await CefSharp.BindObjectAsync("cb");

    //Object with name cb will have been bound, you can now access

    function insertBefore(el, referenceNode) {
        referenceNode.parentNode.insertBefore(el, referenceNode);
    }

    var newEl = document.createElement('div');
    newEl.className = 'exampleclass';
    newEl.innerHTML = '<a onclick="cb.dosomthing();">Do somthing</a>';

    var ref = document.getElementById('example-tab');

    insertBefore(newEl, ref);
})();

Также MessageBox.Show должен вызываться на UI thread, метод BoundObject.dosomething будет вызываться в фоновом потоке. Простое решение - передать ссылку на ваш Form/Window/Control (не уверен, используете ли вы WinForms или WPF, поэтому я не могу точно сказать), а затем вызвать обратный вызов в ваш поток UI. В целях тестирования у вас должно быть все в порядке, если вы хотите сделать что-то более серьезное, вы должны изменить свой код.

...