IE兼容性開發的筆記

當前項目組開發的產品對外承諾支持IE9和IE11,但在推廣應用過程中發現存在相當比例的用戶實際上還在使用IE8,而這相當比例中的用戶還包括了大部分的公司領導。爲了滿足公司內部各階層人士體驗我們產品的訴求,開發團隊的上層領導經過協商,決定投入專門的精力來完成IE8的支持。本文是筆記,記錄了整改過程中發現、解決的一些問題。

IE兼容模式

簡單的說,即是在jsp頁面的頭部增加如下的代碼,指定瀏覽器以最高模式來呈現頁面。對於我們項目組的產品來說,如下的代碼可以保證IE8、IE9、IE11的用戶在打開頁面時,都可以得到最佳的體驗。
<meta http-equiv="X-UA-Compatible" content="IE=edge">
至於這行代碼的具體含義,可以問度娘,相信會有滿意的答覆。
如果沒有這行代碼,當前項目開發的jsp頁面在IE8模式下打開時,會報一些稀奇古怪的、和jquery、JSON相關的錯誤,加上這行代碼之後,這些錯誤就消失了。

字符串的trim方法

項目組內開發人員在頁面上大量應用到了字符串的trim方法,IE9及其以上版本的IE瀏覽器都默認提供了trim方法,但IE8並沒有提供,因此頁面上使用trim方法的地方都會報js錯。解決方法比較簡單,直接使用jquery提供的trim方法,比如"axdfa ".trim()替換爲$.trim("axdfa "),問題即可解決。

變量定義

頁面上有一個div,id爲xxxx,代碼樣例如下。

<div id="xxxxx"></div>
此時js代碼中如出現如下的代碼,並且xxxxx沒有使用var來聲明,那麼js在執行到如下一行時會報錯,提示信息是對象不支持此屬性或方法。
xxxxx = 1;
這個問題初始發現時讓我糾結了相當長時間,分析思路一度跑偏,以爲是IE8的js引擎對於語法要求比較高,而IE9和IE11的語法要求比較低;但奇怪的是,網上並沒有搜索到相關的話題,所以並不確定。後來經高手啓發,並反覆嘗試之後,才發現當頁面上存在前述場景時,IE8模式下js代碼是一定會報錯的。
明確了問題之後,修改方法就非常明確了,要麼修改div的id,要麼使用變量前用var來顯式初始化。

數組的遍歷

對於數組var a = [1,2,4,],在IE8下,使用下標方式和jquery的each方法遍歷數組時,會多遍歷得到一個null對象;而使用IE9、IE11則不會存在這個問題。因此數組的最後一個元素之後切記不可增加“,”,否則會導致頁面的js在IE8時出現詭異的表現。

數組的indexOf方法

IE8不支持數組的indexOf方法,爲了滿足在數組中查找對象的需要,代碼中通常會爲數組擴展indexOf方法。這引入一個問題,在使用foreach方式遍歷數組時,indexOf方法也會作爲數組的一個成員被遍歷到,這比較討厭;而使用下標方式和jquery的each方法來遍歷數組,則不會引入這個問題。
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function () {
// ...
}
}

因此我個人建議是不要爲數組提供indexOf方法的實現,直接使用jquery的inArray方法,也可以達到相同的效果,但需要注意的是inArray方法在使用時,被查詢對象在前,數組對象在後。



歡迎訪問Jackie的家,http://jackieathome.sinaapp.com/,如需轉載文章,請註明出處。

發佈了70 篇原創文章 · 獲贊 52 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章