2019独角兽企业重金招聘Python工程师标准>>>
HTML5 有许多激动人心的特性,有了新的标签、新的CSS 能力和新的JavaScript API,Web 的能力范围有了大的飞跃。除了浏览器厂商的士气高涨之外,令人激动的新功能列表几乎每天都在增加。从“nightly builds”(每夜都构建一版)到开发渠道发行版和正常的平台预览版,浏览器在飞速变化,世界各地Web 开发人员们正在加入这个狂欢。
但是,尽管开发和浏览器社区正在把HTML5 的喧嚣推到一个极度兴奋的高潮,网上的大多数人却不像我们一样使用最新的浏览器和最新版本。如果你是一个大型开发机构的Web 开发人员或者是拥有庞大用户群的大企业,那你对此可能很清楚。即使你为通过Web 提供服务的小型机构或新创立的企业工作,你可能也要花上大量时间来确保自己的网站能够支持尽可能多的浏览器和浏览器版本。
基于这一现实,很容易看出,HTML5 还谈不到它是否已为当今的使用做好准备,而是你是否为它做好了准备。例如,假设你用一些新的语法标签(例如和)新建了一个页面,添加了一些新的CSS 功能,例如圆角(border-radius)和阴影(box-shadow),甚至添加了一个元素在页面上绘制出一个HTML5 标识。
在较新的浏览器上,例如Internet Explorer 9、Firefox 4 及以上版本、或者Google Chrome上,这个页面的显示如图1 所示。但如果尝试在Internet Explorer 8 或更早的浏览器上加载页面,很有可能看到的是图2 所示的效果:一个残缺不全的页面。
1 小时前 上传
下载附件 (77.97 KB)
如果你在研究HTML5 的所有强大功能却得到上述体验之后告诉自己说:最好还是等等,那么我不会对你有任何责怪。如果我问你准备好了吗?你很容易得出这样的结论:HTML5 还没有为你或你的用户做好准备。
在你决定等到2022 年再考虑HTML5 的之前,我建议你继续阅读本文的后面部分,我将向你提供一些实用的策略,让你现在就能采用HTML5 技术,同时避免出现图2 所示的糟糕的降级情况。我将从下面三个主题进行详细地介绍:
•功能检测与用户代理(UA)嗅探比较
•用 JavaScript 实现填补(Polyfill)
•优雅降级
这些应该可以教会你很多构建支持各种浏览器的网站所需要了解的知识。在本文结束时,你会拥有一个可靠的策略,可以充满自信、毫不犹豫地采用HTML5 技术。你还会拥有一些工具在手,可以逐步地为新浏览器增强网站,同时更好地适应旧的浏览器。因为HTML5 的采用策略就是一个浏览器也不放弃。
一、功能检测的重要性
为了提供跨浏览器的稳定且一致的体验,开发人员经常需要获得一些关于用户浏览器的信息。以前的普遍做法是像下面这样用JavaScript 检测这些信息:
- varuserAgent = navigator.userAgent;
- if (userAgent.indexOf('MSIE') >= 0) {
- console.log("Hello, IE user");
- } else if (userAgent.indexOf('Firefox') >= 0) {
- console.log("Hello, Firefox user");
- } else if (userAgent.indexOf('Chrome') >= 0) {
- console.log("Hello, Chrome user");
- }
复制代码
这个技术称为用户代理(UA)嗅探,广泛地用于判断正在请求页面的是哪个浏览器。这里的思路是:知道了用户的浏览器(例如IE7),就能在运行的时候决定启用或禁用网站的哪项功能。UA 嗅探就相当于对浏览器说:“你是谁?”(对UA 嗅探以及其他检测技术的深入分析,请参阅http://t.cn/zOi5m72)
这种做法的问题在于,浏览器会撒谎。UA 字符串是一个用户可以配置的信息,并不会提供100%正确的浏览器信息。而且,随着这一技术的广泛采用,许多浏览器厂商在自己的UA 字符串中增加了额外内容,用来欺骗脚本,让脚本对于实际使用的浏览器做出错误判断,从而避免检测。现在有些浏览器甚至提供小工具,允许用户只要轻轻点击几下鼠标,就能修改UA 字符串。
UA 嗅探的目的从来就不是确定用户的浏览器和版本。而且它肯定也不是为了在你不喜欢用户使用的浏览器时,让你可以告诉用户说“请下载另一个浏览器”——即使有些人就是这样使用UA 嗅探技术的。用户有权选择自己使用什么浏览器,开发人员的职责则是提供最可靠且一致的体验,不要把浏览器的偏好强加给用户。UA 嗅探的目标是让你能够准确地了解在用户当前的浏览器中,有哪些能力或功能可以利用。对浏览器本身的了解,只是获得这些信息的一个途径。目前有一些UA 嗅探的替代技术,其中一项正在日益流行的技术称为对象检测或功能检测。这两个术语多数时候可以互换使用,但本文统一使用“功能检测”(feature detection)。功能检测的目标是判断某项功能或能力在用户当前的浏览器中是否受支持。如果UA 嗅探是问浏览器“你是谁”,“功能检测”就是问浏览器“你能干什么”,这个问题更直接,对于根据条件向用户提供功能来说,这种方法也更可靠。如果功能检测脚本实现正确,用户或浏览器将很难造假或错报功能支持。
二、手动功能检测
那么,与UA 嗅探的示例相比,功能检测到底是什么样呢?为了回答这个问题,我们先来看看如果在Internet Explorer 8 中查看前面的HTML5 页面(如图1 所示),如何解决出现的问题。这个页面的标签内容如代码段1 所示。
My Awesome Site - body { font-size: 16px; font-family: arial,helvetica,clean,sans-serif; }
- header h1 { font-size: 36px; margin-bottom: 25px; }
- article
- {
- background: lightblue;
- margin-bottom: 10px;
- padding: 5px;
- border-radius: 10px;
- box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.5);
- }
- article h1 { font-size: 12px; }
- 37
My Awesome Site
An Article
Isn't this awesome?