Internet Explorer 11: “请不要再叫我 IE”

jopen 11年前

微软在上周刚刚发布了用于 Windows 8.1 上的首个 Internet Explorer 11 的预览版,此举是为了回应之前泄漏关于 Internet Explorer 11 的信息。我们已经确认 Internet Explorer 11 中的一些新特性,包括对 WebGL 的支持、预抓取、预渲染、flexbox、mutation observers 以及其他一些 Web 标准的支持。但是更有趣的是,虽然被叫为 Internet Explorer 11,但它已经不再是 IE 了。

Internet Explorer 11: “请不要再叫我 IE”

这也是首次微软真正移除了 Internet Explorer 的一些特性:更改了 user-agent 字符串,这使得很多判断浏览器是否 IE 的代码无法工作,包括有些 JavaScript 的 isIE() 的方法在 Internet Explorer 11 上执行会返回 false。不过好在 Internet Explorer 11 对 Web 标准的支持非常好,因此不再需要之前那些 IE 特定的行为。

在 Internet Explorer 11 中,user-agent 比之前的版本要短很多,而且去掉了最关键的 MSIE 的关键字:

Internet Explorer 11 的 user-agent:

Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko

Internet Explorer 10 的 user-agent (on Windows 7):

Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

上述 user-agent 你还会注意到增加了 Gecko 的标识,而 Safari 是首个标注了 Gecko 的浏览器。

之前多数使用 MSIE 来判断是否 IE 浏览器的代码都无法工作,可以改用 Trident 字符串来判断。Trident 标识是在 IE9 中引入的。

此外微软还更改了 navigator 对象:

  • navigator.appName 值为 “Netscape”
  • navigator.product 值为 “Gecko”

这或许是一项开发者的诡计,但该行为的确是在 HTML5 中实际指定的。在 HTML5 中要求这两个属性必须返回上述对应的值,这是一个很奇怪的规定的,更奇怪的是 Internet Explorer 11 遵守了这个规定。

此举导致一些根据 navigator 对象判断浏览器型号的 JavaScript 代码会将 Internet Explorer 11 识别成基于 Gecko 的浏览器。

document.all 和 friends

从 IE 4 开始,document.all 在 IE 中举足轻重。比起 document.getElementById() 来说,document.all 是 IE 方式的获取元素的引用的方法。尽管 IE 5 增加对 DOM 的支持,但 document.all 一直沿用至 IE 10。而在 Internet Explorer 11 中终于被废弃了,这意味着在 Internet Explorer 11 中使用 document.all 的方法将可能导致执行失败,尽管使用了 document.all 的代码实际上还是可以工作。[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() 的移除而影响代码执行。不过互联网上充斥着各种糟糕的监测代码,你只能确保自己的应用经过良好的标准测试。

被删除的特性还包括:

  • window.execScript() – IE 版本的 eval()
  • window.doScroll() – IE 用来滚动窗口的方式
  • script.onreadystatechange – IE 方式的脚本加载完成的事件通知
  • script.readyState – IE 方式的测试脚本是否加载完成的状态
  • document.selection – IE 方式获取当前选择的文本
  • document.createStyleSheet – IE 方式创建样式单
  • style.styleSheet – IE 方式引用样式

所有这些被废弃的方法都有基于标准的替代方法。如果你使用的是标准的方法那恭喜你,可直接支持 Internet Explorer 11.

结论

看起来 Internet Explorer 11 应该是 Internet Explorer 家族最棒的版本。通过最终移除过去一些魔鬼般的错误,微软正在为大家准备一个真正标准的浏览器。

更新(2013-7-2): document.all 并没有真正被删除,但不推荐使用。

参考资料

  1. Internet Explorer 11 preview guide for developers (MSDN)
  2. Navigator Object – Client Identification (HTML5)
  3. Obsolete – Behavior of document.all (HTML5)
  4. Internet Explorer 11 界面截图

via nczonline/oschina翻译