- 简介
- 历史
- 历史(续)
- 历史(续二)
- 历史(续三)
- 检测 HTML5 特性
- 检测 HTML5 特性(续)
- 检测 HTML5 特性(续二)
- 检测 HTML5 特性(续三)
- 它的含义是什么?
- 它的含义是什么?(续)
- 它的含义是什么?(续二)
- 它的含义是什么?(续三)
- 它的含义是什么?(续四)
- 它的含义是什么?(续五)
- 绘图
- 绘图(续)
- 绘图(续二)
- 绘图(续三)
- 绘图(续四)
- 绘图(续五)
- Web 视频
- Web 视频(续)
- Web 视频(续二)
- Web 视频(续三)
- Web 视频(续四)
- 地理位置
- 地理位置(续)
- 本地存储
- 本地存储(续)
- 离线 Web 程序
- 离线 Web 程序(续)
- 表单
- 表单(续)
- 表单(续二)
- 可扩展性
- 可扩展性(续)
- 可扩展性(续二)
- 可扩展性(续三)
- 可扩展性(续四)
- 历史 API
检测 HTML5 特性
我们前面已经说过,HTML 5 不是一个全新的事物。你不能说诸如“我的浏览器不支持 HTML 5”之类的话。但是,你可以检测你的浏览器究竟支持 HTML 5 的哪些特性。下面,我们将介绍一下这种技术。当浏览器渲染 web 页面的时候,它会构造一个文档对象模型(Document Object Model,DOM)。这是一组用于表现页面上 HTML 元素的对象。每一个元素,例如每一个 <p>
,每一个 <div>
,每一个 <span>
都有不同的 DOM 对象表示。当然,也有一种全局的对象,例如 window 和 document,不过它们不是用来表示特定元素的。
所有的 DOM 对象都有一些通用属性,也有其自己特有的属性。支持 HTML 5 特性的浏览器就会包含这种独一无二的属性。因此,我们利用这种技术,就可以检测浏览器究竟支持哪些新特性。在本节的后面的部分中,我们将详细介绍这种技术。这种检测技术从易到难可以分为以下几种方式:
- 检测全局对象(window 或者 navigator)上是否存在特定的属性,例如检测是否支持 geolocation;
- 创建一个元素,然后检测这个元素是否包含特定的属性,例如对 canvas 的检测;
- 创建一个元素,然后检测这个元素是否包含特定的方法,然后调用该方法并检测其返回值,例如对视频格式的检测;
- 创建一个元素,然后检测是否能够给这个元素的某一属性设置某一特定值,最后再检测该属性值是否能够保持,例如对 <input> 类型的检测。
Modernizr —— HTML 5 检测库
Modernizr (官方站点可能已经被和谐…)是一个开源的,基于 MIT 协议的 JavaScript HTML 5 特性检测库。它能够检测很多 HTML 5 和 CSS 3 的特性。你可以在其主页或者这里的地址( modernizr-1.7.min.js ,注意修改后缀名)中找到最新版本(当前最新版本是 1.7)。同别的 JS 库一样,你应该在 head 块中将其引入:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Dive Into HTML5</title> <script src="modernizr.min.js"></script> </head> <body> ... </body> </html>
Modernizr 会自动运行,不需要调用类似 modernizr_init()
的函数。一旦开始运行,它就会创建一个名叫 Modernizr 的全局变量。这个全局变量包含它能够检测到的新特性的布尔值。例如,如果你的浏览器支持 canvas API,那么 Modernizr.canvas
就会是 true
;如果不支持则是 false
。
if (Modernizr.canvas) { // let's draw some shapes! } else { // no native canvas support available :( }
canvas
HTML 5 定义了 <canvas>
元素。这是一个“设备独立的位图画布,可以用于渲染图表、游戏图像或者其他可视图像”。在页面上 canvas 是一块矩形区域,你可以使用 JavaScript 语句在上面进行绘制。HTML 5 定义了一系列绘制函数(canvas API),用于绘制形状、定义路径、创建渐变或者应用变形等。
我们可以使用上面的 js 库检测 canvas API。如果你的浏览器支持 canvas API,DOM 对象就可以创建一个含有 getContext()
函数的 <canvas>
元素;如果不支持则仅仅会创建一个最原始的 <canvas>
元素,其中不包含任何 canvas 所特有的属性(记得这是 HTML 5 向后兼容的一种体现)。于是,我们利用这个特性,按照前面所说的第二种检测技术,就可以按照如下的方法检测 canvas 特性
function supports_canvas() { return !!document.createElement('canvas').getContext; }
这个函数将创建一个临时的 <canvas>
元素,但并不会将其显示到你的页面上,所以没有人会看到它。这个元素仅仅存在于内存中,哪里也不会去,什么也做不了,就像是静止的河流上面漂着的独木舟。
createElement('canvas')
语句就是用来创建这个对象的。然后,我们测试能不能调用 getContext()
函数。这个函数仅在支持 canvas API 的浏览器中才能使用。最后,我们用两个取非运算符 !! 将 getContext()
函数的返回值转换成 Boolean 值。
这个函数可以用来检测是否支持大多数 canvas API,包括形状、路径、渐变和填充等。它不会检测到任何在 IE9 之前版本的 IE 上的模拟库(由于 IE9 才能够支持 canvas API,在早于 IE9 的版本上有很多第三方库来在 IE 上模拟 canvas)。
如果你不愿意自己写函数,当然也可以使用 Modernizr 来检测 canvas API。
if (Modernizr.canvas) { // let's draw some shapes! } else { // no native canvas support available :( }
注意,这种检测仅仅用来检测形状、路径、渐变和填充等,如果要检测是否支持文本渲染,我们需要另外的方法。
canvas text
即使浏览器支持 canvas API,它也不一定支持 canvas text API。canvas text API 直到很晚的时候才被加入 HTML5,因此有些浏览器实际是在 canvas text API 完成之前就已经支持 canvas API。
当然,我们可以使用前面说的技术检测 canvas text API。前面说过,如果浏览器支持 canvas API,那么就可以创建一个表示 <canvas>
元素的 DOM 对象,并且能够调用 getContext()
函数;如果不支持,则会创建一个没有任何特殊属性的普通 DOM 对象。下面我们在此基础之上,使用上面所说的第二种检测技术,来检测 canvas text API。
function supports_canvas_text() { if (!supports_canvas()) { return false; } var dummy_canvas = document.createElement('canvas'); var context = dummy_canvas.getContext('2d'); return typeof context.fillText == 'function'; }
这个函数首先调用我们前面说过的 supports_canvas()
函数,来检测是否支持 canvas API。如果浏览器连 canvas API 都不支持,更不用谈 canvas text API 了!然后,我们创建一个临时的 <canvas>
元素,获取其 context
。这段代码一定是可以工作的,因为我们已经使用 supports_canvas()
判断过了。最后,我们检查是否存在 fillText()
函数。如果存在,则支持 canvas text API。
如果不想自己写代码,那么就使用 Modernizr 吧!
if (Modernizr.canvastext) { // let's draw some text! } else { // no native canvas text support available :( }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论