文档章节

(转载)IE 浏览器的创新

小微
 小微
发布于 2012/08/29 09:52
字数 4131
阅读 108
收藏 2
IE

转载原因:之所以转载这篇文章是因为它的内容对我触动很大。以前在web开发的时候总是为浏览器兼容性问题大为挠头,也就因此跟着大家一起骂IE6的各种不济。现在看来自己的目光确实有些短浅,IE还有太多自己并不了解的光辉。而且,遇事的态度本来就不该是抱怨,而是积极地想办法解决。

 

译者按:IE 曾是 web 创新的先驱,但最近几年因为对 web 标准的支持落后于其他浏览器以及低版本 IE 的各种 bug 而被人诟病。雅虎的 Nicholas C. Zakas 带我们回顾了 IE 在 web 发展过程中扮演的辉煌角色,让我们能以一个更客观的眼光来看待 IE。看完这篇文章,也许大家都会对 IE 浏览器有一定的改观,这也是我翻译这篇文章的目的。以下是全文。

在 Internet Explorer 成为大家都恨之入骨的浏览器的很久以前,它曾是整个互联网的创新驱动力。有时候我们很难记得那些在 IE 6 成为全世界 web 开发者的灾难之前 IE 所作的贡献。不管你信不信,正因为有了 IE 4—6,才会有我们现在所知的 web 开发。IE 的一些独特的功能过去就曾是事实标准,后来成为了官方标准最终进入了 HTML5 规范。人们也许很难相信,对于我们现在认为理所应当的功能中有很大一部分都应该要想到 IE,但快速地回顾一下历史可以让我们知道的确如此。

DOM

如果 IE 是一个人人都痛恨的浏览器,那么「文档对象模型」(DOM)就是人人都痛恨的 API 了。你可以说 DOM 过于繁琐、不适合 JavaScript 甚至是有些荒谬,而且这些也都没错。然而,DOM 还是给了开发者通过 JavaScript 来访问网页的每个部分的途径。曾经你一度只能通过 JavaScript 访问页面中某些特定的元素。IE 3 和 Netscape 3 只允许程序访问表单元素、图片以及链接。Netscape 4 改进了这一点,把程序可访问的范围通过 document.layers 扩展到了它特有的 layer 元素。IE 4 作了进一步改进,把这个范围通过 document.all扩展到了页面的所有元素。

从很多方面来说,document.all 算是 document.getElementById() 的最初版本。你还是要使用元素的 ID 来通过 document.all 访问它,例如 document.all.myDiv 或是 document.all["myDiv"]。最主要的区别就是 IE 使用了一个集合而非方法,而这和其他当时的访问方法比如 document.images 及 document.forms 是相吻合的。

IE 4 也第一个引入了用 document.all.tags() 来通过标签名字获取一个元素列表的功能。无论从哪点来看,这都是 document.getElementsByTagName() 的最初版本,而且工作方式完全相同。如果你想获取所有的 div元素,你可以使用 document.all.tags("div")。甚至在 IE 9 中,这个方法仍然作为document.getElementsByTagName() 的一个别名存在。

IE 4 同时也为我们引入了可能是有史以来最流行的私有 DOM 扩展:innerHTML。看起来微软的那帮人是认识到了通过编程手段来建立一个 DOM 有多么痛苦,所以把这个便捷方法,连同 outerHTML 一起提供给我们。事实证明这两个方法都非常有用,已经在 HTML5 中被标准化了[1]。随它们一同而来的用来处理纯文本的 API——innerText 以及 outerText——同样被证明足够有影响力,因为 DOM Level 3 已经引入了与 innerText行为相似的 textContent[2]。

按照同样的思路,IE 4 引入了 insertAdjacentHTML(),这是又一种将 HTML 插入文档中的方法。虽然这花了更长的时间,但最终也被编入了 HTML5[3],而且目前已被各浏览器广泛支持。

事件

