关于System.Windows.Forms.WebBrowser的问题

时间:2010-02-13 09:14:59

标签: c# javascript browser

我在我的应用程序中使用System.Windows.Forms.WebBrowser控件:

private System.Windows.Forms.WebBrowser objBrowser;

我的objBrowser导航的任何地方,我希望它具有此javascript功能:

function alert(message)
{
  window.external.handleMessage(message);
}

覆盖警报功能。

当我使用它时:

private void objBrowser_DocumentCompleted(
    object sender, WebBrowserDocumentCompletedEventArgs e)
{
  objBrowser.Url = new Uri(
    "javascript:function alert(message){window.external.handleMessage(message);};");

  objBrowser.Document.InvokeScript("alert", new object[] { "hello" });//line 1
}

public void handleMessage(object obj)
{
  string msg = obj.ToString();
}
java脚本中的

alert函数不会将消息传递给我的表单。但是当我使用它时:

private void button1_Click(object sender, EventArgs e)
{
  objBrowser.Document.InvokeScript("alert", new object[] { "hello" });
}

private void objBrowser_DocumentCompleted(
    object sender, WebBrowserDocumentCompletedEventArgs e)
{
  objBrowser.Url = new Uri(
    "javascript:function alert(message){window.external.handleMessage(message);};");
}

public void handleMessage(object obj)
{
  string msg = obj.ToString();
}

并单击button1我的表单的handleMessage方法,该方法使用包含“hello”字符串的对象执行。

我想在objBrowser将导航的任何页面中覆盖java脚本中的警报功能。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

嗯,两个代码示例之间的唯一区别似乎是设置alert替换函数和调用它之间的时差。

在第一种情况下,当您致电alert时,该页面可能尚未就绪;在第二种情况下,可能有足够的时间在用户通过单击按钮调用它之前设置alert

这只是猜测。但是,如果您在调用alert之前等待页面准备就绪可能会有所帮助。

答案 1 :(得分:1)

使用下面的代码

Private Sub webDest_Navigated(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs) Handles webDest.Navigated
    injectAlertBlocker()

End Sub
Sub injectAlertBlocker()
    Dim head As HtmlElement = webDest.Document.GetElementsByTagName("head")(0)
    Dim scriptEl As HtmlElement = webDest.Document.CreateElement("script")
    Dim element As IHTMLScriptElement = CType(scriptEl.DomElement, IHTMLScriptElement)
    Dim alertBlocker As String = "window.alert = function () { }"
    element.text = alertBlocker
    head.AppendChild(scriptEl)
End Sub