作者: sealyu 日期:2008-11-8
今天在开发的时候,碰到客户提到的一个问题,
每次在下载文件的时候,ie都会阻止打开的保存文件的对话框。
看了一下代码,发现项目使用了一个stream servlet来处理文件下载,在使用ajax返回页面后,使用window.open(link);打开保存对话框。
问题应该就处在这里了,google了一下,发现这是由于ie的安全机制。
在微软的网站上有这么一段话:
the pop-up blocking feature blocks pop-up (and pop-under) windows initiated automatically by a web site. internet explorer blocks pop-up windows in the
by default. however, the pop-up blocker enables pop-up windows initiated by a user action. users can configure internet explorer 6 for windows xp with sp2 to be more or less restrictive. users can also turn off the pop-up blocker altogether. generally, the pop-up blocker enables a window to open under the following circumstances:
• |
when initiated by user action, such as clicking a button or hyperlink
|
• |
when opened in the
(considered safe)
|
• |
when opened by other applications running on the local computer
|
the affected script methods are:
window.open
window.showhelp
window.showmodaldialog
window.showmodelessdialog
window.external
window.navigateandfind
在web编程过程中,经常会遇到一些页面需要弹出窗口,但是在服务器端用window.open弹出的窗口会被ie阻止掉,弹出的窗口有时并不能满足我们需要,我们需要弹出新的浏览器窗口。
为什么我们编写的弹出窗口会被ie阻止呢,原来ie会自动判断弹出窗口的状态,它会阻止自动弹出的窗口,而通过我们用鼠标点击弹出的窗口,它是不会阻止的。这里就有一个问题,有人说:我的程序是写在服务器按钮里的,也是通过鼠标点击弹出的呀!其实只有在加载页面后,我们点击到弹出这段时间页面没有被重新加载的情况下,弹出的窗口才不会被阻止!这也就是说,写在服务器控件的回传事件里的window.open都会被阻止。
继续google解决办法,在分析了几种解决方法并进行对比之后,发现最简单有效的方法如下:
在window.open()函数中增加一个参数,将target设置为‘self’,
即改为使用: window.open(link,'_self');
问题解决。