作者: sealyu 日期:2008-11-8
今天在开发的时候,碰到客户提到的一个问题,
每次在下载文件的时候,IE都会阻止打开的保存文件的对话框。
看了一下代码,发现项目使用了一个stream servlet来处理文件下载,在使用ajax返回页面后,使用window.open(link);打开保存对话框。
问题应该就处在这里了,Google了一下,发现这是由于IE的安全机制。
在微软的网站上有这么一段话:
Pop-Up Blocking
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 Internet and Restricted sites zones
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 Trusted sites and Local intranet zones
(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阻止掉,showModalDialog弹出的窗口有时并不能满足我们需要,我们需要弹出新的浏览器窗口。
为什么我们编写的弹出窗口会被IE阻止呢,原来IE会自动判断弹出窗口的状态,它会阻止自动弹出的窗口,而通过我们用鼠标点击弹出的窗口,它是不会阻止的。这里就有一个问题,有人说:我的程序是写在服务器按钮里的,也是通过鼠标点击弹出的呀!其实只有在加载页面后,我们点击到弹出这段时间页面没有被重新加载的情况下,弹出的窗口才不会被阻止!这也就是说,写在服务器控件的回传事件里的window.open都会被阻止。
继续Google解决办法,在分析了几种解决方法并进行对比之后,发现最简单有效的方法如下:
在window.open()函数中增加一个参数,将target设置为‘self’,
即改为使用: window.open(link,'_self');
问题解决。