如何通过WebBrowser控件为WinForms处理javascript事件

时间:2011-03-02 12:35:23

标签: javascript winforms javascript-events webbrowser-control

我已阅读WebBrowser Control from .Net — How to Inject JavascriptIs it possible to call Javascript method from c# winforms和其他许多人。这些示例是返回函数值或警报窗口(同步调用)。我必须从事件处理程序(asyn调用)获得结果:

<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>

3 个答案:

答案 0 :(得分:32)

  

从JavaScript调用C#

     

简单地说,您可以公开C#对象   到了WebBrowser那个JavaScript   可以直接调用WebBrowser   class公开了一个名为的属性   可以设置的ObjectForScripting   你的申请并成为   window.external对象   JavaScript的。对象必须有   ComVisibleAttribute设置为true

C#:

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

    webBrowser1.ObjectForScripting = new ScriptInterface();

使用Javascript:

window.external.callMe();

Calling JavaScript in a WebBrowser control from C#

答案 1 :(得分:1)

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

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

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

您还可以将脚本注入页面

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

。这就是我所做的。

答案 2 :(得分:0)

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