最近在项目中经常用到模态窗口(showModalDialog),客户需要在一个模态窗口中有"生成Excel报表"并"导出"的功能。
功能的设计思路是这样的:
1、首先在主窗口收集一些需要的数据
2、showModalDialog,将收集的数据传递过去,在模态页面使用window.dialogArguments接收这些参数
3、在模态页面收集客户的个性化定制信息
4、客户点击模态页面上的提交按钮,页面将请求通过Ajax异步方式提交到后台,生成文件,返回文件在服务器上的绝对路径
5、模态页面将内置的一个隐藏的iframe的src先置空,然后将文件路径作为参数传给下载页面,通过流方式下载文件
把基本流程完成之后,测试一下。点击提交按钮,前台没有任何反应。根据后台日志,又确定文件已经生成、成功读取并往流中写出了。
这是什么原因呢?
Google了很久,基本上只有以下两种答案:
1、模态窗口的定向问题
引用页:http://hi.baidu.com/037123/blog/item/e379854da9d561f3d62afc0c.html
showDialog里好像不能用href,只能用onclick
最近在项目中经常用到模态窗口(showModalDialog),客户需要在一个模态窗口中有"生成Excel报表"并"导出"的功能。接到任务后,直接就开始按常规操作实现。
在按钮的Click事件中,根据模板生成Excel报表,填充数据,保存到临时文件夹,然后用Response.WriteFile函数输出文件,一切看上去都很顺利。代码如下:
//根据数据集创建Excel报表并返回Excel报表路径
string fileName = CreateExcel(ds);
Response.Clear();
Response.Charset = "utf-8";
Response.Buffer = true;
this.EnableViewState = false;
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
//设置输出文件类型为excel文件。
Response.ContentType = "application/ms-excel";
Response.WriteFile(fileName);
Response.Flush();
Response.Close();
Response.End();
但是当完成了代码,开始测试的时候,却发现点击"导出"按钮没有反应。开始的时候以为是创建Excel报表的代码有问题,但经过调试后,证实创建Excel代码没有问题,也成功的在临时文件夹下生成了Excel报表,但是却没有"导出"报表(没弹出下载文件对话框)。再看输出文件的代码,应该也没有问题,之前一直这样输出都没有问题的。
在百思不得其解的时候,发现了一个关键点。就是之前输出文件成功的面页都是一般的网页窗口,而这次的操作却是在模态窗口中。问题会不会出在这里呢?赶紧试验了一下。把模态窗口改成了一般的网页窗口,果然可以输出文件没问题,也成功下载了报表。
虽然问题有点怪异,但找到了切入点和问题的关键所在,解决应该就不难了。google一下,发现模态窗口定义了<base target="_self">,这应该是问题所在。然后在页面中重新定义了这个标签,改成了<base target="_blank">,问题成功解决,文件可以正常下载了。但这时候又来了新的问题,下载是可以了,但是却会弹出一个新页面,在模态窗口中下载再弹出页面肯定影响了用户体验。有没有方法在模态窗口中直接下载而不弹出新的页面呢?既然target=_self的时候有问题,target=_blank的时候又会弹出新的页面,这让我想到了在框架中打开新窗口的做法。在页面中加一个看不到的框架,然后把target设为框架名应该可以解决。随后在页面中再加了一个大小为0的iframe
<iframe id="download" name="download" height="0px" width="0px"></iframe><!--用iframe模拟文件下载-->
然后重新修改<base>标签target为框架名:
<base target="download">
重新生成,浏览,测试。问题成功解决。
2、JS脚本问题
引用页:http://hi.baidu.com/%C0%D6%D0%CD%D5%DF/blog/item/f5422a11311f60d3a6ef3fc1.html
var obj=document.getElementById(‘download’);
obj.contentWindow.location.href=http://sunyoush.iteye.com/blog/url;
这两种方式我都试过了,都不行。最后功夫不负有心人,在Windows的升级信息中找到了答案:
主要是浏览器对于异步访问的问题,将原来的异步调用改成同步调用的,就可以了
引用页:http://bbs.blueidea.com/viewthread.php?tid=1708871&page=
如果异步请求信息,您的 Web 站点是否会打开一个新窗口?
如果站点在异步请求信息后打开特定的窗口,则 Internet Explorer 可能会阻止这些窗口,即使用户单击了链接以打开该窗口。如果在请求异步信息之前,直接从用户启动的操作(鼠标单击)打开窗口,那么这些窗口不会被阻止。用户启动的操作不能跨导航保持。
分享到:
相关推荐
在标题提到的问题中,当使用`showModalDialog`并结合`iframe`来实现弹窗功能时,如果页面被刷新,可能会出现一个新的弹出窗口。这是因为`showModalDialog`通常会保留其状态,而页面刷新会重置这些状态,导致再次调用...
在IT行业中,尤其是在Web开发领域,跨域问题是一个常见的挑战,特别是在使用特定的浏览器API时,比如`showModalDialog`。这个API允许开发者在当前页面上弹出一个模态对话框,显示另一个网页内容。然而,由于同源策略...
当使用`window.showModalDialog()`函数打开模态对话框时,可以通过以下方式刷新父页面: - **语法**: `window.parent.dialogArguments.document.execCommand('Refresh');` - **示例**: ```javascript // 父页面...
在`index.htm`页面中使用`IFRAME`元素来嵌入`newslist.asp`页面,从而实现在同一个页面内切换不同的内容。 ```html <IFRAME marginWidth="0" marginHeight="0" src="newslist.asp?id=50" frameBorder="0" width=...
1. 使用`window.showModalDialog`打开一个包含`iframe`的页面,`iframe`加载目标站点。 2. 目标站点通过修改`iframe`的`src`属性或提交表单等方式与主页面通信。 3. 主页面通过URL参数接收目标站点返回的值,并关闭`...
总结来说,`window.showModalDialog`虽然提供了一种创建模态对话框的方式,但鉴于其局限性和现代浏览器的不兼容性,开发者应该考虑使用更现代和兼容的解决方案来实现相同的功能。了解并掌握这些替代方法,将有助于...
在JavaScript编程中,`showModalDialog`是一个古老但仍然有用的函数,主要用于打开一个模态对话框,以便与用户进行交互。这个功能在Web应用程序中,尤其是那些需要用户输入额外信息或者确认操作的情况下非常实用。本...
`showModalDialog`允许传入参数并返回结果,但同样因为兼容性问题,其在现代Web开发中的使用也逐渐减少。 最后,`iframe`(内联框架)是一种常用的父子页面通信方式。通过在父页面中嵌入一个`iframe`,我们可以加载...
由于模态对话框在不同浏览器之间的兼容性问题,以及在某些JavaScript框架(如jQuery Mobile等)中已不再推荐使用`showModalDialog`,我们可以考虑使用`iframe`来作为模态窗口的替代方案。通过动态地将`iframe`内容...
我发现可以尝试在初始页面中嵌入一个IFRAME,然后用IFRAME来显示一个页面,并将IFRAME设定为按绝对位置摆放,Z-Index设置为最高的9999,这样就可以将这个页面覆盖在初始界面上,当需要显示模态窗
在ASP.NET应用中,可以使用`Response.Redirect`方法实现页面重定向: ```csharp Response.Redirect("目标页面地址"); ``` 这通常在处理完请求后将用户导向新的页面,如登录成功后跳转至主页。 #### 弹出模态...
然而,当在使用`showModalDialog`弹出的页面中包含一个表单并尝试进行提交时,有时会遇到一个常见的问题:表单提交操作反而会打开一个新的浏览器窗口,这显然不是我们期望的行为。 为了解决这个问题,我们可以采用...
1. **兼容性问题**:`window.showModalDialog` 和 `execCommand` 在现代浏览器中可能不被支持或已被废弃。 2. **安全性考虑**:在进行跨窗口操作时,需要注意安全性和浏览器限制,确保不会因为不当操作而导致安全...
有时候我们需要刷新页面中的某个 `<iframe>` 而不是整个页面。可以通过获取 `<iframe>` 的 `window` 对象来调用 `reload` 方法。 **示例代码:** ```javascript var frame = document.getElementById('frameId'); ...
由于数据导出可能涉及到大量的数据传输,不适合在当前页面完成,所以使用`iframe`或者新开窗口的方式来下载文件是一个更合适的解决方案。 1. 使用`iframe`: 由于`iframe`可以在后台加载内容,可以用来处理文件...
总结,`showModalDialog`和`showModelessDialog`提供了在Web应用中创建弹出窗口的能力,但因为其限制和现代Web开发趋势,它们逐渐被其他技术(如模态框、iframe或Ajax)取代。理解并熟练掌握这些方法的使用,可以...
如果需要在这些浏览器中实现类似功能,可能需要使用其他技术如iframe或者第三方JavaScript库来模拟模态窗口效果。 对于现代Web应用开发来说,了解并掌握父子窗口间的数据传递技术,对提升用户体验以及满足特定的...
8. **IFrame通信**:如果子页面是嵌入在父页面的IFrame中,可以通过`window.parent`或`window.frames`访问父页面,利用`contentWindow`属性进行通信。这种方法适用于同源策略下的父子页面交互。 每种方法都有其适用...
当使用 `showModalDialog` 打开一个新页面时,新页面中的链接点击或表单提交等操作**默认将在一个新的窗口中执行**,即使指定了 `target="_self"` 也不会生效。 **示例:** ```html 打开 ``` 为了使新打开的页面...