Как обрабатывать события Javascript через элемент управления WebBrowser для WinForms

Я прочитал WebBrowser Control из .Net - Как внедрить Javascript, Можно ли вызвать метод Javascript из С# winforms и многие другие. Такими примерами были возвращаемое значение функции или окно предупреждения (синхронные вызовы). Я должен получить результат из обработчика событий (асинхронный вызов):

<script type="text/javascript">
        window.onload = function() {
            var o = new M.Build(document.getElementById("ZID"));

            M.Events.observe(o, o.Events.Success, function() {
                // I have to get some value!!
            });

            M.Events.observe(o, o.Events.Fault, function() {
                // I have to get some value!!
            });
        }
    </script>

Ответы

Ответ 1

Вызов С# из JavaScript

Проще говоря, вы можете открыть объект С# в WebBrowser, что JavaScript может напрямую звонить WebBrowser класс предоставляет свойство, называемое ObjectForScripting, который может быть установлен вашей заявки и window.external внутри объекта JavaScript. Объект должен иметь ComVisibleAttribute установлено true

С#:

 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public class ScriptInterface
    {
        public void callMe()
        {
            … // Do something interesting
        }
    }

    webBrowser1.ObjectForScripting = new ScriptInterface();

JavaScript:

window.external.callMe();

Вызов JavaScript в элементе управления WebBrowser с С#

Ответ 2

Это код, который у меня есть. В событии DocumentCompleted (потому что я получаю страницу из сети)

var wb = (WebBrowser)sender
//Lots of other stuff
object obj = wb.Document.InvokeScript("MyFunctionName");

Создайте функцию, которая возвращает любое требуемое значение и вызывается.

Вы также можете ввести script на страницу

string js = "function MyFunctionName(){alert('Yea!');}";
HtmlElement el = wb.Document.CreateElement("script");
IHTMLScriptElement element2 = (IHTMLScriptElement)el.DomElement;
element2.text = js;
head.AppendChild(el);

который затем можно вызвать. Это то, что я сделал.

Ответ 3

Если ваш элемент управления webBrowser находится в форме, вы можете сделать следующее:

[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Form1
{

    public Form1()
    {
       InitializeComponent();
       webBrowser1.ObjectForScripting = this;
    }

    public void CallMe()
    {
        //.... this method can be called in javascript via window.external.CallMe();
    }
}