IE浏览器a标签无法下载问题解决(IE浏览器a标签download属性不兼容问题解决)
p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) }
if('msSaveOrOpenBlob' in navigator){
window.navigator.msSaveOrOpenBlob(blob, fileName);
return;
}
//文件地址
var url = '../aaa/bbb/模板.xlsx';
var xhr = new XMLHttpRequest();
xhr.open('get', url, true);
xhr.responseType = "blob"; // 返回类型blob
// 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
xhr.onload = function() {
// 请求完成
if(this.status === 200) {
// 返回200
var blob = this.response;
var href = window.URL.createObjectURL(blob); //创建下载的链接
//判断是否是IE浏览器,是的话返回true
if (window.navigator.msSaveBlob) {
try {
window.navigator.msSaveBlob(blob, '模板.xlsx')
} catch (e) {
console.log(e);
}
} else {
// 谷歌浏览器 创建a标签 添加download属性下载
var downloadElement = document.createElement('a');
downloadElement.href = href;
downloadElement.target = '_blank';
downloadElement.download = '模板.xlsx'; //下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); //点击下载
document.body.removeChild(downloadElement); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放掉blob对象
}
}
}
// 发送ajax请求
xhr.send()
代码:
var wb;//读取完成的数据
function importf(obj) {//导入
//判断FileReader是否存在,FileReader是实现纯前端导入的必要方法
if (typeof (FileReader) != "undefined") {
//判断是否可以使用readAsBinaryString,IE10浏览器没有的情况下用readAsArrayBuffer,手动将文件流转二进制字符串(fixdata方法在下方)
if (!FileReader.prototype.readAsBinaryString) {
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
wb = XLSX.read(btoa(fixdata(data)), {
type: 'base64'
});
//此处showImportVehicles是我接下来展示数据的方法,红色部分可拿到Excel中第一列的具体数值,其他列自然也可以容易获取
window.parent.page
.showImportVehicles(JSON.stringify(XLSX.utils
.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])));
};
reader.readAsArrayBuffer(f);
} else {
//不需要兼容IE10及以下版本浏览器时可用readAsBinaryString
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
wb = XLSX.read(data, {
type: 'binary'
});
window.parent.page.showImportVehicles(JSON.stringify(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])));
};
reader.readAsBinaryString(f);
}
} else {
//IE9及以下版本浏览器,没有FileReader方法时,无法实现纯前端导入Excel,这时在后端获取文件内容再返回前端,更加方便快捷
$.ajaxFileUpload
({
url: "/etims-track/track/importVehicles",
secureuri: false,
fileElementId: 'excelFile',
timeout: 600000,
success: function (data) {
var str = data.body.innerHTML;//获取返回的字符串
window.parent.page.showImportVehicles(str);
},
error: function (data, status, e) {
}
})
}
}
function fixdata(data) { //文件流转BinaryString
var o = "";
var bytes = new Uint8Array(data);
for (var i = 0; i < data.byteLength; i++) {
o += String.fromCharCode(bytes[i]);
}
return o;
}
注:兼容IE9及以下版本使用ajaxFileUpload向后端传文件的兼容处理:
在ajaxfileupload.js文件中有这样一段代码:
if(window.ActiveXObject) {
if(jQuery.browser.version=="9.0" || jQuery.browser.version=="10.0"){
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}else if(jQuery.browser.version=="6.0" || jQuery.browser.version=="7.0" || jQuery.browser.version=="8.0"){
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
}
这段代码已经是在想办法去兼容浏览器版本了,但在IE9版本浏览器下,无法识别JQuery.browser.version,也就是无法识别浏览器版本version,因此修改成以下代码:
if(window.ActiveXObject) {
var ieVersion = navigator.appVersion.split(";")[1].replace(/[ ]/g, "").replace("MSIE","");
if(ieVersion=="9.0" || ieVersion=="10.0"){
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}else if(ieVersion=="6.0" || ieVersion=="7.0" || ieVersion=="8.0"){
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
}
这里的ieVersion获取到的就是IE浏览器的版本,就可以解决兼容性问题。
另:在通过后端获取Excel文件中内容时,除了通过ajaxFileUpload方式,也可以使用Jquery form表单提交的形式。
IE浏览器a标签无法下载问题解决(IE浏览器a标签download属性不兼容问题解决)的更多相关文章
- 判断浏览器是否支持某些新属性---placeholder兼容问题解决
function is_true(){ return 'placeholder' in document.createElement('input'); } 实例:placeholder在低版本IE浏 ...
- JS前端下载文本文件小技巧:1、download属性;2、借助Blob转换成二进制下载
一.HTML download 与文件下载 如果希望在前端侧直接触发某些资源的下载,最方便快捷的方法就是使用HTML5原生的download属性,例如: <a href="large. ...
- 使用a标签直接下载图片
通常情况下,使用a标签链接到图片,会在浏览器中打开这个图片,而不会下载 如果要直接下载这个图片,可以使用download属性配合href属性 <a href="./1.jpg" ...
- Folx使用教程:怎么通过设置标签分类下载内容
很多Mac OS下载软件从网上下载各种各样的文件,一般默认都会存放在"下载"文件夹中.如果不是经常整理"下载"文件夹,久而久之,该文件夹会变得庞大而杂乱. 如果 ...
- 下载apk文件浏览器会直接打开并显示乱码的问题
今天同事反映他的apk文件在自己的老项目中下载有问题:下载apk文件浏览器会直接打开并显示乱码,在别的项目中就没有问题. 后分析response的content-type发现,老项目的类型是text/ ...
- Google Chrome浏览器各版本直接下载地址
Google Chrome浏览器各版本直接下载地址 2012.04.12珍藏软件 10161 Views 0 Comments 现在所用的主浏览器Google Chrome,在其官方主页上默认只 ...
- 在html使用a标签 直接下载图片 不通过后台实现直接下载
由于a标签在HTML中链接图片会被识别并打开到网页上 如果想下载这个图片的话 就需要连接到后台读取文件并生成一个头信息下载.不过可以先给a标签加上一个download属性即可直接下载了. <a ...
- Python 配置 selenium 模拟浏览器环境,带下载链接
使用浏览器渲染引擎.直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句. 这方法在爬虫过程中会打开一个浏览器,加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来 ...
- 网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放
网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放. <meta name="viewport" conten ...
- Nginx 配置下载附件让浏览器提示用户是否保存
Nginx配置下载附件让浏览器提示用户是否保存 by:授客 QQ:1033553122 测试环境 nginx-1.10.0 问题描述: 前端页面,IE11浏览器下请求下载附件模板,针对xls ...
随机推荐
- 电商项目maven框架搭建引入dubbo配置文件报错
解决:dubbo配置文件报红叉的问题 构建dobbo-provider配置文件时,报红叉错误,本质即找不到对应的dubbo.xsd文件. 1.下载模板 模板下载地址:http://download.c ...
- vue中组件传值的几种方式
一.父组件给子组件传值方式(步骤) 1.VC1(子组件)定义props[a,b,c] 注意:props中的每个值都可以加各种修饰,如数据类型,是否可为空,默认值... 2.VC2(父组件)引用子组件 ...
- C# 实时显示时间
c#实时显示时间 - vv彭 - 博客园 (cnblogs.com)
- Office2021专业增强版激活
1.以管理员权限运行win+R输入CMD,进入命令行界面,输入以下命令 32位系统输入:cd /d %ProgramFiles(x86)%\Microsoft Office\Office16 64位系 ...
- 配置VS Code链接外部gsl库文件
配置VS code在C语言中调用gsl库文件 gsl安装 sudo apt-get install libgsl0-dev 先确认gsl库,gcc都已正确安装,命令行 gcc -L/usr/local ...
- PyTorch Geometric(pyg)学习
参考2个链接: 第十六课.Pytorch-geometric入门(一)_tzc_fly的博客-CSDN博客_pytorch-geometric 第十七课.Pytorch-geometric入门(二)_ ...
- 关于webpack 开启代理proxy后,接口看不到代理地址的问题。
今天在项目中发现, 明明在proxy里代理了 接口地址确不是10.10.11.106/front/xxxxxx.这是为啥呢?changeOrigin的修改也是一样,在网络请求中发现host还是没改.这 ...
- clickhouse-数据副本踩坑
数据副本--失败,看日志 vim /var/log/clickhouse-server/clickhouse-server.err.log select * from system.replicati ...
- django admin 字段设置
来源:http://xieboke.net/article/100/ django admin 后台里有些输入框长度.宽度.提示语等,可能不满足我们的需求,这个时候,我们就需要对 admin 的样式进 ...
- OC基础 - isMemberOfClass | isKindOfClass
isMemberOfClass | isKindOfClass 1 - 猜想以下代码输出的结果 1 #import <Foundation/Foundation.h> 2 #import ...