Как обрабатывать события 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();
}
}