IE9 - 下载文件的信息栏出现在父窗口上;不是最新的

Posted

技术标签:

【中文标题】IE9 - 下载文件的信息栏出现在父窗口上;不是最新的【英文标题】:IE9 - Information Bar to download file appears on Parent Window; not current 【发布时间】:2011-10-20 03:43:55 【问题描述】:

原帖

我的 Web 应用程序的一个功能是它可以打印报告。这些报告需要一个允许用户细化报告参数的弹出窗口。这不能改变。

在 IE9 之前,当用户在弹出窗口中单击我的“预览”按钮时,一旦报告呈现,他们会得到一个这样的对话框:

这对我的客户来说既简单又直观。

但是,升级到 IE9 后,消息栏(信息栏/下载栏)无论其名称如何,都会显示在弹出窗口的父窗口中:

为了下载或打开报告,用户现在需要关闭弹出窗口,然后在下载栏上选择适当的操作。

这是一个非常令人沮丧的解决方法。

我已经在网上寻找了在弹出窗口上显示下载栏(首选)、恢复到旧对话框或将其全部删除的方法。

尚无解决方案。如果有人有任何 IE 解决方案/解决方法,请发布。


更新

更新此更新 以下步骤确实暴露了一个错误,但与我的问题无关,因为它发生在所有版本的 IE 上。我认为它已经接近了,但我需要进行更多测试才能找到确切的问题。

好的,所以我更深入地查看了代码并将其缩减到足以产生问题的程度。它实际上与我最初的问题 (grrr) 不同,但可能是相关的。

你需要什么:

Windows 7 IIS 7.0

创建以下四个文件:

PageOne.htm,内容如下:

<html>
    <head>
        <script type="text/javascript">
            window.dialog = new Object();

            var myFunc = function()  window.alert('hello');

            function test()
                window.dialog.open('DummyDialog.htm',myFunc,false);
                ;


            window.dialog.open = function(sUrl, fpReturn, bNoResize) 

                window.dialog.__returnFunction = fpReturn;
                window.dialog.returnValue = null;

                window.dialog.arguments = new Array();
                for (var x = 2; x < arguments.length; x++) 
                    window.dialog.arguments[x - 2] = arguments[x];
                

                window.dialog.arguments[window.dialog.arguments.length] = window;

                sUrl += new Date().getTime().toString(); 


                var sFeatures;
                var nWidth = 500;    var nHeight = 500;    var nLeft = 100;    var nTop =  100;

                if (window.dialog.position) 
                    nLeft = window.dialog.position.left;
                    nTop = window.dialog.position.top;
                    window.dialog.position = null;
                 

                if (sUrl.indexOf("?") != -1) 
                    var pairs = sUrl.split("?")[1].split("&");
                    var aValue, pos;
                    for (var i = 0; i < pairs.length; i++) 
                        if (pairs[i].toUpperCase().indexOf("SIZE") == 0) 
                            aValue = pairs[i].split("=")[1].split(",");
                            if (aValue.length == 2) 
                                nWidth = parseInt(aValue[0]);
                                nHeight = parseInt(aValue[1]);
                                break;
                             else if (aValue.length == 4) 
                                nWidth = parseInt(aValue[0]);
                                nHeight = parseInt(aValue[1]);
                                nLeft = parseInt(aValue[2]);
                                nTop = parseInt(aValue[3]);
                                break;
                            
                        
                    
                

                nTop -= 1;

                sFeatures = "";

                window.dialog.arguments._gotoURL = sUrl;
                window.dialog.arguments._dialogTitle = 'my title';
                window.dialog.returnValue = window.showModalDialog("DummyDialog.htm", window.dialog.arguments, sFeatures);
            ;
        </script>
    </head>
    <body>
        <a href="#" onclick="test();">Test Window</a>
    </body>
</html>

DummyDialog.htm,内容如下:

<html>
    <head>
        <script type="text/javascript">
            window.dialog = new Object();

            var myFunc = function()  window.alert('hello');

            function test()
                window.dialog.open('DummyDialog.htm',myFunc,false);
                ;


            window.dialog.open = function(sUrl, fpReturn, bNoResize) 

                window.dialog.__returnFunction = fpReturn;
                window.dialog.returnValue = null;

                window.dialog.arguments = new Array();
                for (var x = 2; x < arguments.length; x++) 
                    window.dialog.arguments[x - 2] = arguments[x];
                

                if (true) //if (is.ie) 
                    window.dialog.arguments[window.dialog.arguments.length] = window;
                

                sUrl += new Date().getTime().toString();
                // in pixels
                var sFeatures;
                var nWidth = 500;
                var nHeight = 500;
                var nLeft = 100;
                var nTop =  100;

                if (window.dialog.position) 
                    nLeft = window.dialog.position.left;
                    nTop = window.dialog.position.top;
                    window.dialog.position = null;
                 

                if (sUrl.indexOf("?") != -1) 
                    var pairs = sUrl.split("?")[1].split("&");
                    var aValue, pos;
                    for (var i = 0; i < pairs.length; i++) 
                        if (pairs[i].toUpperCase().indexOf("SIZE") == 0) 
                            aValue = pairs[i].split("=")[1].split(",");
                            if (aValue.length == 2) 
                                nWidth = parseInt(aValue[0]);
                                nHeight = parseInt(aValue[1]);
                                break;
                             else if (aValue.length == 4) 
                                nWidth = parseInt(aValue[0]);
                                nHeight = parseInt(aValue[1]);
                                nLeft = parseInt(aValue[2]);
                                nTop = parseInt(aValue[3]);
                                break;
                            
                        
                    
                

                nTop -= 1;      
                sFeatures = "";
                window.dialog.arguments._gotoURL = 'download.aspx?file=MyTestFile.txt';
                window.dialog.arguments._dialogTitle = 'my title';//window.getTitle();
                window.dialog.returnValue = window.showModalDialog('download.aspx?file=MyTestFile.txt', window.dialog.arguments, sFeatures);

            ;
        </script>
    </head>
    <body>
        <a href="#" onclick="test();">Test Window</a>
    </body>
