js文件下载 ; 文件下载方法 ; IE中文件下载的方法 ; 使用IE下载 ; 文件下载兼容性 ; a标签下载 ; 浏览器下载

函数功能:实现主流浏览器的文件下载功能;

兼容性: >=IE10,Edge,chrome,firefox;

与后台的请求方式:GET请求,  url携带参数  url?id=123(隐藏文件真实路径);

实现下载功能的前提是判断出浏览器类型:

       browserType: function(){
var userAgent = navigator.userAgent.toLowerCase();
// Figure out what browser is being used
var testCenter = {
ie:function isIE() { //ie?
if (!!window.ActiveXObject || "ActiveXObject" in window)
return true;
else
return false;
},
edge : ()=>{ return /dge/.test(userAgent) },
chrome:()=>{ return /chrome/.test(userAgent)},
safari: ()=>{ return /safari/.test(userAgent)&&!(/chrome/.test(userAgent))},
opera: ()=>{ return /opera/.test(userAgent) } ,
msie: ()=>{ return /msie/.test(userAgent) && !/opera/.test(userAgent) },
mozilla: ()=>{ return /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) }
};
var browserObj = {};
for(var k in testCenter){
var result = testCenter[k]();
var version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1];
if(result){
browserObj.browser = k;
browserObj.version = version;
return browserObj;
}
}
},

下载函数定义:如下

dlFile : function(options) {
var that = this;
var url = options.url;
url += "?" + $.param(options.data); //这里也可以不用jq
var xhr = new XMLHttpRequest(); //发起请求
xhr.open('get', url);
xhr.responseType = 'blob'; //规定响应为流文件
xhr.send();
xhr.onreadystatechange = function(){
if (this.readyState == 4){
if (this.status == '401' || this.status == '402') {
//在这里可以进行一些请求失败的处理
}
else if(this.status == 200) {
var currentBrowserType = that.browserType(); //判断浏览器类型 见上述browserType函数;
if(currentBrowserType.browser==='ie'&&(currentBrowserType.version == "10.0" || currentBrowserType.version == "11.0")){ //如果IE创建iframe对象来下载 var href = window.URL.createObjectURL(this.response);
var elemIF = document.createElement("iframe");
elemIF.src = "http://" + location.host + '/crowd-web/file/downloadFile?' + $.param(options.data);
elemIF.style.display = "none";
document.body.appendChild(elemIF);
}else if( currentBrowserType.browser==='edge'){ //如果edge使用h5的a标签的下载功能实现
if (this.getResponseHeader("content-disposition")) {
var fileName = decodeURI(this.getResponseHeader("content-disposition").replace("attachment;filename=", ""));
}
var href = "http://" + location.host + '/crowd-web/file/downloadFile?' + $.param(options.data);
var $dllink = $('<a href="' + href + '" download="' + fileName + '" ></a>').appendTo(document.body);
$dllink[0].click();
window.URL.revokeObjectURL(href);
} else { //其他现代浏览器采用H5的a标签新特性实现
var href = window.URL.createObjectURL(this.response);
if (this.getResponseHeader("content-disposition")) {
var fileName = decodeURI(this.getResponseHeader("content-disposition").replace("attachment;filename=", ""));
}
var $dllink = $('<a href="' + href + '" download="' + fileName + '" ></a>').appendTo(document.body);
//initMouseEvent已经被放弃,直接使用a标签的dom节点click功能触发点击
//var event = document.createEvent("MouseEvents");
//event.initMouseEvent(
// "click", true, false, window, 0, 0, 0, 0, 0
// , false, false, false, false, 0, null
//);
//$dllink[0].dispatchEvent(event);
$dllink[0].click(); window.URL.revokeObjectURL(href); //告诉浏览器可以释放该路径
}
}
}
};
},

下载函数调用:如下

(以上方法均定义在全局对象tools中,也可以写成自己需要的方式)

 tools.dlFile({
data : {"fileId":item.id},
url :config.URL.downLoad,
contentType : "application/json;chartset=utf-8",
})

相关知识点:

文件下载的最佳方法选用:博文

使用H5 a标签的新特性:博文;

Blob对象及createObjectURL 和revokeObjectURL方法 : 博文;

提问:

a标签模拟click事件: 你猜如下代码能触发页面调转吗?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<a href="http://www.baidu.com" id="hehe">百度</a>
<button>跳到百度</button>
<script src="bower_components/jquery/dist/jquery.js"></script>
<script>
$("button").click(function(){
alert(123)
$("#hehe").click();
}) </script>
</body>
</html>

