IE10的坑
1、XML的坑
2、UserAgent改變帶來的影響
3、移除了對條件注釋的支持
4、Flash的不完整支持
5、IE9的改變
隨着W in8的推出,IE10也跟着現身了,現在IE10又增加了對win7的支持,那么新的瀏覽器又有那些新特性呢?作為一個一直以來都問題頗多的IE瀏覽器來說,這一版本又有多少改變?現在咱們來看看
改變最大的是它越來越網W3C標准去靠近了,比如從IE9就已經實現的對DOM L2,DOM L3和DOM L2 和 L3 事件處理(包括冒泡模型)的完整支持,以及增加了對Html5和CSS3的支持。
在擁抱W3C的同時,它也就拋棄了之前的很多獨有的東西
1. XML的坑
上次遇到的,IE之前對通過XMLHttpRequest獲得的得到的responseXML 對象自動封裝成MSXML對象,因此有一些特別的方法,但是在IE10中,所有的XML一律采用的是標准的對象,很多特有的方法也就不再被支持,比如說selecNodes(),selectSingleNode
解決方案:
l 可以轉變為msxml對象,使用try catch 避免在其他瀏覽器造成錯誤
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
try { xhr.responseType = 'msxml-document'; } catch(e){}
//...
var doc = xhr.responseXML;
// 'doc' now contains an MSXML document in IE10’s Standards and Quirks document modes
l 徹底的解決方案就是使用標准的,可以用getElementsByTagName方法來代替
2. UserAgent改變帶來的影響
IE10自然會更新下UserAgent信息,新的信息為:
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
由於MSIE后的版本號從一位數變成了兩位數,所以如果是使用字符串檢測的話需要注意避免犯下面這個錯誤
// INCORRECT: will report IE10 version in capture 1 as "1"
var matchIE = /MSIE\s(\d)/;
改成下面這種就OK了
// CORRECT: will report IE10 version as "10"
var matchIE = /MSIE\s([\d]+)/;
當然最靠譜的還是使用功能檢測,而不是瀏覽器檢測
2. 移除了對條件注釋的支持
條件注釋對於解決IE家族的兼容性問題一直相當有用,但是IE10卻果斷拋棄了對條件注釋的支持(可能是覺得受到了歧視)。不過還好IE對標准的支持已經很好了,可能也不太需要條件注釋了。
<!--[if IE]>
這段文字在IE10中會被直接無視掉.
<![endif]-->
如果想在10中繼續使用條件注釋,可以強制使用IE9的行為來修復,加入下面這個meta標簽<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">
4.Flash的不完整支持
IE10剛開始的版本並沒有加入對flash的支持,因為它推薦使用html5而不是flash,但是應大家強烈的要求還是加入了flash,要提示用戶使用flash,可以加入以下信息
<meta http-equiv="X-UA-Compatible" content="requiresActiveX=true" />
但是對flash的支持有諸多的限制,對有些flash功能不兼容
以下的 Flash 功能開始與 Internet Explorer 10 並不兼容,可能無法在支持 Flash 的網站上提供有效的綜合體驗:
- 照相機
- 麥克風
- 打印
- 特色書簽(例如,Flash 定位點)
- 依賴雙擊(播放器使用雙擊來縮放到合適大小,但不會將雙擊作為雙擊事件傳播到 Flash 內容)
- 使用滾動更新事件和滾動事件
- 依賴 P2P(適用於 Windows 應用商店應用的 Windows UX 指南不允許創建套接字服 務器)
依賴以下 Flash 觸控 API:平移、縮放、旋轉、輕掃以及按下並點擊
詳細內容:Internet Explorer 10 兼容性手冊
附:另外IE9也改變了蠻多東西,摘錄一些常會遇到的點以及常規解決辦法,供大家參考
1. 在使用createElement時候不再識別(< >),比如
var elm = document.createElement("<div id='myDiv'>");//會報錯
2. 為了和其他瀏覽器兼容,不再支持方法的指針緩存
var d = document.writeln;
d("<script language=VBScript>");//無法正常執行
d.call(document, "<script language="VBScript">”);//解決:使用call
3.獲取自定義屬性時候不能使用 . 運算符,而應使用getAttribute()方法,否則獲取失敗
5. 間接引用eval方法會報錯,比如
var indirectEval = eval;
indirectEval("myDate = new " + dateFn + ";");//所以直接使用就得了
6. Object中如果包含有類似emebed的回退內容,在IE9中會被識別到DOM中,當使用window[“name”]獲取時候,會同時得到emebed,雖然你只想獲得object,
解決:使用功能檢測,若是支持document[“name”],則使用,否則就用window[“name”]
7. 文檔中的空白被可以被識別為DOM中的元素
參考:IE9的兼容性文檔
