2010-02-13 124 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