【问题标题】:Webbrowser control handling javascript: popupWebbrowser 控件处理 javascript: popup
【发布时间】:2013-09-15 21:08:47
【问题描述】:

我的软件通过这个函数处理导航到 target=_new

Private Sub Web1_NewWindow(...) Handles Web1.NewWindow
    Web1.Navigate(Web1.StatusText)
    e.Cancel = True
End Sub

这允许我在同一个 webbrowser 控件中打开任何新窗口。但是,当导航到创建新弹出窗口的“javascript:”链接时,我收到以下消息,因为它正在尝试导航到该页面:

The requested resource is in use. (Exception from HRESULT: 0x800700AA)

如何让它在 webbrowser 控件中打开一个 javascript 弹出窗口?

链接如下:

javascript:Dpy.ITQPopup('100',255,'2932 NTYwNDUwMTA0MDYzMDM);3094 V0FZ','-357933312',0,0)

【问题讨论】:

  • 这是不可能的。自动化接口只能处理弹出窗口,不能处理 Javascript alert() chatter。最好找到一种方法来避免出现这种可怕的错误消息,我想说,把它放在一个友好的窗口不会让用户更快乐。
  • 嘿汉斯,我不是在谈论 javascript:alert(),我说的是通过单击链接“javascript:function(xyz)”作为脚本创建的新窗口.
  • 同样的问题。在我最喜欢的浏览器的“在新选项卡中打开链接”上下文菜单条目中也很可爱。不是。
  • 如果我实现了标签怎么办?

标签: .net vb.net webbrowser-control


【解决方案1】:

根据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

【讨论】:

  • 我添加了原帖的链接,也许你能帮我确定它是否是测试5。
  • ITQPopup(...) 是否返回任何内容?里面有没有调用window.open
  • 我刚刚追踪了函数,是的,window.open 被调用了!
  • 那么是的,在我的测试中就是这种情况#5,因为window.open。我用一些 VB.NET 代码更新了答案,试一试。
  • 你,我的朋友,是一个老板,非常感谢你 - 以及任何其他正在执行此操作的人,MAKE SURE!!!! WebBrowser 控件没有NewWindow 事件,因为它优先于ActiveX.NewWindow 事件。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2014-11-11
  • 2010-10-13
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多