js文件下载及命名(兼容多浏览器)的更多相关文章

  1. js 复制网页内容,兼容各浏览器

    因需要做一个js单击,复制当前网页url的功能.使用的是如下的方法,但是只能在ie浏览器下正常使用. 方法如下: function copyURL(){ var clipBoardContent=&q ...

  2. js中css样式兼容各个浏览器写法

    在实际业务中往往需要在js中对dom添加一些样式,还需要对各个浏览器厂商的兼顾,看到一位大神写的一个方法很赞,做一个笔记 function prefixStyle(style){ var eleSty ...

  3. JavaScript文件下载 兼容所有浏览器 不可跨域

    前端文件下载 兼容所有浏览器 download.js文件下载,几乎支持所有类型下载,详细内容参考官网 http://danml.com/download.html 引入文件 <script sr ...

  4. JS获取回车事件(兼容各浏览器)

    一.用到onkeydown获取事件动作, 二.用到键盘对应代码keyCode, 三. var event=arguments.callee.caller.arguments[0]||window.ev ...

  5. 前台JS(type=‘file’)读取本地文件的内容,兼容各种浏览器

    [自己测了下,能兼容各种浏览器,但是读取中文会出现乱码.自己的解决方法是用notepad++把txt文件编码改为utf-8(应该是和浏览器编码保持一致吧?..)] 原文  http://blog.cs ...

  6. 兼容所有浏览器的设为首页收藏本站js代码

    大家发现传统的收藏本站按钮在360浏览器下面没有效果了,但是360浏览器用户群却非常之大.所以我们在网上找到一个兼容所有浏览器的收藏本站解决方案,具体功能如下: 设为首页 和 收藏本站js代码 兼容I ...

  7. js 事件监听 兼容浏览器

    js 事件监听 兼容浏览器   ie 用 attachEvent   w3c(firefox/chrome)  用 addEventListener 删除事件监听 ie 用 detachEven   ...

  8. 万能js实现翻页,动态生成内容自动翻页,兼容各种浏览器(已测试)----神器版!

    转--http://www.2cto.com/kf/201402/277535.html 万能js实现翻页,动态生成内容自动翻页,兼容各种浏览器(已测试)----神器版! 2014-02-11     ...

  9. 图片上传,支持同步/异步、预览(MVC、uploadify异步提交、js预览、ajaxSubmit异步提交)兼容大部分浏览器,含代码

    图片上传代码,支持同步/异步和图片的预览 主要用了两种方式,可兼容大部分浏览器. 第一种使用uploadify异步上传,上传后返回图片路径显示到页面. 每二种使用ajaxSubmit异步上传,为兼容I ...

随机推荐

  1. web前端概念巩固(一)

    h5: 1.web语义化 Web语义化是指在进行HTML结构.表现.行为设计时,尽量使用语义化的标签,使程序代码简介明了,易于进行Web操作和网站SEO,方便团队协作的一种标准,以图实现一种" ...

  2. BeautifulSoup库children(),descendants()方法的使用

    BeautifulSoup库children(),descendants()方法的使用 示例网站:http://www.pythonscraping.com/pages/page3.html 网站内容 ...

  3. 在eclipse中使用Maven建web工程项目

    在eclipse中使用Maven建web工程项目: 第一种方式: 右键新建maven工程,勾选创建一个简单工程 填入信息,注意打包方式要改为war 点击完成,创建完的工程目录如下: 项目中没有WEB- ...

  4. Unity属性的封装、继承、方法隐藏

    (一)Unity属性封装.继承.方法隐藏的学习和总结 一.属性的封装 1.属性封装的定义:通过对属性的读和写来保护类中的域. 2.格式例子: private string departname; // ...

  5. golang环境

    Golang是谷歌开发的一款开源性语言,暂时比较方便的IDE有Inteillj Idea.LiteIDE.Eclipse(Golipse)等,使用起来比较方便的IDE:LiteIDE和Inteillj ...

  6. Bitbucket导入项目

    1.先初始化git本地仓库(如果已经受git管理跳过此步) $ git init 2.添加远程仓库 $ git remote add origin git@bitbucket.org:name/rep ...

  7. POJ 1741/1987 树的点分治

    树的点分治,主要思想是每次找子树的重心,计算经过根节点的情况数,再减去点对属于同一子树的情况. #include <iostream> #include <vector> #i ...

  8. Lambda表达式效率问题

    原文 http://www.importnew.com/17262.html 有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Ja ...

  9. 自定义TextView跑马灯

    本篇主要介绍TextView的可控制跑马灯效果实现. Android自带的TextView添加几个属性就可以实现跑马灯效果,大概是这样 android:ellipsize="marquee& ...

  10. 【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party

    https://vjudge.net/contest/66569#problem/D trick:1~N各点到X可以通过转置变为X到1~N各点 #include<iostream> #in ...