我在我的应用程序中使用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脚本中的警报功能。
我该怎么做?
答案 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