在开始时,JavaScript 并没有事件机制。网景和微软都作出了尝试,并且分别得出了不同的模型。网景给我们带来了事件捕获,其思想是一个事件先发送到窗口,然后是文档,然后一个个直到最终到达预期的目标。网景浏览器 6 以前的版本都仅支持事件捕获。

微软采取了一个相反的方法,设计出了事件冒泡。他们认为一个事件应该先从实际的目标出发,然后在上层节点触发直到文档。IE 9 以前的浏览器仅支持事件冒泡。虽然随着官方的 DOM 事件规范发展,同时包含了事件捕获和事件冒泡,但大多数 web 开发者都只使用事件冒泡,而把事件捕获仅仅留在 JavaScript 类库中的一些解决方案和小技巧中使用。

除了创造了事件冒泡以外,微软还创造了一系列后来也最终被标准化的额外事件:

●contextmenu – 当使用鼠标副按键点击一个元素时触发。在 IE 5 中首次出现,后来被编入了 HTML5[4]。现在已被所有主流浏览器所支持。

●beforeunload – 在 unload 事件前触发,允许你阻断页面的退出。最初由 IE 4 引入,现在也为 HTML5 的一部分[4]。

●mousewheel – 在鼠标滚轮(或类似设备)被使用时触发。首个支持此事件的浏览器是 IE 6。就像其他一样,目前也是 HTML5 的一部分[4]。唯一不支持此事件的主流桌面浏览器是 Firefox(但其支持一个可用来替代的 DOMMouseScroll 事件)。

●mouseenter – mouseover 的非冒泡版本,被微软在 IE 5 中引入,用来克服 mouseover 使用时带来的困扰。这个事件已被 DOM Level 3 事件规范正规化[5]。同样被 Firefox 及 Opera 支持,但 Safari 和 Chrome 都(暂时?)不支持。

●mouseleave – 与 mouseenter 对应的 mouseout 的非冒泡版本。在 IE 5 中被引入,目前被 DOM Level 3 事件规范标准化[6]。浏览器支持和 mouseenter 一样。

●focusin – focus 事件的冒泡版本,用来帮助更好地管理页面上的聚焦行为。最初在 IE 6 中被引入,现在已成为 DOM Level 3 事件规范的一部分[7]。目前没有被很好地支持,尽管 Firefox 关于其实现的开过一个 bug。

●focusout – blur 事件的冒泡版本,用来帮助更好地管理页面上的聚焦行为。最初在 IE 6 中被引入,现在已成为 DOM Level 3 事件规范的一部分[8]。和 focusin 一样,没有良好支持但 Firefox 接近了。

<iframe>

框架一开始是作为一个私有功能被引入 Netscape Navigator 2 的。这包括了 <frameset>、<frame> 以及<noframes>。其背后的思想其实很简单:那时每个人都在使用调制解调器,往返于服务器之间的代价颇高。主要的应用场景是提供一个只加载一次的带有导航元素的框架,然后其他框架可以由导航控制来做单独的变化。利用将导航作为一个单独页面来节省服务器渲染时间以及数据传输量在当时是一个巨大的胜利。

IE 3 也支持框架,因为他们当时在 web 上正变得非常流行。但是,微软为此功能增加了自己的私有标签:<iframe>。这个元素背后的基本想法是在一个页面中嵌入另一个页面。在 Netscape 的实现中你需要创建三个页面(导航页、内容页以及框架集)来实现静态导航,而在 IE 中你只需要两个页面(带有导航的主页面以及<iframe> 中的内容页)就能创建出同样的功能。起初,这曾经是 IE 和 Netscape Navigator 间的主战场之一。

<iframe> 逐渐变得更流行,因为它在创建框架集时更加省事。Netscape 在版本 4 中引入了和 <iframe> 功能十分类似的 <ilayer> 来进行反击。当然,<iframe> 最终胜出并且成为了目前 web 开发的一个重要部分。网景的框架和微软的 <iframe> 都曾被 HTML4 标准化,但网景的框架后来在 HTML5 中被废弃(不建议使用)了。

