根据javascript: 链接中的具体内容,它可能会起作用,也可能不起作用。例如:
<body>
<!-- These work -->
<a href="http://www.example.com" target="_blank">Test 0</a><br>
<a href="javascript:navigate('http://www.example.com')" target="_blank">Test 1</a><br>
<a href="javascript:'<b>hello</b> from new page!'" target="_blank">Test 2</a><br>
<a href="javascript:''" target="_blank">Test 3</a><br>
<a href="javascript:TestFunc()" target="_blank">Test 4</a><br>
<!-- This does not work -->
<a href="javascript:open('http://www.example.com')" target="_blank">Test 5</a><br>
<script>
function TestFunc()
{
return "<b>TestFunc</b> result.";
}
</script>
</body>
这是处理NewWindow 事件的代码。这段代码是用 C# 编写的,不幸的是我对 VB.NET 的了解不够好,无法正确翻译它。
private void Form1_Load(object sender, EventArgs e)
{
// this code depends on SHDocVw.dll COM interop assembly,
// generate SHDocVw.dll: "tlbimp.exe ieframe.dll",
// and add as a reference to the project
var activex = (SHDocVw.WebBrowser_V1)this.webBrowser.ActiveXInstance;
activex.NewWindow += delegate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
Processed = true;
object flags = Flags;
object targetFrame = Type.Missing;
object postData = PostData != null ? PostData : Type.Missing;
object headers = !String.IsNullOrEmpty(Headers)? Headers.ToString() : Type.Missing;
activex.Navigate(URL, ref flags, ref targetFrame, ref postData, ref headers);
};
this.webBrowser.Navigate("http://localhost:81/new-window-test.html");
}
现在,如果您真的需要使 Test 5 工作,它仍然是可能的。它的问题是实际上有两个导航,第二个是嵌套的,这可能是错误0x800700AA 的原因。诀窍是先从NewWindow 事件返回,然后进行导航:
private void Form1_Load(object sender, EventArgs e)
{
// this code depends on SHDocVw.dll COM interop assembly,
// generate SHDocVw.dll: "tlbimp.exe ieframe.dll",
// and add as a reference to the project
var activex = (SHDocVw.WebBrowser_V1)this.webBrowser.ActiveXInstance;
activex.NewWindow += delegate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
Processed = true;
object flags = Flags;
object targetFrame = Type.Missing;
object postData = PostData != null ? PostData : Type.Missing;
object headers = !String.IsNullOrEmpty(Headers) ? Headers.ToString() : Type.Missing;
SynchronizationContext.Current.Post(delegate
{
activex.Navigate(URL, ref flags, ref targetFrame, ref postData, ref headers);
}, null);
};
this.webBrowser.Navigate("http://localhost:81/new-window-test.html");
}
用 IE10 测试。
[更新]
试试这个(已验证):
Public Class Form1
Dim ActiveX As SHDocVw.WebBrowser_V1
Private Sub NavigateOnNewWindow(NewWindowUrl As Object)
Me.ActiveX.Navigate(NewWindowUrl.ToString())
End Sub
Private Sub NewWindow(URL As String,
Flags As Integer,
TargetFrameName As String,
ByRef PostData As Object,
Headers As String,
ByRef Processed As Boolean)
Processed = True
System.Threading.SynchronizationContext.Current.Post(AddressOf NavigateOnNewWindow, URL)
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Init DocumentText, otherwise Me.WebBrowser1.ActiveXInstance is null, this is different from C#
Me.WebBrowser1.DocumentText = String.Empty
Me.ActiveX = Me.WebBrowser1.ActiveXInstance
AddHandler Me.ActiveX.NewWindow, AddressOf NewWindow
Me.WebBrowser1.Navigate("http://localhost:81/new-window-test.html")
End Sub
End Class