| | |
| | | import { validatenull } from './validate'; |
| | | import sha256 from 'crypto-js/sha256'; |
| | | import Base64 from 'crypto-js/enc-base64'; |
| | | import { validatenull } from './validate' |
| | | import sha256 from 'crypto-js/sha256' |
| | | import Base64 from 'crypto-js/enc-base64' |
| | | //表单序列化 |
| | | export const serialize = data => { |
| | | let list = []; |
| | | Object.keys(data).forEach(ele => { |
| | | list.push(`${ele}=${data[ele]}`); |
| | | }); |
| | | return list.join('&'); |
| | | }; |
| | | let list = [] |
| | | Object.keys(data).forEach(ele => { |
| | | list.push(`${ele}=${data[ele]}`) |
| | | }) |
| | | return list.join('&') |
| | | } |
| | | export const getObjType = obj => { |
| | | var toString = Object.prototype.toString; |
| | | var map = { |
| | | '[object Boolean]': 'boolean', |
| | | '[object Number]': 'number', |
| | | '[object String]': 'string', |
| | | '[object Function]': 'function', |
| | | '[object Array]': 'array', |
| | | '[object Date]': 'date', |
| | | '[object RegExp]': 'regExp', |
| | | '[object Undefined]': 'undefined', |
| | | '[object Null]': 'null', |
| | | '[object Object]': 'object', |
| | | }; |
| | | if (obj instanceof Element) { |
| | | return 'element'; |
| | | } |
| | | return map[toString.call(obj)]; |
| | | }; |
| | | var toString = Object.prototype.toString |
| | | var map = { |
| | | '[object Boolean]': 'boolean', |
| | | '[object Number]': 'number', |
| | | '[object String]': 'string', |
| | | '[object Function]': 'function', |
| | | '[object Array]': 'array', |
| | | '[object Date]': 'date', |
| | | '[object RegExp]': 'regExp', |
| | | '[object Undefined]': 'undefined', |
| | | '[object Null]': 'null', |
| | | '[object Object]': 'object', |
| | | } |
| | | if (obj instanceof Element) { |
| | | return 'element' |
| | | } |
| | | return map[toString.call(obj)] |
| | | } |
| | | /** |
| | | * 对象深拷贝 |
| | | */ |
| | | export const deepClone = data => { |
| | | var type = getObjType(data); |
| | | var obj; |
| | | if (type === 'array') { |
| | | obj = []; |
| | | } else if (type === 'object') { |
| | | obj = {}; |
| | | } else { |
| | | //不再具有下一层次 |
| | | return data; |
| | | } |
| | | if (type === 'array') { |
| | | for (var i = 0, len = data.length; i < len; i++) { |
| | | obj.push(deepClone(data[i])); |
| | | } |
| | | } else if (type === 'object') { |
| | | for (var key in data) { |
| | | obj[key] = deepClone(data[key]); |
| | | } |
| | | } |
| | | return obj; |
| | | }; |
| | | var type = getObjType(data) |
| | | var obj |
| | | if (type === 'array') { |
| | | obj = [] |
| | | } else if (type === 'object') { |
| | | obj = {} |
| | | } else { |
| | | //不再具有下一层次 |
| | | return data |
| | | } |
| | | if (type === 'array') { |
| | | for (var i = 0, len = data.length; i < len; i++) { |
| | | obj.push(deepClone(data[i])) |
| | | } |
| | | } else if (type === 'object') { |
| | | for (var key in data) { |
| | | obj[key] = deepClone(data[key]) |
| | | } |
| | | } |
| | | return obj |
| | | } |
| | | /** |
| | | * 设置灰度模式 |
| | | */ |
| | | export const toggleGrayMode = status => { |
| | | if (status) { |
| | | document.body.className = document.body.className + ' grayMode'; |
| | | } else { |
| | | document.body.className = document.body.className.replace(' grayMode', ''); |
| | | } |
| | | }; |
| | | if (status) { |
| | | document.body.className = document.body.className + ' grayMode' |
| | | } else { |
| | | document.body.className = document.body.className.replace(' grayMode', '') |
| | | } |
| | | } |
| | | /** |
| | | * 设置主题 |
| | | */ |
| | | export const setTheme = name => { |
| | | document.body.className = name; |
| | | }; |
| | | document.body.className = name |
| | | } |
| | | |
| | | /** |
| | | * 加密处理 |
| | | */ |
| | | export const encryption = params => { |
| | | let { data = {}, type, param, key } = params; |
| | | let result = JSON.parse(JSON.stringify(data)); |
| | | if (type == 'Base64') { |
| | | param.forEach(ele => { |
| | | result[ele] = Base64.stringify(result[ele]); |
| | | }); |
| | | } else if (type == 'Aes') { |
| | | param.forEach(ele => { |
| | | result[ele] = sha256(result[ele], key); |
| | | }); |
| | | } |
| | | return result; |
| | | }; |
| | | let { data = {}, type, param, key } = params |
| | | let result = JSON.parse(JSON.stringify(data)) |
| | | if (type == 'Base64') { |
| | | param.forEach(ele => { |
| | | result[ele] = Base64.stringify(result[ele]) |
| | | }) |
| | | } else if (type == 'Aes') { |
| | | param.forEach(ele => { |
| | | result[ele] = sha256(result[ele], key) |
| | | }) |
| | | } |
| | | return result |
| | | } |
| | | |
| | | /** |
| | | * 浏览器判断是否全屏 |
| | | */ |
| | | export const fullscreenToggel = () => { |
| | | if (fullscreenEnable()) { |
| | | exitFullScreen(); |
| | | } else { |
| | | reqFullScreen(); |
| | | } |
| | | }; |
| | | if (fullscreenEnable()) { |
| | | exitFullScreen() |
| | | } else { |
| | | reqFullScreen() |
| | | } |
| | | } |
| | | /** |
| | | * esc监听全屏 |
| | | */ |
| | | export const listenfullscreen = callback => { |
| | | function listen() { |
| | | callback(); |
| | | } |
| | | function listen() { |
| | | callback() |
| | | } |
| | | |
| | | document.addEventListener('fullscreenchange', function () { |
| | | listen(); |
| | | }); |
| | | document.addEventListener('mozfullscreenchange', function () { |
| | | listen(); |
| | | }); |
| | | document.addEventListener('webkitfullscreenchange', function () { |
| | | listen(); |
| | | }); |
| | | document.addEventListener('msfullscreenchange', function () { |
| | | listen(); |
| | | }); |
| | | }; |
| | | document.addEventListener('fullscreenchange', function () { |
| | | listen() |
| | | }) |
| | | document.addEventListener('mozfullscreenchange', function () { |
| | | listen() |
| | | }) |
| | | document.addEventListener('webkitfullscreenchange', function () { |
| | | listen() |
| | | }) |
| | | document.addEventListener('msfullscreenchange', function () { |
| | | listen() |
| | | }) |
| | | } |
| | | /** |
| | | * 浏览器判断是否全屏 |
| | | */ |
| | | export const fullscreenEnable = () => { |
| | | var isFullscreen = |
| | | document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen; |
| | | return isFullscreen; |
| | | }; |
| | | var isFullscreen = |
| | | document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen |
| | | return isFullscreen |
| | | } |
| | | |
| | | /** |
| | | * 浏览器全屏 |
| | | */ |
| | | export const reqFullScreen = () => { |
| | | if (document.documentElement.requestFullScreen) { |
| | | document.documentElement.requestFullScreen(); |
| | | } else if (document.documentElement.webkitRequestFullScreen) { |
| | | document.documentElement.webkitRequestFullScreen(); |
| | | } else if (document.documentElement.mozRequestFullScreen) { |
| | | document.documentElement.mozRequestFullScreen(); |
| | | } |
| | | }; |
| | | if (document.documentElement.requestFullScreen) { |
| | | document.documentElement.requestFullScreen() |
| | | } else if (document.documentElement.webkitRequestFullScreen) { |
| | | document.documentElement.webkitRequestFullScreen() |
| | | } else if (document.documentElement.mozRequestFullScreen) { |
| | | document.documentElement.mozRequestFullScreen() |
| | | } |
| | | } |
| | | /** |
| | | * 浏览器退出全屏 |
| | | */ |
| | | export const exitFullScreen = () => { |
| | | if (document.documentElement.requestFullScreen) { |
| | | document.exitFullScreen(); |
| | | } else if (document.documentElement.webkitRequestFullScreen) { |
| | | document.webkitCancelFullScreen(); |
| | | } else if (document.documentElement.mozRequestFullScreen) { |
| | | document.mozCancelFullScreen(); |
| | | } |
| | | }; |
| | | if (document.documentElement.requestFullScreen) { |
| | | document.exitFullScreen() |
| | | } else if (document.documentElement.webkitRequestFullScreen) { |
| | | document.webkitCancelFullScreen() |
| | | } else if (document.documentElement.mozRequestFullScreen) { |
| | | document.mozCancelFullScreen() |
| | | } |
| | | } |
| | | /** |
| | | * 递归寻找子类的父类 |
| | | */ |
| | | |
| | | export const findParent = (menu, id) => { |
| | | for (let i = 0; i < menu.length; i++) { |
| | | if (menu[i].children.length != 0) { |
| | | for (let j = 0; j < menu[i].children.length; j++) { |
| | | if (menu[i].children[j].id == id) { |
| | | return menu[i]; |
| | | } else { |
| | | if (menu[i].children[j].children.length != 0) { |
| | | return findParent(menu[i].children[j].children, id); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | for (let i = 0; i < menu.length; i++) { |
| | | if (menu[i].children.length != 0) { |
| | | for (let j = 0; j < menu[i].children.length; j++) { |
| | | if (menu[i].children[j].id == id) { |
| | | return menu[i] |
| | | } else { |
| | | if (menu[i].children[j].children.length != 0) { |
| | | return findParent(menu[i].children[j].children, id) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 判断2个对象属性和值是否相等 |
| | | */ |
| | |
| | | */ |
| | | |
| | | export const loadStyle = url => { |
| | | const link = document.createElement('link'); |
| | | link.type = 'text/css'; |
| | | link.rel = 'stylesheet'; |
| | | link.href = url; |
| | | const head = document.getElementsByTagName('head')[0]; |
| | | head.appendChild(link); |
| | | }; |
| | | const link = document.createElement('link') |
| | | link.type = 'text/css' |
| | | link.rel = 'stylesheet' |
| | | link.href = url |
| | | const head = document.getElementsByTagName('head')[0] |
| | | head.appendChild(link) |
| | | } |
| | | /** |
| | | * 判断路由是否相等 |
| | | */ |
| | | export const diff = (obj1, obj2) => { |
| | | delete obj1.close; |
| | | var o1 = obj1 instanceof Object; |
| | | var o2 = obj2 instanceof Object; |
| | | if (!o1 || !o2) { |
| | | /* 判断不是对象 */ |
| | | return obj1 === obj2; |
| | | } |
| | | delete obj1.close |
| | | var o1 = obj1 instanceof Object |
| | | var o2 = obj2 instanceof Object |
| | | if (!o1 || !o2) { |
| | | /* 判断不是对象 */ |
| | | return obj1 === obj2 |
| | | } |
| | | |
| | | if (Object.keys(obj1).length !== Object.keys(obj2).length) { |
| | | return false; |
| | | //Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2; |
| | | } |
| | | if (Object.keys(obj1).length !== Object.keys(obj2).length) { |
| | | return false |
| | | //Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2; |
| | | } |
| | | |
| | | for (var attr in obj1) { |
| | | var t1 = obj1[attr] instanceof Object; |
| | | var t2 = obj2[attr] instanceof Object; |
| | | if (t1 && t2) { |
| | | return diff(obj1[attr], obj2[attr]); |
| | | } else if (obj1[attr] !== obj2[attr]) { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | }; |
| | | for (var attr in obj1) { |
| | | var t1 = obj1[attr] instanceof Object |
| | | var t2 = obj2[attr] instanceof Object |
| | | if (t1 && t2) { |
| | | return diff(obj1[attr], obj2[attr]) |
| | | } else if (obj1[attr] !== obj2[attr]) { |
| | | return false |
| | | } |
| | | } |
| | | return true |
| | | } |
| | | /** |
| | | * 根据字典的value显示label |
| | | */ |
| | | export const findByvalue = (dic, value) => { |
| | | let result = ''; |
| | | if (validatenull(dic)) return value; |
| | | if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') { |
| | | let index = 0; |
| | | index = findArray(dic, value); |
| | | if (index != -1) { |
| | | result = dic[index].label; |
| | | } else { |
| | | result = value; |
| | | } |
| | | } else if (value instanceof Array) { |
| | | result = []; |
| | | let index = 0; |
| | | value.forEach(ele => { |
| | | index = findArray(dic, ele); |
| | | if (index != -1) { |
| | | result.push(dic[index].label); |
| | | } else { |
| | | result.push(value); |
| | | } |
| | | }); |
| | | result = result.toString(); |
| | | } |
| | | return result; |
| | | }; |
| | | let result = '' |
| | | if (validatenull(dic)) return value |
| | | if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') { |
| | | let index = 0 |
| | | index = findArray(dic, value) |
| | | if (index != -1) { |
| | | result = dic[index].label |
| | | } else { |
| | | result = value |
| | | } |
| | | } else if (value instanceof Array) { |
| | | result = [] |
| | | let index = 0 |
| | | value.forEach(ele => { |
| | | index = findArray(dic, ele) |
| | | if (index != -1) { |
| | | result.push(dic[index].label) |
| | | } else { |
| | | result.push(value) |
| | | } |
| | | }) |
| | | result = result.toString() |
| | | } |
| | | return result |
| | | } |
| | | /** |
| | | * 根据字典的value查找对应的index |
| | | */ |
| | | export const findArray = (dic, value) => { |
| | | for (let i = 0; i < dic.length; i++) { |
| | | if (dic[i].value == value) { |
| | | return i; |
| | | } |
| | | } |
| | | return -1; |
| | | }; |
| | | for (let i = 0; i < dic.length; i++) { |
| | | if (dic[i].value == value) { |
| | | return i |
| | | } |
| | | } |
| | | return -1 |
| | | } |
| | | /** |
| | | * 生成随机len位数字 |
| | | */ |
| | | export const randomLenNum = (len, date) => { |
| | | let random = ''; |
| | | random = Math.ceil(Math.random() * 100000000000000) |
| | | .toString() |
| | | .substr(0, len ? len : 4); |
| | | if (date) random = random + Date.now(); |
| | | return random; |
| | | }; |
| | | let random = '' |
| | | random = Math.ceil(Math.random() * 100000000000000) |
| | | .toString() |
| | | .substr(0, len ? len : 4) |
| | | if (date) random = random + Date.now() |
| | | return random |
| | | } |
| | | /** |
| | | * 打开小窗口 |
| | | */ |
| | | export const openWindow = (url, title, w, h) => { |
| | | // Fixes dual-screen position Most browsers Firefox |
| | | const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left; |
| | | const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top; |
| | | // Fixes dual-screen position Most browsers Firefox |
| | | const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left |
| | | const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top |
| | | |
| | | const width = window.innerWidth |
| | | ? window.innerWidth |
| | | : document.documentElement.clientWidth |
| | | ? document.documentElement.clientWidth |
| | | : screen.width; |
| | | const height = window.innerHeight |
| | | ? window.innerHeight |
| | | : document.documentElement.clientHeight |
| | | ? document.documentElement.clientHeight |
| | | : screen.height; |
| | | const width = window.innerWidth |
| | | ? window.innerWidth |
| | | : document.documentElement.clientWidth |
| | | ? document.documentElement.clientWidth |
| | | : screen.width |
| | | const height = window.innerHeight |
| | | ? window.innerHeight |
| | | : document.documentElement.clientHeight |
| | | ? document.documentElement.clientHeight |
| | | : screen.height |
| | | |
| | | const left = width / 2 - w / 2 + dualScreenLeft; |
| | | const top = height / 2 - h / 2 + dualScreenTop; |
| | | const newWindow = window.open( |
| | | url, |
| | | title, |
| | | 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + |
| | | w + |
| | | ', height=' + |
| | | h + |
| | | ', top=' + |
| | | top + |
| | | ', left=' + |
| | | left |
| | | ); |
| | | const left = width / 2 - w / 2 + dualScreenLeft |
| | | const top = height / 2 - h / 2 + dualScreenTop |
| | | const newWindow = window.open( |
| | | url, |
| | | title, |
| | | 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + |
| | | w + |
| | | ', height=' + |
| | | h + |
| | | ', top=' + |
| | | top + |
| | | ', left=' + |
| | | left |
| | | ) |
| | | |
| | | // Puts focus on the newWindow |
| | | if (window.focus) { |
| | | newWindow.focus(); |
| | | } |
| | | }; |
| | | // Puts focus on the newWindow |
| | | if (window.focus) { |
| | | newWindow.focus() |
| | | } |
| | | } |
| | | |
| | | export const getScreen = isCollapse => { |
| | | if (document.body.clientWidth <= 768) { |
| | | return !isCollapse; |
| | | } else { |
| | | return isCollapse; |
| | | } |
| | | }; |
| | | if (document.body.clientWidth <= 768) { |
| | | return !isCollapse |
| | | } else { |
| | | return isCollapse |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取顶部地址栏地址 |
| | | */ |
| | | export const getTopUrl = () => { |
| | | return window.location.href.split('/#/')[0]; |
| | | }; |
| | | return window.location.href.split('/#/')[0] |
| | | } |
| | | |
| | | /** |
| | | * 获取url参数 |
| | | * @param name 参数名 |
| | | */ |
| | | export const getQueryString = name => { |
| | | let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); |
| | | let r = window.location.search.substr(1).match(reg); |
| | | if (r != null) return unescape(decodeURI(r[2])); |
| | | return null; |
| | | }; |
| | | let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i') |
| | | let r = window.location.search.substr(1).match(reg) |
| | | if (r != null) return unescape(decodeURI(r[2])) |
| | | return null |
| | | } |
| | | |
| | | /** |
| | | * 下载文件 |
| | |
| | | * @param {String} name - 文件名,eg: test.png |
| | | */ |
| | | export const downloadFileBlob = (path, name) => { |
| | | const xhr = new XMLHttpRequest(); |
| | | xhr.open('get', path); |
| | | xhr.responseType = 'blob'; |
| | | xhr.send(); |
| | | xhr.onload = function () { |
| | | if (this.status === 200 || this.status === 304) { |
| | | // 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob |
| | | if ('msSaveOrOpenBlob' in navigator) { |
| | | navigator.msSaveOrOpenBlob(this.response, name); |
| | | return; |
| | | } |
| | | const url = URL.createObjectURL(this.response); |
| | | const a = document.createElement('a'); |
| | | a.style.display = 'none'; |
| | | a.href = url; |
| | | a.download = name; |
| | | document.body.appendChild(a); |
| | | a.click(); |
| | | document.body.removeChild(a); |
| | | URL.revokeObjectURL(url); |
| | | } |
| | | }; |
| | | }; |
| | | const xhr = new XMLHttpRequest() |
| | | xhr.open('get', path) |
| | | xhr.responseType = 'blob' |
| | | xhr.send() |
| | | xhr.onload = function () { |
| | | if (this.status === 200 || this.status === 304) { |
| | | // 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob |
| | | if ('msSaveOrOpenBlob' in navigator) { |
| | | navigator.msSaveOrOpenBlob(this.response, name) |
| | | return |
| | | } |
| | | const url = URL.createObjectURL(this.response) |
| | | const a = document.createElement('a') |
| | | a.style.display = 'none' |
| | | a.href = url |
| | | a.download = name |
| | | document.body.appendChild(a) |
| | | a.click() |
| | | document.body.removeChild(a) |
| | | URL.revokeObjectURL(url) |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 下载文件 |
| | |
| | | * @param {String} name - 文件名,eg: test.png |
| | | */ |
| | | export const downloadFileBase64 = (path, name) => { |
| | | const xhr = new XMLHttpRequest(); |
| | | xhr.open('get', path); |
| | | xhr.responseType = 'blob'; |
| | | xhr.send(); |
| | | xhr.onload = function () { |
| | | if (this.status === 200 || this.status === 304) { |
| | | const fileReader = new FileReader(); |
| | | fileReader.readAsDataURL(this.response); |
| | | fileReader.onload = function () { |
| | | const a = document.createElement('a'); |
| | | a.style.display = 'none'; |
| | | a.href = this.result; |
| | | a.download = name; |
| | | document.body.appendChild(a); |
| | | a.click(); |
| | | document.body.removeChild(a); |
| | | }; |
| | | } |
| | | }; |
| | | }; |
| | | const xhr = new XMLHttpRequest() |
| | | xhr.open('get', path) |
| | | xhr.responseType = 'blob' |
| | | xhr.send() |
| | | xhr.onload = function () { |
| | | if (this.status === 200 || this.status === 304) { |
| | | const fileReader = new FileReader() |
| | | fileReader.readAsDataURL(this.response) |
| | | fileReader.onload = function () { |
| | | const a = document.createElement('a') |
| | | a.style.display = 'none' |
| | | a.href = this.result |
| | | a.download = name |
| | | document.body.appendChild(a) |
| | | a.click() |
| | | document.body.removeChild(a) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 下载excel |
| | |
| | | * @param {String} filename 文件名称 |
| | | */ |
| | | export const downloadXls = (fileArrayBuffer, filename) => { |
| | | downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8'); |
| | | }; |
| | | downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8') |
| | | } |
| | | |
| | | /** |
| | | * 下载json |
| | |
| | | * @param {String} filename 文件名称 |
| | | */ |
| | | export const downloadJson = (fileArrayBuffer, filename) => { |
| | | downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8'); |
| | | }; |
| | | downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8') |
| | | } |
| | | |
| | | /** |
| | | * 下载文件 |
| | |
| | | * @param mimeType 文件类型 |
| | | */ |
| | | export const downloadFile = (fileArrayBuffer, filename, mimeType = 'application/octet-stream') => { |
| | | let data = new Blob([fileArrayBuffer], { type: mimeType }); |
| | | if (typeof window.chrome !== 'undefined') { |
| | | // Chrome |
| | | let link = document.createElement('a'); |
| | | link.href = window.URL.createObjectURL(data); |
| | | link.download = filename; |
| | | link.click(); |
| | | } else if (typeof window.navigator.msSaveBlob !== 'undefined') { |
| | | // IE |
| | | let blob = new Blob([data], { type: 'application/force-download' }); |
| | | window.navigator.msSaveBlob(blob, filename); |
| | | } else { |
| | | // Firefox |
| | | let file = new File([data], filename, { type: 'application/force-download' }); |
| | | window.open(URL.createObjectURL(file)); |
| | | } |
| | | }; |
| | | let data = new Blob([fileArrayBuffer], { type: mimeType }) |
| | | if (typeof window.chrome !== 'undefined') { |
| | | // Chrome |
| | | let link = document.createElement('a') |
| | | link.href = window.URL.createObjectURL(data) |
| | | link.download = filename |
| | | link.click() |
| | | } else if (typeof window.navigator.msSaveBlob !== 'undefined') { |
| | | // IE |
| | | let blob = new Blob([data], { type: 'application/force-download' }) |
| | | window.navigator.msSaveBlob(blob, filename) |
| | | } else { |
| | | // Firefox |
| | | let file = new File([data], filename, { type: 'application/force-download' }) |
| | | window.open(URL.createObjectURL(file)) |
| | | } |
| | | } |