XML 与 Ajax

尽管 XML 已经像很多人所料的那样在现今的 web 上被大量使用,但是对 XML 进行支持的领路人仍然是 IE。它是第一个支持在客户端通过 JavaScript 进行 XML 解析以及 XSLT 变换的浏览器。不幸的是,它是通过 ActiveX 对象来表示 XML 文档以及 XSLT 处理器的。但 Mozilla 的人显然认识到了其中的可取之处,因为他们后来用DOMParser、XMLSerializer 和 XSLTProcessor 创造了类似的功能。其中前两个已经成为了 HTML5 的一部分[9]。虽然基于标准的 JavaScript XML 处理方式和 IE 提供的版本差异较大,但它无疑是深受 IE 影响的。

客户端的 XML 处理都都是 IE 对 XMLHttpRequest 的实现的一部分,最开始由 IE 5 以 ActiveX 对象的形式引入。其中的想法是希望可以在一个网页中从服务器获取一个 XML 文档并且允许用 JavaScript 把这个 XML 当做 DOM 来进行处理。IE 的版本需要你使用 new ActiveXObject("MSXML2.XMLHttp"),这也使得它依赖于版本字符串,而且让开发者要费尽功夫去测试、使用最新版本。再一次,Firefox 站出来,通过创建一个当时还是私有的、与 IE 版本接口完全同名的 XMLHttpRequest 对象来清理这一片混乱。此后其他浏览器复制了 Firefox 的实现,最终使得 IE 7 也增加了一个不需要使用 ActiveX 的版本。当然,使得每个人为 JavaScript 感到振奋的 Ajax 革命背后的驱动力正是 XMLHttpRequest。

CSS

当想到 CSS 的时候,你可能不会过多地想到 IE——毕竟它对于 CSS 的支持往往是滞后的(至少直到 IE 10 都是如此)。然而,IE 3 却是第一个实现了 CSS 支持的浏览器。当时,网景正在力推另一个类似的提案:JavaScript 样式表(JSSS)[10]。从名称就可以看出,这个提案用 JavaScript 来定义关于页面的样式信息。Netscape 4 引入了 JSSS 和 CSS,整整比 IE 落后了一个版本。其中对 CSS 的支持并不尽如人意,常常需要将样式翻译为 JSSS 以便应用[11]。这也意味着在 Netscape 4 下,如果 JavaScript 被禁止了,CSS 也无法正常工作。

而那时 IE 对 CSS 的实现仅限于字体族、字号、颜色以及背景,但这个实现却是优质且可用的。与此同时,Netscape 4 的实现却很容易出问题、难以使用。是的,在很小的程度上,IE 导致了 CSS 的成功。

IE 还给我们带来了其他最终被标准化的对 CSS 作的创新:

●text-overflow – 用来在文字超出容器大小时显示省略号。在 IE 6 中首次出现并已在 CSS3 中被标准化[12]。目前已被各主流浏览器支持。

●overflow-x 与 overflow-y – 允许你在两个独立的方向上对内容溢出进行控制。这个属性在 IE 5 中首次出现,后在 CSS3 中规范化了[13]。目前已被各主流浏览器支持。

●word-break – 用来指定词语之间的换行规则。最初在 IE 5.5 中出现,现已被 CSS3 规范化[14]。除 Opera 外的所有主流浏览器均支持。

●word-wrap – 指定了浏览器是否应该在词语中间换行。在 IE 5.5 中被创造出来,现已被 CSS3 标准化为了overflow-wrap[15],尽管所有主流浏览器都以 word-wrap 的形式支持它。

另外,许多 CSS3 中新的视觉效果都应该感谢 IE 所奠定的基础。IE 4 引入了私有的 filter 属性,从成为了第一个可以做下面这些事的浏览器:

