Internet Explorer 11 浏览器介绍:别叫我IE


Posted in Javascript onSeptember 28, 2014

在上个星期,微软随Windows 8.1正式推出了Internet Explorer 11的第一次预览版。这样,关于这款备受争议的web浏览器泄露版本的各种传闻也该休息了。我们现在已经知道一些关于Internet Explorer 11的重要的细节,包括支持WebGL ,prefetch(译者注:预读取,比如上传文件的预览啥的,不知道翻译的对不对),prerender(预呈现), flexbox,mutation observers和其他web标准,也许在IE11中更有趣的是,它是不是IE。

长期以来,微软第一次从Internet Explorer浏览器中移除了一些特征。user-agent字符串也更改了。看来,微软已经抛弃了自己的方式,这样现有的检测IE的代码分支在Internet Explorer 11浏览器中都将返回false,无论是在 javascript里还是服务器上。

User-agent的改变

相对于以前的版本,Internet Explorer 11的user-agent字符串更短,而且还有一些有意思的变化:

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

对于在Windows 7上Internet Explorer 10的user-agent字符串

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

最明显的区别是,一直存在Internet Explorer浏览器user-agent字符串的“MSIE”标记去掉了。同样引人注目的是在user-agent的尾部添加了“like Gecko”。这表明Internet Explorer宁可被识别为Gecko浏览器,也不愿被识别为Internet Explorer自己。Safari是第一个添加“like Gecko”的浏览器,这样任何人都可以嗅探user-agent字符串里面的“Gecko”字符允许浏览器通过。

现在任何查找“MSIE”的嗅探代码在新的user-agent字符串下不能工作。你仍然可以搜索“Trident”字符来确定它是IE浏览器(“Trident”标识是随着Internet Explorer推出来的)。Internet Explorer的真正版本通过“rv”来标识。

此外,navigator对象的信息也有一些变化,这样更掩饰了正在使用的浏览器的。

navigator.appName 被设置为“Netscape”
navigator.product被设置为 “Gecko”

这可能看起来像企图偷偷摸摸欺骗开发人员,但是这些实际上是HTML5指定的。navigator.product属性必须为“Gecko”,同时navigator.appName也应该是“Netscape”或者更具体的。但Internet Explorer 11缺遵循了这个奇怪的建议。

navigator信息的更改导致的副作用,正在使用的基于Javascript逻辑的浏览器检测将可能无法使用,导致 Internet Explorer 11识别为基于Gecko的浏览器。

document.all和他的朋友们

从IE4以来,document.all在IE浏览器中无所不能。此前实行的document.getElementById()类似,document.all是得到一个DOM元素引用的IE方式。尽管从IE5开始到IE10,document.all都保持着对 DOM的支持。然而在11中,这个时代遗留下来的产物已经被设置为返回false,这就意味着任何基于document.all的代码分支判断在IE11中将失败,即使代码实际使用document.all能正常工作。

另一个遗留是添加事件函数的attachEvent(),类似于detachEvent()方法。这个方法已经从IE11中移除了。移除这些方法,是为了避免一些逻辑判断,比如:

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()——eval()方法的IE版本

window.doScroll()——IE窗口的滚动方法
script.onreadystatechange——IE中监听加载脚本的状态更改
script.readyState——IE中脚本加载的状态
document.selection——IE中当前选中的文本
document.createStyleSheet——IE中创建样式表文挡
style.styleSheet——IE浏览器中引用一个样式表的样式对象
所有这些IE浏览器的方式都被标准的特征所取代。在移除这些特征和方法后,基于标准功能特征检测的跨浏览器代码在不改变的情况下依然可以正常运行。

结论
在很长的时间段内,IE11可能是最好的IE浏览器。微软终于开始准备消除过去犯的错误,准备开始从包括基于现在标准的浏览器做起。删除旧的特征和修改不被认定为IE浏览器的用户代理字符串是一个很独特的做法,它确保所有的网站能继续工作。如果Web应用程序使用功能检测,而不是浏览器嗅探,那么代码应该可以IE11中运行。对于使用user-agent嗅探的应用,用户仍然能看到一个功能完好的网站,因为IE11对标准支持的十分优秀。

一个没有IE分支代码的未来即将到来,让我们一起期待。

(2013-7-2更新),修订提到的document.all实际上并未删除,而改为falsy

好久没翻译文章了,这次翻译的是 Nicholas C. Zakas大牛的Blog,
原文在这:http://www.nczonline.net/blog/2013/07/02/internet-explorer-11-dont-call-me-ie/
Javascript 相关文章推荐
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
Apr 26 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
Jun 24 Javascript
当json键为数字时的取值方法解析
Nov 15 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
vue一个页面实现音乐播放器的示例
Feb 06 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
浏览器缩放检测的js代码
Sep 28 #Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 #Javascript
Javascript中封装window.open解决不兼容问题
Sep 28 #Javascript
jQuery固定浮动侧边栏实现思路及代码
Sep 28 #Javascript
js文件包含的几种方式介绍
Sep 28 #Javascript
javascript中bind函数的作用实例介绍
Sep 28 #Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 #Javascript
You might like
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
python中线程和进程有何区别
2020/06/17 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
转党组织关系介绍信
2014/01/08 职场文书
成龙洗发水广告词
2014/03/14 职场文书
课内比教学心得体会
2014/09/09 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技