window.open下载文件ie8请求的站点不可用的解决办法
在业务里用到了PHP header导出doc文档,GET传值到页面,读出相应数据输出doc文件下载。用户提出需要批量,于是设计成js循环出对应数量的window.open(),向页面传入不同的值,批量输出相应的文件。简单的说,就是我需要循环出多个window.open()。
js代码为:
var outCode = JSON.parse(<?php echo $jsonCode; ?>); for(var i=0; i<outCode.length; i++){ $statu = $("开始导出"+outCode[i]+"号申请表..").appendTo("body"); window.open("../docout.php?id="+outCode[i]); $statu.append("已弹出下载,请注意"); }
(PHP页面省略)
实际过程中,在IE8上却出现了若干问题。花费不少时间。下面列举每个遇到的问题(均为IE8下,其他环境均不存在问题。吐)。
1、首先是单个的需要打开的是利用PHP header输出doc的页面,发现在使用<a href="url.php?id=code">链接形式传递时,新窗口正常打开并输出文件提示下载,没有问题。而改用window.open()打开却只有空白页面。
上网查找了一下解决方法:把IE个性化设置重置为默认(工具-Internet选项-高级-重置),删除所有个性化设置,完成后,重试IE该问题不再出现,窗口能正常打开。但是还有另外的问题:弹出窗后下载报错,下载框弹出提示"无法打开该站点,请求的站点不可用"...
查找解决方法后发现是IE8的缓存BUG,需要加补丁。或在PHP输出中更改缓存模式。
加入header语句后问题解决。
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
java的写法:
response.setHeader("Cache-Control", "must-revalidate");
response.setHeader("Cache-Control", "post-check=0");
response.setHeader("Cache-Control", "pre-check=0");
2、多个window.open弹出的问题单个的解决了,在批量循环弹出多个窗口打开页面时,IE8出现了这样的现象:循环开始,从打开第一个窗以后(默认在选项卡里打开),每次打开均把前一次的窗关闭又打开,一直重复,都只能出一个窗,也无法输出内容。怀疑是多个window.open只能出在一个窗上。
查阅资料,window.open的参数包括(url,name,feature,replace):
url:窗口链接,声明要在新窗口中显示的文档的 URLname:新窗口的名称。如果指定了一个已经存在的窗口,就不再创建一个新窗口,而只是返回对指定窗口的引用。feature:样式定制,例如高宽、滚动条等replace:url条目在历史记录里的生成方式,true替换浏览历史中的当前条目,false在浏览历史中创建新的条目
于是把每个窗口name赋予不同的名称,并将replace赋值为false,问题依然未能解决。
上了stack overflow,找到了一些相关问题,有所发现:首先提到name属性的标准解释,除了赋为自定义String,还有_blank _parent _self _top 。详细如下:
于是将name改为"_blank"。
window.open("../docout.php?id="+outCode[i],"_blank","",false);
问题解决,每个window.open都在新的窗口打开了。但是烦人的问题没有结束。。
3、这回真是折磨透了。。上传到服务器后仍然出现之前的问题。怎么改属性都也不起作用。折磨了一天,找到了问题所在:
(尝试过程省略一万字)
在本地时,IE8中本地站点安全性配置为中低,而internet默认级别为中高。于是尝试将站点加入可信站点内,并配置同样的中低安全性。问题解决了。。。估计是安全性配置中的防弹窗的问题。
配置方法:internet选项——安全——可信站点——添加,并将安全性设为中低
在自定义级别中应该也能找到相应的选项,应该是禁用防弹窗,没试了。
到此,这个问题发现已经无法用代码去绕开了。只能记住下次不再用这方法实现任何功能。存在差异性。(其实都是IE...)
4、另外关于name在IE8的问题——拒绝空格和中划线
解答中其次提到,在name中,IE8不支持Space(空格)、dash(中划线-),如果在name中使用形如"my-window"或"my window",将会报错 Invalid argument。
吐槽:IE为什么不去见鬼。
参看stack overflow上相关问题:
ie8 var w= window.open() - “Message: Invalid argument.
”Window.open not working in IE8?
本文也发表在我的独立博客blog.mc-zone.me上,点击 访问此文
相关文章
- git设置Eclipse中忽略的文件
- 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案
- Django普通文件上传
- Struts文件上传与下载详解_文件的下载
- flask使用pymysql连接MySQL,生成xls文件并下载到本地
- 执行RF测试只生成output.xml文件,不生成log和report文件
- 想将数百个小文件分成多线程,每线程下载多个文件,不知写对没?
- windows环境通过cmd命令到ftp上下载文件到linux服务器
- Windows创建类似.project只有后缀名的文件的方法
- WCF HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。)
- WCF HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。)
- SAP UI5 本地开发时 ui5.yaml 文件对构建 Release 版本应用目录的影响分析试读版
- Vue项目使用file-saver将html转word文件、把html内容下载保存导出到本地生成doc文件包括图片:前端下载利器FileSaver
- 【SpringMVC笔记11】SpringMVC实现文件上传和下载
- 已解决urllib.request.urlretrieve下载文件报错403
- SDC文件模版
- c# - WebClient下载https协议文件报错 System.Net.WebException: 请求被中止: 未能创建 SSL/TLS 安全通道 - 解决
- golang - win10 下载、安装、运行首个go文件
- 如何在Vue组件中调用封装好的外部js文件方法
- 采用oracle官方文件(11G)——初步Concept
- L25.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- rev和tr命令
- 41 openEuler搭建FTP服务器-传输文件
- Android多线程文件下载器
- python如何实现文件下载进度条呢?
- 前端必备技能知识:JS导出Blob流文件为Excel表格、Vue.js使用Blob的方式实现excel表格的下载(流文件下载)
- Ubuntu16.04和Centos7.5安装Rsync并测试同步文件
- 网站大文件下载 ASP.NET