首页 文章

Web浏览器控件处理javascript:弹出窗口

提问于
浏览
2

我的软件通过此功能处理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)

1 回答

  • 3

    根据 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测试 .

    [UPDATE]

    试试这个(经过验证):

    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
    

相关问题