●根据 CSS 的指示来生成渐变(CSS3:渐变)

●用 alpha 滤镜来创建半透明元素(CSS3:opacity 以及 RGBA)

●将一个元素旋转任意的角度(CSS3:用 transform 配合 rotate())

●为一个元素应用阴影(CSS3:box-shadow)

●为一个元素应用一个矩阵变换(CSS3:用 transform 配合 matrix())

除此之外,IE 4 有一个被称为「过渡」的功能,它允许你用滤镜创建一些基本的动画。这个功能主要是基于通常在 PowerPoint 中可用的过渡功能,例如淡入或淡出、棋盘变换等等[16]。

所有这些功能都以某种方式成为了 CSS3 的主要功能。在 1997 年发布的 IE 4 就有了这些功能,而我们现在才开始在其他浏览器中享受到这些功能,实在是很惊人的。

其他对 HTML5 的贡献

HTML5 中很大一部分都来自 IE 及其引入的 API。这里有一些本文之前还没提到过的内容:

●拖放 – HTML5 中最酷的部分之一就是原生的拖放功能[17]。这个 API 源自 IE 5,而且在 HTML5 中已有描述,且变化非常小。主要的区别是增加了 draggable 属性来把任意元素标记为可拖放的(IE 用了一个 JavaScript 调用——element.dragDrop() 来做这件事)。除此之外,这个 API 与原始版本近乎相同,目前已被各主流桌面浏览器所支持。

●剪贴板的访问 – 现在已从 HTML5 中分离出了自己的规范[18],赋予了浏览器在某些情况下访问剪贴板的能力。这个 API 最初出现在 IE 6 中,随后被 Safari 模仿,它将 clipboardData 从 window 对象中取了出来,放到了剪贴板事件的 event 对象中。Safari 的改动被保留为 HTML5 版本的一部分,而且剪贴板的访问在所有除 Opera 以外的主流浏览器中也都已被支持。

●富文本编辑 – 用 designMode 进行富文本编辑是在 IE 4 中被引入的,因为微软希望给 Hotmail 用户们一个更好的文本编辑体验。后来,在 IE 5.5 引入了 contentEditable,以用作一个更轻量级的进行富文本编辑的方法。随之而来的是可怕的 execCommand() 方法以及它的一些附属方法。不论好坏,这个富文本编辑的 API 已在 HTML5 中被标准化[19],而且目前已经被所有主流桌面浏览器以及移动 Safari 和 Android 浏览器所支持。

结论

尽管嘲笑 IE 很简单也很流行,但事实上,如果不是它所作的贡献,我们不会拥有我们目前所知的 web。如果没有 XMLHttpRequest 和 innerHTML web 会怎样?它们正是 web 应用的 Ajax 革命的催化剂,许多新的功能都是基于它们构建的。可笑的是当我们回望这个已经成为互联网上的「坏小子」的浏览器的历史,会发现没有它,我们不会处在今天所在的位置。

是的,IE 自身有瑕疵,但对于互联网的历史的绝大部分时间,它都是推动技术进步的浏览器。现在我们处在一个大规模浏览器竞争以及创新的时代,却很容易忘记我们从哪里一路走来。所以当你下次遇见正在做 IE 相关工作的人时,请别投去羞辱和番茄。相反,要谢谢他们帮助 IE 一路走到今天,也使 web 开发者成为世界上最重要的工作之一。

参考文档

1、innerHTML in HTML5

2、textContent in DOM Level 3

3、insertAdjacentHTML() in HTML5

4、Event Handlers on Elements (HTML5)

5、mouseenter (DOM Level 3 Events)

6、mouseleave (DOM Level 3 Events)

7、focusin (DOM Level 3 Events)

8、focusout (DOM Level 3 Events)

9、DOMParser interface (HTML5)

10、JavaScript Style Sheets (Wikipedia)

11、The CSS Saga by Håkon Wium Lie and Bert Bos

