在WebBrowser Control C#中处理自定义Javascript事件

时间:2014-02-19 16:44:04

标签: c# javascript webbrowser-control

我正在尝试处理似乎是自定义js事件。我有一个通过AJAX请求更新的表,它包含在iframe内的一个框架中。我必须检测此表填充数据的时间。

当我在firebug中检查表时,它显示一个名为overflow的事件运行。但我在任何地方都找不到任何关于它的东西所以我认为它是自定义的或者只是不支持,至少不是我正在使用的WebBrowser控件。

此javascript代码将检测到它:

(function(){
    function log( e ) {
        console.log( e );
    }
    window.frames[0].frames[1].document.body.addEventListener( "overflow", log );    
})();

但是,除非绝对必要,否则我想避免使用js到C#调用,如何使用Web浏览器处理C#中的溢出js事件?

1 个答案:

答案 0 :(得分:0)

2015年6月11日更新:请在下方查看正确的答案

你可以看一下:Web browser control: How to capture document events?

但是这显示了COM加载项的使用。但是,从.net 4.5开始,这可以在开箱即用的情况下完成。

说这是一个小的html页面:

<html>
    <head>
        <script src="http://code.jquery.com/jquery.js"></script>
        <script>
            $(function() {
                $('input').click(function(){
                    alert("hello");
                    $(document).trigger("foo");
                });
            });
        </script>
    </head>
    <body>
        <input type="button" value="Trigger"/>
    </body>
</html>

此页面将触发文档上的自定义事件。我使用python web服务器@ localhost:4542托管此页面。 (这里没有显示)。您必须等待加载html文档,然后发布,附加事件处理程序。

using System;
using System.Windows.Forms;

namespace winformWebBrowser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://localhost:4542");
            webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
        }

        void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            webBrowser1.Document.AttachEventHandler("foo", new EventHandler(delegate(object s, EventArgs k)
            {
                MessageBox.Show("foo");

            }));
        }
    }
}

但是如果你想在活动中公开自定义数据怎么办?截至目前,我还没有得到答案......但你可以设计很多方法来实现这一目标。例如,将所有必要的数据放在html文档某处的隐藏字段中......并从c#代码中查询出来

2015年6月11日更新:我记得第一次尝试时代码工作正常。但是,在随后的测试中,它每次都失败了。看起来你只能处理纯DOM事件 - 比如click,mouseover,mousemove等。因此你最后的方法是围绕这个限制编写代码。