Internet Explorer 11:“別叫我 IE”
上週,微軟正式發布了 Internet Explorer 11 for Windows 8.1 的第一個預覽版 1 .這樣做可以平息基於備受詬病的網絡瀏覽器的洩露版本的謠言旋風。我們現在知道了一些關於 Internet Explorer 11 的非常重要的細節,包括它對 WebGL、prefetch、prerender、flexbox、mutation observers 和其他 Web 標準的支持。不過,也許更有趣的是,不是 在 Internet Explorer 11 中。
很長一段時間以來,微軟實際上已經從 Internet Explorer 中刪除了一些功能。用戶代理字符串也發生了變化。微軟似乎已經竭盡全力確保所有現有的 isIE()
代碼分支,無論是在 JavaScript 中還是在服務器上,都會返回 false
對於 Internet Explorer 11。對此變化的樂觀看法是 Internet Explorer 11 最終支持了足夠多的 Web 標準,從而不再需要現有的 IE 特定行為。
用戶代理更改
Internet Explorer 11 的用戶代理字符串比以前的版本更短,並且有一些有趣的變化:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko
將此與 Internet Explorer 10 用戶代理字符串(在 Windows 7 上)進行比較:
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
最明顯的區別是刪除了“MSIE”令牌,它從一開始就是 Internet Explorer 用戶代理的一部分。同樣值得注意的是最後添加了“like Gecko”。這表明如果 Internet Explorer 沒有被識別為本身,它更願意被識別為 Gecko 類型的瀏覽器。 Safari 是第一個添加“like Gecko”的瀏覽器,因此任何在用戶代理字符串中嗅探“Gecko”的人都會允許瀏覽器通過。
任何尋找“MSIE”的嗅探代碼現在都不能與新的用戶代理字符串一起使用。您仍然可以搜索“Trident”以識別它是 Internet Explorer(Internet Explorer 9 引入了“Trident”令牌)。真正的 Internet Explorer 版本現在通過“rv”令牌提供。
此外,navigator
也有一些變化 對像也掩蓋了正在使用的瀏覽器:
navigator.appName
現在設置為“Netscape”navigator.product
現在設置為“壁虎”
這似乎是一種欺騙開發人員的偷偷摸摸的嘗試,但這種行為實際上是在 HTML5
2
中指定的 . navigator.product
屬性必須是“Gecko”和 navigator.appName
應該是“Netscape”或更具體的東西。奇怪的建議,但 Internet Explorer 11 緊隨其後。
這些navigator
的副作用 變化是基於 JavaScript 的瀏覽器檢測邏輯可能最終會使用這些,並將最終將 Internet Explorer 11 識別為基於 Gecko 的瀏覽器。
document.all 和朋友
從 Internet Explorer 4 開始,document.all
一直是 Internet Explorer 中無所不在的力量。 document.getElementById()
實施前 , document.all
是獲取元素引用的“IE 方式”。儘管 Internet Explorer 5 的 DOM 支持,document.all
一直保留在 Internet Explorer 10 版中。截至 11 版,這種過去時代的遺跡現在已被偽造,這意味著任何代碼都基於 document.all
的存在進行分支 即使實際使用 document.all
的代碼也會在 Internet Explorer 11 中失敗 會工作的。
3
另一個保留是 attachEvent()
添加事件處理程序的方法。這個方法,還有detachEvent()
, 現在已從 Internet Explorer 11 中刪除。刪除這些方法是一種短路邏輯的方法,例如:
function addEvent(element, type, handler) {
if (element.attachEvent) {
element.attachEvent("on" + type, handler);
} else if (element.addEventListener) {
element.addEventListener(type, handler, false);
}
}
當然,建議您始終先測試基於標準的版本,在這種情況下刪除 attachEvent()
不會產生不同的行為。然而,互聯網上充斥著糟糕的特徵檢測邏輯和刪除 attachEvent()
確保以上述方式編寫的任何代碼都將使用標準版本而不是 IE 特定版本。
已刪除的其他一些功能:
window.execScript()
– IE 自己的eval()
版本window.doScroll()
– IE的滾動窗口方式script.onreadystatechange
– IE 監聽腳本何時加載的方式script.readyState
– IE 測試腳本加載狀態的方法document.selection
– IE 獲取當前選中文本的方式document.createStyleSheet
– IE 創建樣式表的方式style.styleSheet
– IE 從樣式對象引用樣式表的方式
所有這些都具有基於標準的等效項,應該使用它們來代替舊的 Internet Explorer 做事方式。與刪除其他功能一樣,刪除這些意味著為基於標準的功能進行功能檢測的跨瀏覽器代碼應該繼續工作而無需更改。
結論
看起來 Internet Explorer 11 可能是迄今為止最好的 Internet Explorer。通過最終消除過去錯誤的證據,微軟已準備好在當今基於標準的瀏覽器中佔有一席之地。刪除舊功能並將用戶代理字符串調整為不被識別為 Internet Explorer 是一個相當獨特的舉措,以確保今天所有正常工作的網站都能繼續工作。如果 Web 應用程序使用功能檢測而不是瀏覽器嗅探,那麼代碼應該只適用於 Internet Explorer 11。對於嗅探用戶代理的服務器,由於 Internet Explorer 11 的出色標準,用戶仍然應該獲得一個功能齊全的站點支持。
沒有 IE 特定代碼分支的未來即將到來,我很高興歡迎它。
更新(2013 年 7 月 2 日): 修改為提到 document.all
實際上並沒有被刪除,而是被改成了 falsy。
參考
- 面向開發人員的 Internet Explorer 11 預覽指南 (MSDN)
- 導航器對象 - 客戶端標識 (HTML5)
- 已過時 - document.all (HTML5) 的行為