【发布时间】: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 上遇到了同样的情况。你找到了什么解决方法。我试图在对话框中打开对话框并看到空白页。任何建议或帮助将不胜感激。 (创建了类似的帖子但不知道存在stackoverflow.com/questions/28072328/…)
-
抱歉@Grasshopper,没有找到解决方案。
标签: asp.net html internet-explorer-9