如何通过WinForms的WebBrowser控件处理Javascript事件

如何通过WinForms的WebBrowser控件处理Javascript事件,javascript,winforms,webbrowser-control,dom-events,Javascript,Winforms,Webbrowser Control,Dom Events,我读过,还有很多其他的。这些示例是返回函数值或警报窗口(同步调用)。我必须从事件处理程序(异步调用)获取结果: window.onload=函数(){ var o=新的M.Build(document.getElementById(“ZID”); M.Events.observe(o,o.Events.Success,function(){ //我必须得到一些价值!! }); M.Events.observe(o,o.Events.Fault,function(){ //我必须得到一些价值!!

我读过,还有很多其他的。这些示例是返回函数值或警报窗口(同步调用)。我必须从事件处理程序(异步调用)获取结果:


window.onload=函数(){
var o=新的M.Build(document.getElementById(“ZID”);
M.Events.observe(o,o.Events.Success,function(){
//我必须得到一些价值!!
});
M.Events.observe(o,o.Events.Fault,function(){
//我必须得到一些价值!!
});
}

这是我的代码。在DocumentCompleted事件中('因为我从联机获取页面)

创建一个函数,返回您需要的任何值并调用它

您还可以向页面中插入脚本

string js = "function MyFunctionName(){alert('Yea!');}";
HtmlElement el = wb.Document.CreateElement("script");
IHTMLScriptElement element2 = (IHTMLScriptElement)el.DomElement;
element2.text = js;
head.AppendChild(el);
然后可以调用它。我就是这么做的

从JavaScript调用C#

简单地说,您可以公开一个C#对象 向Web浏览器发送JavaScript 可以直接呼叫网络浏览器 类公开一个名为 可由设置的ObjectForScript 您的应用程序并成为 window.external对象在 JavaScript。对象必须具有 ComVisibleAttribute设置为true

C#:

Javascript:

window.external.callMe();

如果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();
    }
}

o、 事件。将异步激发成功。这不是一个解决方案。我想你可以将你需要的值赋给一个变量,然后拥有或注入一个返回该值的函数。问题是:我应该什么时候调用这个函数。我不知道该事件何时执行(如果返回您调用的值的函数在值尚未设置时返回某种形式的标识符,则您将知道它尚未运行。如果没有某种类型的指示符,您将无法知道该函数是否已运行。我假定原因是您可以随后注入js代码以查看事件,然后让js调用back到你的c#代码。这就是我要尝试的。
 [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public class ScriptInterface
    {
        public void callMe()
        {
            … // Do something interesting
        }
    }

    webBrowser1.ObjectForScripting = new ScriptInterface();
window.external.callMe();
[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();
    }
}