element-ui
的 el-input
組件 v-model
在 IE9
存在的bugissuesjavascript
BUG內容:IE9下 el-input
組件刪除內容,失焦後恢復原值html
BUG緣由:el-input
源碼綁定的是 input
事件,而input
在IE9 中存在兼容性問題,當經過 Backspace
, Delete
, Cut
等刪除文本時,不觸發 input
事件。查看兼容性前端
解決方案:文檔監聽 selectionchange
事件, 手動觸發input
事件。代碼以下:vue
代碼出處:github.com/buzinas/ie9…java
(function (d) {
if (navigator.userAgent.indexOf('MSIE 9') === -1) return;
d.addEventListener('selectionchange', function() {
var el = d.activeElement;
if (el.tagName === 'TEXTAREA' || (el.tagName === 'INPUT' && el.type === 'text')) {
var ev = d.createEvent('CustomEvent');
ev.initCustomEvent('input', true, true, {});
el.dispatchEvent(ev);
}
});
})(document);
複製代碼
axios
IE8-9 CORS
IE8-9
不支持標準的 CORS
,它們基於 XDomainRequest
實現了一套基礎版的CORS
。能夠實現跨域訪問,可是相對標準而言,功能不完整。ios
關於在 IE8-9
中使用 CORS
的注意事項,能夠參考 XDomainRequest MDN 與 IE9瀏覽器支持CORS請求git
axios
IE9 POST
在 IE9
中,axios
的 post
請求,沒法傳送正確的參數,具體緣由還沒有找到,目前是使用 qs
庫 來解決這個問題。僞代碼以下:github
let axiosInstance = axios.create({
baseURL: 'xxxx'
});
export function $POST (path, data) {
data = qs.stringify(data);
axiosInstance.post(path, data);
}
複製代碼
UEditor
單圖上傳,跨域處理BUG緣由:UEditor
的單圖上傳,爲了兼容性,採用了 iframe
+ form
提交的方式來提交圖片。ajax
分析一下:iframe
+ form
上傳圖片的原理是,指定 form
的 target
爲 iframe
的name
,觸發post
請求後,至關於變向的把form 的 action
賦值給了iframe src
。上傳後,接口返回的信息會存儲在 iframe
的 body
中,再經過獲取 iframe body
的內容去獲取上傳後的圖片信息。若是此時 form 的 action 屬性的域名和當前站點的域名不一致,就出現跨域的狀況了,也就沒法訪問 iframe 內部的內容了element-ui
解決方案:須要根據需求而定
A:若是隻須要兼容 IE10+
,能夠直接修改ueditor.all.js
源碼,採用 ajax + FormData
的方式上傳。
B:若是須要兼容到 IE9
,能夠這樣處理:
①:修改源碼中form
的html
,加一個隱藏域<input type="hidden" name="issimpleupload" value="true"/>
,做爲單圖上傳的標識。
②:前端須要在當前站點域名下新建一個中間頁
,後端接口在上傳成功後,判斷若是是單圖上傳,就重定向到這個中間頁
,並在 URL 上攜帶返回的相關圖片信息。
③:這個時候,由於中間頁是當前站點域名,因此不存在跨域了,並且URL上帶有接口返回的數據內容,以後就是修改ueditor.all.js
了。
能夠直接獲取 iframe
的 location
對象,再從url中拿到數據。
也能夠在中間頁
添加一段JS邏輯,獲取url上的信息,填充到body或其餘容器中。
若是加載中間頁
時存在異步操做(好比單頁應用,加載某個url,會先觸發前端的token校驗再跳轉等等),能夠在中間頁
中將url上的信息使用localStorage
存儲起來,再在ueditor.all.js
中使用localStorage
的onstorage
事件監聽。
總結:解決跨域問題的本質,就是想盡千方萬法將外部域名弄回到當前域名。
固然,若是在主域名相同的狀況下,也能夠考慮在接口中輸出一段html
,html
裏面加段js
,設置document.domain
。
有了中間頁,咱們亦能夠嘗試使用 window.name
來存儲接口返回的信息,方法有不少種,看我的愛好了。
具體可參考:
UEditor1.4.3實現跨域上傳到獨立文件服務器,完美解決單文件和多文件上傳
IE9
提示 是否保存或下載json
BUG緣由:IE9 沒法解析回調裏的json數據,就是說若是服務器返回json數據,IE9 會把它當作文件來處理,顯示打開或保存 後端接口設置
解決方案:後端接口設置 response
響應頭的Content-type
爲 text/html
,前端拿到數據後再加一層解析(JSON.parse
)便可。
vue-upload-component
的使用總結與跨域處理設置this.$refs.uploadRefName.active = true
會自動觸發上傳。
inputFilter
中執行一些過濾操做,第三個參數prevent
是個函數,做用是阻止上傳。
inputFile
中執行一些發送請求後的操做,newFile
或oldFile
中的屬性:progress
,success
表示上傳進度和是否上傳成功。 response
屬性含有接口返回的數據。
vue-upload-component
在IE9
會降級使用 iframe
+ form
的方式來處理上傳, 因此也會存在跨域問題。解決方式 和我上面所說的 UEditor 單圖上傳,跨域處理
相似。都須要修改源碼和後端配合。