最近,一个开发代号为Windows Blue的Windows操作系统泄漏到了互联网上,该操作系统的内置浏览器为IE11,本文将介绍一下这个泄漏版的IE11中有哪些关键的新变化和新特性.

预先声明: 本文中所讲的内容都来自互联网,我自己没有安装过这个泄漏版的IE11,虽然我目前正在帮助微软的userAgents社区做一些工作,但我没有任何关于IE11未来计划的内部消息,本文只是对网上的那些消息做了一下总结,并加入了自己的看法和预测.

一个新的身份标识

关于IE11的第一个新闻就是它有了一个新的用户代理(UA)字符串:

Mozilla/5.0 (IE 11.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko

其中有两个比较显著的变化:

  1. MSIE变成了IE
  2. 多了一个like Gecko字段

第一个变化很明显是想让网站上现有的UA检测失效(译者注:因为现有的检测代码都是在检测MSIE字样).UA检测是为那些老版本的IE设计的,比如它们不支持addEventListener等符合标准的特性,就得走专门的代码分支.IE这样做就是在表示,它不再需要那些专门的检测代码,它可以执行符合标准的代码了.

关于后一个变化,有报道称这是IE在伪装成Firefox,这并不完全正确.Gecko的确是Firefox的渲染引擎,这没问题,但like gecko这个字段是WebKit最先使用的,IE添加该字段的理由和WebKit当年的理由一样,那就是,网站通常不会这么问浏览器:"你想要IE私有的代码还是基于标准的代码?",而是这么问:"你是IE还是Gecko?",也就是说,即使你支持标准也没有用,你的名字必须得是Gecko.虽然目前WebKit和IE实际上比Gecko更流行,但为了兼容已有的那些老站点,必须要加上这个字段.被识别成Gecko比被识别成Webkit要好的多,因为假如被识别成Webkit,就会遇到很多WebKit私有的甚至带属性前缀的代码,尤其是在移动站点上,伪装成Gecko能好一点.

改变UA字符串并不是这个版本的IE11用来伪装自己身份的唯一手段,还有navigator.appName属性现在返回了Netscape,而不是以前的Microsoft Internet Explorer,从而与WebKit和Gecko的实现达成一致.虽然Opera/Presto没有这么干,不过它马上要切换到Blink内核了,所以所有浏览器的appName属性都将会是Netscape.

最后一个伪装方式,就是IE11现在会假装不支持document.all.如果你使用特性检测来检测浏览器是否支持document.all,它会像Firefox,WebKit,以及Opera一样,反回一个false(译者注:在非IE浏览器中,document.all是个非常特殊的属性,它是一个对象值,但它同时又是一个假值,按照JS标准,这是不可能的,查看http://www.w3help.org/zh-cn/causes/BX9002).为什么要这样做?难道特性检测不是一直提倡的做法吗?是的,但是,很多开发者们总用"特性检测"来充当"浏览器检测"(译者注:Maintainable JavaScript一书中把这种检测方式称之为"浏览器推断",是不推荐的做法),这是不对的,在Opera工作时,我曾无数次看到过下面这样的代码:

var isIE = null;
if (document.all) {
isIE = true;
} if (isIE) {
// IE私有的代码,比如ActiveX,滤镜相关的
} else {
// 符合标准的代码
}

如果document.all为真值,则你马上断定它是IE,然后执行一些毫不相关的代码(译者注:指的是与document.all这个特性毫不相关的代码,这就是浏览器推断的表现).

如果IE以后假装不支持它,就可以避免被识别出来.另外一种可能是真的完全删除掉这个属性,但这样会破坏很多网站已有的代码.伪装不支持是一个很折衷的选择,浏览器开发商喜欢这么做.

但你必须记住,所有这些变化都发生在一个泄漏版的IE11中.很有可能是IE的开发者们想试验一下,看看这些变化执行之后的修复程度是否大于其破坏程度.我们不能过早的断定这些变化都会出现在最终版本的IE11中.

所有这些变化意味着什么呢.微软实际上在告诉全世界:"IE已经成长了,它是与标准兼容的,它能够支持网站上所有符合标准的代码,我们不再希望有专门为IE准备的代码".我比较倾向于相信这一点.IE10已经向前迈了一大步,IE11也许真的能够就标准实现上和其他浏览器进行竞争.

ES6

在这个泄漏版的IE11中,发现了两个ECMAScript 6(下一代JavaScript)中的新特性:

__proto__

在ECMAScript规范中,对象的原型用[[Prototype]]内部属性来表示,我们并没有方法直接操作这个属性.ES6通过对__proto__属性进行标准化改变了这一点.IE11现在也支持了__proto__属性,和Firefox,WebKit以及Opera一起.__proto__ 属性目前是非标准的,且我认为是个非常丑的API.

WeakMap

一个WeakMap对象是一个由键值对组成的映射,其中每个键值对中的键必须是一个对象值,并且如果除了这个键以外,一旦没有其他的引用指向这个对象时,这个对象就会被垃圾回收器回收掉,当然,引用它的那个键值对也就不复存在了.正因为这种表现,所以WeakMap对象中的键是不能被遍历的.WeakMap的一个典型的使用情形就是用它来保存对DOM节点的引用,每当一个DOM节点从文档中删除之后,对应的DOM对象就会被回收掉,WeakMap对象引用它的那个键值对也会被自动删除,这样减少了对内存的占用.

支持WeakMap的浏览器有IE11,Firefox,以及Chrome(需要在chrome:flags页面中开启相关选项).

WebGL

如果说存在一个IE反对者们可以用来声称"目前的IE仍然不属于现代浏览器"的理由,那么这个理由就是IE还不支持WebGL.不过我个人认为,对于大部分web开发者来说,WebGL并不是一个最重要的特性,因为它是一个很复杂的技术,通常的网站不需要3D图形的显示.

但在某些场景下,WebGL的确是个很关键的因素,比如说游戏.Mozilla和Epic最近宣布了利用asm.js将Unreal 3引擎移植到JavaScript的消息,这也就证明了Web越来越有能力成为真正的游戏平台,以至于微软也迫不及待的实现相关技术.

在这个泄漏版的IE11中,已经能够使用WebGL了,不过使用前必须要先导入一个注册表文件才行,毕竟还在开发阶段,不能直接开放.一开始人们发现它只支持IESL着色语言(基于DirectX),而不是符合标准的GLSL(基于OpenGL),后来才发现原来注册表中的一个值能够控制浏览器在这两者之间切换.

不过我们不能高兴的太早.直到最终的IE11正式版发布之前,我们都不能确定它是否真的会成为IE11的特性.我记得当初Opera中的WebGL就是默认关闭的,因为当时让Opera访问一个带有WebGL内容的页面,就会导致操作系统的蓝屏死机(我认为这是着色器导致的).Safari目前也是默认禁用了WebGL.不过,既然微软正在实现WebGL,未来的IE11不包含它的可能性是非常小的.

网络

有证据显示,这个泄漏版的IE11已经支持了SDPY,虽然目前还不是全功能的.所以我们有理由猜测,该特性会出现在最终版本的IE11中.

SPDY是一个由Google提出的,基于HTTP的网络协议.它的主要目的是想通过降低网络延迟,压缩请求头,以及减少客户端的连接数来加速网页的加载.虽然目前SPDY还不是标准,但IETF已经用它作为了HTTP 2.0标准的基础.

SPDY目前已经被Opera,Firefox,以及Chrome支持.

DOM和JavaScript API

Mutation观察者

如果你想监视某些DOM变化,传统的做法就是去监听Mutation事件.很多人都已经知道,Mutation事件是有设计缺陷的,因为它会导致严重的性能问题.正因为这个问题,Mutation事件现已被废弃.

但是Mutation事件的功能是非常有用的,我们需要一个替代品,于是就有了DOM4中的Mutation观察者.IE11实现了这一特性,和Chrome,Safari 6,以及Firefox一起,Opera一旦切换到Blink内核,也自然会继承到这一特性.

全屏API

有时,我们希望能够隐藏掉浏览器的窗口部分,让网页占据整个屏幕来显示.最常见的使用案例应该就是在播放视频的时候了,游戏算是第二常见的案例.全屏API能够让我们实现这一需求.

看起来IE11也要实现这一规范,因为这个泄漏版的IE11中已经有了requestFullscreen方法,当然,是带有ms前缀的,剩余部分的规范应该会在接下来的版本中实现.另外,Opera也已经实现了这一规范中的所有API,且是不带前缀的.Safari,Chrome,以及Firefox中的实现是带前缀的.其中Firefox的当前实现是依据旧版规范草案的,Safari 5.1和Chrome 15–19也是(参考caniuse.com).

由于Metro IE(也许还有其他的名字)始终是全屏的,那么该特性也就主要在桌面环境中使用了.

CSS

关于IE11新增了哪些CSS特性,并没有太多的新闻,也许是因为还处于开发初期,并且IE10已经实现了不少新的CSS特性的原因.其中有一个好消息是,IE11更新了FlexBox的实现到最新版的规范草案(很有可能是最终版).Flexbox语法在IE10正式发布的前两天发生了变化,所以导致IE10实现了一个过时的语法.我在编写SmashingBook 3中的FlexBox一节时,就被这个问题所困扰.目前只有Opera 12.1,Chrome(带前缀),Firefox 22实现了新版的FlexBox规范,Safari实现的仍然是旧版的规范.

-------------------------------------------------------------------------------------------------------------

关于IE11的更多相关文章

  1. IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

    你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...

  2. 修复IE11首页被恶意篡改的问题

    前几天为了测试一个程序,把系统换成了Windows10,Windows10自带了微软的新浏览器Edge和IE11,用来其实也没什么太多感觉了,我习惯于Chrome,但有些东西还是得用IE,比如网银之类 ...

  3. 企业IT管理员IE11升级指南【17】—— F12 开发者工具

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  4. 企业IT管理员IE11升级指南【16】—— 使用Compat Inspector快速定位IE兼容性问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  5. 企业IT管理员IE11升级指南【15】—— 代理自动配置脚本

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  6. IE10 IE11 中 网站无法登录问题cookie

    方法一: 在程序文件中添加此文件 在项目中创建一个文件夹将下载的文件直接拖入文件夹中 来源于:http://www.hanselman.com/blog/BugAndFixASPNETFailsToD ...

  7. angular js 在ie11 下的get请求缓存问题的解决办法

    使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...

  8. ie11的DOM管理器报错

    IE11 Windows7下F12 DOC资源管理器不能用Exception in window.onload: Error: An error has ocurredJSPlugin.3005--- ...

  9. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法

    首先需要确保你的HTML页面开始部分要有DOCTYPE声明.DOCTYPE告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档,具体会影响:对标记attributes .propertie ...

  10. IE11兼容性问题修改

    最近测试给了我一大堆BUG,一瞅发现全是IE11的.吐槽一下这个浏览器真的比较特立独行.很多默认的样式跟别的浏览器不同,而且最明显的一点应该是padding左右内边距往往比别的浏览器大了一倍.但是当需 ...

随机推荐

  1. EF中使用SqlQuery进行参数化查询时抛出异常

    EF中使用带参数的SqlQuery进行查询时,抛出"另一个 sqlparametercollection 中已包含 sqlparameter"异常. 这是由于SqlParamert ...

  2. C#程序调用cmd执行命令-MySql备份还原

    1.简单实例 //备份还原mysql public static void TestOne() { Process p = new Process(); p.StartInfo.FileName = ...

  3. (转)jQuery Validation Plugin客户端表单证验插件

    jQuery Validation Plugin客户端表单验证插件 官方文档:http://jqueryvalidation.org/documentation/ 官方demo:http://jque ...

  4. C#获取当前路径的几种方法

    C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...

  5. poj 1182 并查集高级应用

    C - 是谁站在食物链的顶端 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     ...

  6. linux int to string 方法

    最近从windows 移植程序的时候发现to_string()函数在linux 中不能用,网上找了几种方法,觉得使用stringstream对象来实现类型转化比较好一点. 你只需在你工程中加入下面的t ...

  7. js控制TR的显示影藏

    在很多现实的场景中,有的文本框我们希望在选择“是”的按钮之后才出现,这就需要js控制TR的隐藏和显示,(div的影藏显示类似) 以下是一段选择是的按钮就显示身高和体重的文本框的代码.注意:ready方 ...

  8. jQuery源码分析1

    写在开头: 昨天开始,我决定要认真的看看jQuery的源码,选择1.7.2,源于公司用的这个版本.由于源码比较长,这将会是一个比较持久的过程,我将要利用业余时间,和偶尔上班不算忙的时间来进行.其实原本 ...

  9. css技巧之如何实现ul li边框重合

    提到边框重合,我们不妨打开淘宝首页浏览主体分类内容板块瞧瞧---亲,你看到了,正是这个,边框重合.其实我们不难发现,这个效果并不难,只是我们没有真正的动手做过而已,所以不知道怎么做,那么下面就是一个很 ...

  10. 【Node.js】Event Loop执行顺序详解

    本文基于node 0.10.22版本 关于EventLoop是什么,请看阮老师写的什么是EventLoop 本文讲述的是EventLoop中的执行顺序(着重讲setImmediate, setTime ...