2010-02-13 150 views
0

我在应用程序中使用System.Windows.Forms.WebBrowser控制:问题有关System.Windows.Forms.WebBrowser

private System.Windows.Forms.WebBrowser objBrowser; 

任何地方我objBrowser导航,我希望它有这个JavaScript函数:

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

那覆盖警报功能。

当我使用这样的:在Java脚本

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(); 
} 

报警功能的消息不会进入我的表格。但是,当我用这个:

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。

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

我该怎么做?

+0

@qau:我重新格式化您的代码,以避免滚动条。如果您不同意,可以查看我的更改并恢复。 – 2010-02-13 09:27:21

回答

1

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

在第一种情况下,当您拨打alert时,页面可能尚未准备好;在第二种情况下,在用户通过点击按钮调用alert之前,可能有足够的时间来设置alert

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

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