</html>

download.aspx,内容如下:

<%@ Page language="vb" runat="server" explicit="true" strict="true" %>
<script language="vb" runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
    Dim strRequest As String = Request.QueryString("file") '-- if something was passed to the file querystring
    If strRequest <> "" Then 'get absolute path of the file
        Dim path As String = Server.MapPath(strRequest) 'get file object as FileInfo
        Dim file As System.IO.FileInfo = New System.IO.FileInfo(path) '-- if the file exists on the server
        If file.Exists Then 'set appropriate headers
            Response.Clear()
            Response.AddHeader("Content-Disposition", "attachment; filename=" & file.Name)
            Response.AddHeader("Content-Length", file.Length.ToString())
            Response.ContentType = "application/octet-stream"
            Response.WriteFile(file.FullName)
            Response.End 'if file does not exist
        Else
            Response.Write("This file does not exist.")
        End If 'nothing in the URL as HTTP GET
    Else
        Response.Write("Please provide a file to download.")
    End If
End Sub
</script>

MyTestFile.txt,内容如下:

<Root>
  <Tag>Hello World</Tag>
</Root>

现在执行以下操作:

    将所有四个文件拖到您的 IIS 目录并导航到 PageOne.htm。 单击测试窗口(应该会弹出 DummyDialog.htm) 单击该弹出窗口中的超链接(这将带您到http://localhost/download.aspx?file=MyTestFile.txt)

应该会提示您下载。相反,我得到的是一个什么都不做的空白窗口。见下文:

如果您使用相同的 URL http://localhost/download.aspx?file=MyTestFile.txt 并将其直接粘贴到新的 IE 窗口中,或者在 Firefox 中运行上述相同步骤,系统会提示您下载。

那么为什么 IE 中的弹出窗口只会带来一个空白窗口呢?

【问题讨论】:

有关如何弹出窗口以及如何启动下载的更多信息将有助于找到解决方法。 @cdeszaq 是的。我希望其他开发人员实际上也会遇到同样的问题,因为不是我们的代码而是 IE9 导致了这种行为变化。我即将用一些代码更新文章。 我在 IE 11 上遇到了同样的情况。你找到了什么解决方法。我试图在对话框中打开对话框并看到空白页。任何建议或帮助将不胜感激。 (创建了类似的帖子但不知道存在***.com/questions/28072328/…) 抱歉@Grasshopper,没有找到解决方案。 【参考方案1】:

一种解决方案是不使用弹出窗口,而是使用像 jQuery UI 对话框这样的弹出窗口。这将使您对事物有更多的控制权,并将它们保持在同一个窗口中,这样您的用户就不会错过 ie9 下载栏。

另一种选择可能是在新页面而不是弹出窗口上确定参数。

【讨论】:

我并不是说它们不是一个好的建议,但您所说的需要对拥有数百名用户的企业级应用程序进行大规模更改。这将对从开发到质量保证的所有部门进行严格审查。我需要避免这种情况。 让我澄清一下:我需要避免进行重大更改,因为在我看来,这似乎应该是一个简单的更改;如果这是有道理的。我永远不会避免在需要时对应用程序进行压力测试:) @ray023 - 既然你说它是一个弹出窗口,而且 IE9 将其视为子窗口,我猜它是用 JavaScript 创建的。将 JavaScript 弹出窗口转换为 jQuery UI 弹出窗口严格来说是 UI 更改,并且将简化代码库,因为用于制作对话框窗口的 jQuery UI 代码比可比较的原生 JavaScript 代码更简单且更小。一个缺点是,如果您还没有使用 jQuery UI,那么您有一个额外的 JavaScript 库。但无论如何,这几乎不会是一个巨大的变化。这就是 n 层架构的全部意义所在。 你还没有看到这段代码 :) 它是外包的,是为了赶上最后期限而编写的。很难跟随并且变化无常。将 VS 解决方案想象成一个 Jenga 拼图,而我正在谈论的部分位于底部。在一个完美的世界里,这很简单。但是在这里,您不想拉出一块并用另一块替换它。我正在深入了解是否可以找到一些可以发布的代码。

以上是关于IE9 - 下载文件的信息栏出现在父窗口上;不是最新的的主要内容,如果未能解决你的问题,请参考以下文章

IE9 和 Z-index:元素在悬停时消失在父级后面

网页如何查看源代码

windows 窗口由那几部分组成 有啥用

如何在WPF中单击菜单项时在父窗口下打开子窗口?

窗口标题栏不见了?

判断一个窗口是不是有菜单栏