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



我正在尝试处理自定义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事件?

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

您可以查看以下内容:Web浏览器控件:如何捕获文档事件?

但这显示了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网络服务器@localhost:4452托管这个页面。(此处未显示)。您必须等待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事件,如单击、鼠标悬停、鼠标移动等。因此,您编写代码的最后方法就是绕过这一限制。