/**
* Javascript 多文件下載
* @author Barret Lee
* @email barret.china@gmail.com
*/
var Downer = (function(files) {
var h5Down = !/Trident|MSIE/.test(navigator.userAgent);
// try{
// h5Down = document.createElement("a").hasOwnProperty("download");
// } catch(e){
// h5Down = document.createElement("a").download;
// }
/**
* 在支持 download 屬性的情況下使用該方法進行單個文件下載
* 目前 FF 還不支持 download 屬性,所以 FF 必須另覓他法!
* @param {String} fileName
* @param {String|FileObject} contentOrPath
* @return {Null}
*/
function downloadFile(fileName, contentOrPath) {
var aLink = document.createElement("a"),
evt = document.createEvent("HTMLEvents"),
isData = contentOrPath.slice(0, 5) === "data:",
isPath = contentOrPath.lastIndexOf(".") > -1;
// 初始化點擊事件
// 注:initEvent 不加后兩個參數在FF下會報錯
evt.initEvent("click", false, false);
// 添加文件下載名
aLink.download = fileName;
// 如果是 path 或者 dataURL 直接賦值
// 如果是 file 或者其他內容,使用 Blob 轉換
aLink.href = isPath || isData ? contentOrPath : URL.createObjectURL(new Blob([contentOrPath]));
aLink.dispatchEvent(evt);
}
/**
* [IEdownloadFile description]
* @param {String} fileName
* @param {String|FileObject} contentOrPath
*/
function IEdownloadFile(fileName, contentOrPath, bool) {
var isImg = contentOrPath.slice(0, 10) === "data:image",
ifr = document.createElement('iframe');
ifr.style.display = 'none';
ifr.src = contentOrPath;
document.body.appendChild(ifr);
// dataURL 的情況
isImg && ifr.contentWindow.document.write("<img src='" +
contentOrPath + "' />");
// 保存頁面 -> 保存文件
// alert(ifr.contentWindow.document.body.innerHTML)
if (bool) {
ifr.contentWindow.document.execCommand('SaveAs', false, fileName);
document.body.removeChild(ifr);
} else {
setTimeout(function() {
ifr.contentWindow.document.execCommand('SaveAs', false, fileName);
document.body.removeChild(ifr);
}, 0);
}
}
/**
* [parseURL description]
* @param {String} str [description]
* @return {String} [description]
*/
function parseURL(str) {
return str.lastIndexOf("/") > -1 ? str.slice(str.lastIndexOf("/") + 1) : str;
}
return function(files) {
// 選擇下載函數
var downer = h5Down ? downloadFile : IEdownloadFile;
// 判斷類型,處理下載文件名
if (files instanceof Array) {
for (var i = 0, l = files.length; i < l; i++)
// bug 處理
downer(parseURL(files[i]), files[i], true);
} else if (typeof files === "string") {
downer(parseURL(files), files);
} else {
// 對象
for (var file in files) downer(file, files[file]);
}
}
})();