【问题标题】:Handling custom Javascript events in WebBrowser Control C#在 WebBrowser Control C# 中处理自定义 Javascript 事件
【发布时间】:2014-03-20 03:48:32
【问题描述】:

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

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

这段 javascript 代码会检测到它:

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

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

【问题讨论】:

  • 当你说“捕捉溢出事件”时,你到底是什么意思?
  • 我的意思是,处理事件(编辑我的问题)。所以我需要点击表格中的一个链接,一旦它被填充。
  • 我还是不太明白你的意思,log 函数没有处理事件吗?
  • 在 firebug 中,我发布的 javascript 代码可以工作,并且会处理事件。我需要在 WebBrowser 控件中实现它。到目前为止,我已经将一个事件处理程序附加到我正在处理的帧的主体以侦听溢出,但它不起作用。
  • 在完整的 IE 浏览器中先尝试一下,看看那里是否触发了这个事件。

标签: c# javascript webbrowser-control


【解决方案1】:

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 事件——比如点击、鼠标悬停、鼠标移动等。因此你最终的方法是围绕这个限制编写代码。

【讨论】:

  • 它不起作用。 ; 看来你只能处理纯 DOM 事件 所以,你的答案不适用。而不是写“请看下面的正确答案”——你应该打开“这曾经有效,但不再有效”可能'...
  • @mschr 正确答案是你只能挂钩 dom 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多