Vue 后臺管理類項目兼容IE9+的方法示例
最近項目進(jìn)入到了第三方集成的環(huán)節(jié),集成第三方監(jiān)控非要用IE,咋辦?老板讓我將后臺管理系統(tǒng)的框架兼容下IE,一直都是在chrome下開發(fā)的,也不知道IE下是什么鬼。
目前后臺管理系統(tǒng)前端搭建方式
目前系統(tǒng)是用vue-cli@2.0生成的,UI框架使用的是iview,ajax請求使用的是axois,此外就沒有什么特殊的npm包了。
需要解決的兼容問題
經(jīng)過自己的一番測試,目前主要有以下的兼容問題:
- 在IE下由于沒有promise,所以axios不能用了;
- 在涉及到flex、fixed、absolute定位時,IE瀏覽器下的顯示效果有較大的區(qū)別;
- excel表單導(dǎo)出異常;
- 部分使用的npm包中的代碼未經(jīng)編譯會有一些ES6的語法;
- vue-router路由失效;
- IE自動緩存ajax請求結(jié)果。
如何解決這些問題
解決第一個問題需要在項目中引入babel-polyfill, 我的處理方式時在build->webpack.base.config.js文件中的添加一下的配置:
解決第二個問題則需要自己寫一些兼容性比較好的樣式,在這里我就不做過多的解釋了;
第三個問題的解決過程比較的曲折,系統(tǒng)的下載是同過接口返回文件流的形式進(jìn)行下載的,可以看下我原來的代碼,原先通過axios的攔截器來獲取響應(yīng)內(nèi)容的格式,然后進(jìn)行下載,但是在IE的兼容測試過程中發(fā)現(xiàn)了一個問題,那就是axios在chrome和IE下的表現(xiàn)不一致,具體哪里一致可以簡單的說下:
const downloadUrl = url => { let iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; iframe.onload = function () { document.body.removeChild(iframe); }; document.body.appendChild(iframe); }; // 攔截二進(jìn)制響應(yīng)流 if (res.headers && (res.headers['content-type'] === 'application/vnd.ms-excel;charset=UTF-8' || res.headers['content-type'] === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || res.headers['content-type'] === 'application/octet-stream;charset=UTF-8')) { downloadUrl(res.request.responseURL); return }
這里面的問題在于在IE瀏覽器中res.request.responseURL這個屬性是不存在的,就算存在了,在進(jìn)行文件下載時也會出現(xiàn)異常,后臺看到很多人都出現(xiàn)了這樣的問題,怎么辦,我相信這個問題一定是可以解決的,雖然沒有搜到合適的方案,但是一個網(wǎng)友提示這一切的問題都是使用了第三方封裝的ajax請求,那為什么不自己手寫一個原生的ajax請求呢?切換思路后發(fā)現(xiàn),果然是可以的,ajax下載文件流可以使用以下代碼:
utils.exportFiles = (type = 'GET', url = null) => { var xhr = null if (window.XMLHttpRequest) { // Mozilla 瀏覽器 xhr = new XMLHttpRequest() } else { if (window.ActiveXObject) { try { xhr = new ActiveXObject('Microsoft.XMLHTTP') } catch (e) { try { xhr = new ActiveXObject('Msxml2.XMLHTTP') } catch (e) { } } } } xhr.open(type, url, true) xhr.responseType = 'blob' if (type === 'POST') { xhr.setRequestHeader('Content-type', 'application/json') } xhr.onload = function (res) { var contentDisposition = xhr.getResponseHeader('content-disposition') var contentType = xhr.getResponseHeader('content-type') var filename = contentDisposition.split(';')[2] // eslint-disable-next-line no-eval eval(filename) filename = decodeURI(filename) if (this.status === 201) { var blob = this.response if (typeof window.navigator.msSaveBlob !== 'undefined') { // IE 瀏覽器進(jìn)行下載 window.navigator.msSaveBlob(blob, filename) } else { // 非瀏覽器進(jìn)行下載 var downloadUrl = document.createElement('a') downloadUrl.download = filename downloadUrl.style.display = 'none' downloadUrl.href = URL.createObjectURL(blob) document.body.appendChild(downloadUrl) downloadUrl.click() URL.revokeObjectURL(downloadUrl.href) document.body.removeChild(downloadUrl) } } else { console.log('導(dǎo)出錯誤') } } xhr.send() }
第四個問題同樣還是一些webpack打包的問題,在vue-cli2.0生成的項目中,哪些js會使用babel-loader是這樣配置的:
我們可以看到,其針對3個文件加的js代碼使用babel-loader,將需要使用babel-loader的npm包添加到其中即可。 第五個問題百度可以搜到,其中我比較推薦的解決方案如下:
const IE11RouterFix = { methods: { hashChangeHandler: function () { this.$router.push(window.location.hash.substring(1, window.location.hash.length)); }, isIE11: function () { return !!window.MSInputMethodContext && !!document.documentMode; } }, mounted: function () { if (this.isIE11()) { window.addEventListener('hashchange', this.hashChangeHandler); } }, destroyed: function () { if (this.isIE11()) { window.removeEventListener('hashchange', this.hashChangeHandler); } } } export default IE11RouterFix var vm = new Vue({ el: '#app', router, store, mixins: [IE11RouterFix], components: { App, }, template: '<App/>' });
第6個問題是過了一段時候發(fā)現(xiàn)的,IE會自動的緩存請求的結(jié)果,那么對系統(tǒng)中的一些操作是有影響的,比如說是在數(shù)據(jù)保存完成之后回到列表頁的刷新,取到的數(shù)據(jù)是緩存中的數(shù)據(jù)。怎么辦,我們可以在axios的請求攔截器中自動為請求地址添加時間戳,保證每次的請求的地址是不一樣的。
總結(jié)
以上耗時一天的IE兼容就完成了,目前只能兼容到IE11,IE10,其他的我已經(jīng)放棄了,就算再兼容完成后,系統(tǒng)再IE10下的表現(xiàn)也不是特別的好,感覺比較卡,再IE11下也只能說是正常。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue項目實現(xiàn)多語言切換的思路
- 利用vue-i18n實現(xiàn)多語言切換效果的方法
- Vue中使用vue-i18插件實現(xiàn)多語言切換功能
- vue與vue-i18n結(jié)合實現(xiàn)后臺數(shù)據(jù)的多語言切換方法
- Vue 電商后臺管理項目階段性總結(jié)(推薦)
- vue+element-ui JYAdmin后臺管理系統(tǒng)模板解析
- 簡單了解Vue + ElementUI后臺管理模板
- 詳解Vue后臺管理系統(tǒng)開發(fā)日??偨Y(jié)(組件PageHeader)
- vue中如何實現(xiàn)后臺管理系統(tǒng)的權(quán)限控制的方法步驟
- vue實現(xiàn)后臺管理權(quán)限系統(tǒng)及頂欄三級菜單顯示功能
- vue后臺管理添加多語言功能的實現(xiàn)示例
相關(guān)文章
Vue路由跳轉(zhuǎn)與接收參數(shù)的實現(xiàn)方式
這篇文章主要介紹了Vue路由跳轉(zhuǎn)與接收參數(shù)的實現(xiàn)方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04sublime如何配置開發(fā)VUE環(huán)境自動格式化代碼
這篇文章主要介紹了sublime如何配置開發(fā)VUE環(huán)境自動格式化代碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03Vue + Elementui實現(xiàn)多標(biāo)簽頁共存的方法
這篇文章主要介紹了Vue + Elementui實現(xiàn)多標(biāo)簽頁共存的方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06vue中使用sass及解決sass-loader版本過高導(dǎo)致的編譯錯誤問題
這篇文章主要介紹了vue中使用sass及解決sass-loader版本過高導(dǎo)致的編譯錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04vue等兩個接口都返回結(jié)果再執(zhí)行下一步的實例
這篇文章主要介紹了vue等兩個接口都返回結(jié)果再執(zhí)行下一步的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09