`
TANHAIWEI
  • 浏览: 6673 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

showModalDialog模态页面中使用Iframe下载文件问题总结

阅读更多

最近在项目中经常用到模态窗口(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 可能会阻止这些窗口,即使用户单击了链接以打开该窗口。如果在请求异步信息之前,直接从用户启动的操作(鼠标单击)打开窗口,那么这些窗口不会被阻止。用户启动的操作不能跨导航保持。

 

0
2
分享到:
评论

相关推荐

    在使用showModalDialog中为解决刷新时弹出新窗口时用到iframe所带来的一个问题

    在标题提到的问题中,当使用`showModalDialog`并结合`iframe`来实现弹窗功能时,如果页面被刷新,可能会出现一个新的弹出窗口。这是因为`showModalDialog`通常会保留其状态,而页面刷新会重置这些状态,导致再次调用...

    解决showModalDialog 跨域 iframe

    在IT行业中,尤其是在Web开发领域,跨域问题是一个常见的挑战,特别是在使用特定的浏览器API时,比如`showModalDialog`。这个API允许开发者在当前页面上弹出一个模态对话框,显示另一个网页内容。然而,由于同源策略...

    javascript 页面刷新和模态对话框 学习总结 推荐哦

    当使用`window.showModalDialog()`函数打开模态对话框时,可以通过以下方式刷新父页面: - **语法**: `window.parent.dialogArguments.document.execCommand('Refresh');` - **示例**: ```javascript // 父页面...

    showModalDialog 弹出窗口关闭不刷新父窗口最终实现了

    在`index.htm`页面中使用`IFRAME`元素来嵌入`newslist.asp`页面,从而实现在同一个页面内切换不同的内容。 ```html &lt;IFRAME marginWidth="0" marginHeight="0" src="newslist.asp?id=50" frameBorder="0" width=...

    解决window.showModalDialog跨域返回值

    1. 使用`window.showModalDialog`打开一个包含`iframe`的页面,`iframe`加载目标站点。 2. 目标站点通过修改`iframe`的`src`属性或提交表单等方式与主页面通信。 3. 主页面通过URL参数接收目标站点返回的值,并关闭`...

    window.showModalDialog方法的使用

    总结来说,`window.showModalDialog`虽然提供了一种创建模态对话框的方式,但鉴于其局限性和现代浏览器的不兼容性,开发者应该考虑使用更现代和兼容的解决方案来实现相同的功能。了解并掌握这些替代方法,将有助于...

    如何使用showModalDialog

    在JavaScript编程中,`showModalDialog`是一个古老但仍然有用的函数,主要用于打开一个模态对话框,以便与用户进行交互。这个功能在Web应用程序中,尤其是那些需要用户输入额外信息或者确认操作的情况下非常实用。本...

    父子页面相互调用总结

    `showModalDialog`允许传入参数并返回结果,但同样因为兼容性问题,其在现代Web开发中的使用也逐渐减少。 最后,`iframe`(内联框架)是一种常用的父子页面通信方式。通过在父页面中嵌入一个`iframe`,我们可以加载...

    js关闭模态窗口刷新父页面或跳转页面

    由于模态对话框在不同浏览器之间的兼容性问题,以及在某些JavaScript框架(如jQuery Mobile等)中已不再推荐使用`showModalDialog`,我们可以考虑使用`iframe`来作为模态窗口的替代方案。通过动态地将`iframe`内容...

    ASP.NET中使用IFRAME建立类Modal窗口

     我发现可以尝试在初始页面中嵌入一个IFRAME,然后用IFRAME来显示一个页面,并将IFRAME设定为按绝对位置摆放,Z-Index设置为最高的9999,这样就可以将这个页面覆盖在初始界面上,当需要显示模态窗

    页面刷新实现方法总结

    在ASP.NET应用中,可以使用`Response.Redirect`方法实现页面重定向: ```csharp Response.Redirect("目标页面地址"); ``` 这通常在处理完请求后将用户导向新的页面,如登录成功后跳转至主页。 #### 弹出模态...

    用showModalDialog弹出页面后,提交表单总是弹出一个新窗口

    然而,当在使用`showModalDialog`弹出的页面中包含一个表单并尝试进行提交时,有时会遇到一个常见的问题:表单提交操作反而会打开一个新的浏览器窗口,这显然不是我们期望的行为。 为了解决这个问题,我们可以采用...

    javascript刷新父页面

    1. **兼容性问题**:`window.showModalDialog` 和 `execCommand` 在现代浏览器中可能不被支持或已被废弃。 2. **安全性考虑**:在进行跨窗口操作时,需要注意安全性和浏览器限制,确保不会因为不当操作而导致安全...

    JavaScript刷新页面大全

    有时候我们需要刷新页面中的某个 `&lt;iframe&gt;` 而不是整个页面。可以通过获取 `&lt;iframe&gt;` 的 `window` 对象来调用 `reload` 方法。 **示例代码:** ```javascript var frame = document.getElementById('frameId'); ...

    easyui导出excel无法弹出下载框的快速解决方法

    由于数据导出可能涉及到大量的数据传输,不适合在当前页面完成,所以使用`iframe`或者新开窗口的方式来下载文件是一个更合适的解决方案。 1. 使用`iframe`: 由于`iframe`可以在后台加载内容,可以用来处理文件...

    避免 showModalDialog 弹出新窗体的原因分析

    总结,`showModalDialog`和`showModelessDialog`提供了在Web应用中创建弹出窗口的能力,但因为其限制和现代Web开发趋势,它们逐渐被其他技术(如模态框、iframe或Ajax)取代。理解并熟练掌握这些方法的使用,可以...

    js操作模态窗口及父子窗口间相互传值示例

    如果需要在这些浏览器中实现类似功能,可能需要使用其他技术如iframe或者第三方JavaScript库来模拟模态窗口效果。 对于现代Web应用开发来说,了解并掌握父子窗口间的数据传递技术,对提升用户体验以及满足特定的...

    javascript实现从子页与父页传递参数

    8. **IFrame通信**:如果子页面是嵌入在父页面的IFrame中,可以通过`window.parent`或`window.frames`访问父页面,利用`contentWindow`属性进行通信。这种方法适用于同源策略下的父子页面交互。 每种方法都有其适用...

    lotus_web开发注意问题

    当使用 `showModalDialog` 打开一个新页面时,新页面中的链接点击或表单提交等操作**默认将在一个新的窗口中执行**,即使指定了 `target="_self"` 也不会生效。 **示例:** ```html 打开 ``` 为了使新打开的页面...

Global site tag (gtag.js) - Google Analytics