12、text-overflow property (CSS3 UI)

13、overflow-x and overflow-y (CSS3 Box)

14、word-break (CSS3 Text)

15、overflow-wrap/word-wrap (CSS3 Text)

16、Introduction to Filters and Transitions (MSDN)

17、Drag and Drop (HTML5)

18、Clipboard API and Events (HTML5)

19、User Interaction – Editing (HTML5)

 

英文原文:The innovations of Internet Explorer   编译:@justineo

本文转载自:http://blog.jobbole.com/25826/

小微
粉丝 117
博文 78
码字总数 81696
作品 0
海淀
程序员
私信 提问
加载中

评论(2)

小微
小微 博主

引用来自“诸葛非卿”的评论

我使用LINUX系统,使用火狐,CHROME,有空时痛骂WINDOWS但是,我从来没有小瞧过WINDOWS。虽然有些东西,我很讨厌,但是我从未否定他的成功之处!我不同于那些LINUXER们!
不过随着linux系统这些年的进步,我觉得WINDOWS已经处在一个即将被取代的年代,没有必要对WINDOWS过往过多的执着,就如LINUX系统强大,但是人们最终看到只是他的易用性一样。。如果LINUX如以前一样只适合少部分人,那么他就只能被极少一部分人所知。那就更谈不上使用问题了。

嗯,说得很对~我也觉得以前自己很倾向于人云亦云,以致过于武断了。多看多听多了解,自己的见识也增长了,理解也更加深刻了。
诸葛非卿
诸葛非卿
我使用LINUX系统,使用火狐,CHROME,有空时痛骂WINDOWS但是,我从来没有小瞧过WINDOWS。虽然有些东西,我很讨厌,但是我从未否定他的成功之处!我不同于那些LINUXER们!
不过随着linux系统这些年的进步,我觉得WINDOWS已经处在一个即将被取代的年代,没有必要对WINDOWS过往过多的执着,就如LINUX系统强大,但是人们最终看到只是他的易用性一样。。如果LINUX如以前一样只适合少部分人,那么他就只能被极少一部分人所知。那就更谈不上使用问题了。
红芯宣布完成 2.5 亿 C 轮融资,却被网友发现其浏览器安装包解压出 Chrome?

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢! 原文链接地址:红芯宣布完成 2.5 亿 C 轮融资,却被网友发现其浏览器安装包解压出 Chrome? 古代有四大发明是中国,在利益为上的...

IT人故事会
2018/08/17
0
0
苹果的 Safari 浏览器13岁了

外媒报道称,苹果前CEO史蒂夫·乔布斯(Steve Jobs)在2003年发布了号称“为Mac而创、迄今为止最快的浏览器”——Safari。四年后Safari浏览器再被引进iPhone上,为这个设备带来全新的移动浏览...

oschina
2016/01/09
2K
17
飞利浦收购锐珂医疗信息系统业务,补全放射产品版图

雷锋网消息,飞利浦收购锐珂的医疗信息系统业务协议已签署。尽管有关方面没有披露更多的财务细节,但交易已是板上钉钉。待相关监管机构批准后,交易预计将于今年下半年完成。届时,锐珂相关业...

王艺
03/11
0
0
IDEADATA中标平安人寿电商比价项目

     近日,北京爱狄特信息科技有限公司(IDEADATA)凭借在大数据领域领先的产品和技术、专业的解决方案规划能力、丰富的项目实施经验,成功中标中国平安人寿保险股份有限公司《平安人寿...

IDEADATA大数据视界
2017/09/29
0
0
首届中国科学院“率先杯”未来技术创新大赛在深圳正式启动

1月26日,第一届中国科学院 “率先杯”未来技术创新大赛在深圳宣布正式启动,大赛命题及大赛官网同步发布。中国科学院重大科技任务局副局长徐帆江,中国科学院项目管理中心主任周也方,军委科...

奕欣
2018/01/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部