HTML5系列四(特征检测、Modernizr.js的相关介绍)
Modernizr:一个HTML5特征检测库
Modernizr帮助我们检测浏览器是否实现了某个特征,如果实现了那么开发人员就可以充分利用这个特征做一些工作
Modernizr是自动运行的,无须调用诸如modernizr_init()之类的初始化方法
Modernizr的官网地址http://modernizr.com/

在官网首页你就可以下载modernizr.js(它分两个版本Development和Production版本。其实它们都会导向同一个下载页面,只不过前者会帮我们把选项预先勾上而已。)

当我把下载的modernizr.js引用到页面中时(这时我什么也没做),看如下的图片就知道modernizr.js是自执行的
使用了Modernizr后,页面中渲染后的html代码是这个样子的:

其中有很多以no作为前缀的class,当然大部分都没有这个前缀。事实上,如果一个类名以no作为前缀,比如 no-touch 这表示浏览器不支持touch特性
modernizr还有一个test页面,大家可以在自己的浏览器里面打开这个test页面看看浏览器对于html5和css3的支持情况(据我所知chrome应该是对html5和css3支持最好的一个浏览器)
test页面的地址http://modernizr.github.io/Modernizr/test/index.html
HTML5特征检测(分别介绍使用JS原生方法检测及使用modernizr类库检测)
- 检测浏览器是否支持canvas API
/*
*@desc:检测浏览器是否支持canvas API
*/
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
if (Modernizr.canvas) {
//support
} else {
//not support
}
- 检测浏览器是否支持canvas 文本API
//浏览器支持canvas API并不意味着支持canvas文本API(原因是绘制文本的函数是后来才被纳入规范中)
/*
*@desc:检测浏览器是否支持canvas 文本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';
}
if (Modernizr.canvastext) {
//support
} else {
//not support
}
- 检测浏览器是否HTML5的video
/*
*@desc:检测浏览器是否HTML5的video
*/
function supports_video() {
return !!document.createElement('video').canPlayType;
}
if (Modernizr.video) {
//support
} else {
//not support
}
- 检测视频格式
//检测视频格式
/*
*@desc:检测Mac 和iPhone支持的受专利保护的格式
*/
function supports_h264_baseline_video() {
if (!supports_video()) {
return false;
}
var v = document.createElement('video');
return v.canPlayType('video/mp4;codecs="avc1.42E01E,mp4a.40.2"');
}
/*
*@desc:检测被Mozilla Firefox和其它一些开源浏览器 支持的开放视频格式
*/
function supports_ogg_theora_video() {
if (!supports_video()) {
return false;
}
var v = document.createElement('video');
return v.canPlayType('video/ogg;codecs="theora,vorbis"');
}
/*
*@desc:WebM(一种开源的视频编码格式) 检测被Chrome FireFox Opera支持的开放视频格式
*/
function supports_webm_video() {
if (!supports_video()) {
return false;
}
var v = document.createElement('video');
return v.canPlayType('video/webm;codecs="vp8,vorbis"');
}
if (Modernizr.video) {
//可以播放视频格式 但播放哪种格式的呢
if (Modernizr.video.ogg) {
} else {
if (Modernizr.video.h264) {
} else {
if (Modernizr.video.webm) {
}
}
}
} else {
//not support
}
- 检测浏览器是否支持本地存储
/*
*@desc:检测浏览器是否支持本地存储
*/
function supports_local_storage() {
return ('localStorage' in window) && window['localStorage'] != null;
}
if (Modernizr.localstorage) {
//support
} else {
//not support
}
- 检测浏览器是否支持web worker
/*
*@desc:检测浏览器是否支持web worker
*/
function supports_local_storage() {
return !!window.Worker;
}
if (Modernizr.webworkers) {
//support
} else {
//not support
}
- 检测浏览器是否支持离线web应用
/*
*@desc:检测浏览器是否支持离线web应用
*/
function supports_offline() {
return !!window.applicationCache;
}
if (Modernizr.applicationcache) {
//support
} else {
//not support
}
- 检测浏览器是否支持地理定位
/*
*@desc:检测浏览器是否支持地理定位
*/
function supports_geolocation() {
return !!navigator.geolocation;
}
if (Modernizr.geolocation) {
//support
} else {
//not support
}
- 检测浏览器是否支持占位文本
/*
*@desc:检测浏览器是否占位文本
*/
function supports_input_placeholder() {
var i = document.createElement('input');
return 'placeholder' in i;
}
if (Modernizr.input.placeholder) {
//support
} else {
//not support
}
- 检测浏览器是否支持web worker
/*
*@desc:检测浏览器是否支持自动聚焦
*/
function supports_input_autofocus() {
var i = document.createElement('input');
return 'autofocus' in i;
}
if (Modernizr.input.autofocus) {
//support
} else {
//not support
}
还有很多,这里就不一一介绍了,总之,通过上面的特征检测可以知道,用modernizr.js更加方便,使用原生的方法相对来说会要复杂一些。
细说modernizr.js
Modernizr帮助我们检测浏览器是否实现了某个feature,如果实现了那么开发人员就可以充分利用这个feature做一些工作,反之没有实现开发人员也好提供一个fallback。
举例来说,当我们引入了Modernizr.js类库后, <html> 标签的class属性就会被相应的赋值,以显示浏览器是否支持某类CSS属性。比如在IE6下面,不支持boderradius特性,那么在 <html> 标签中就会出现 no-borderradius 类,我们可以做一些fallback的工作:
.no-borradius div{
/*-- do some hacks here --*/
}
上面我们已经介绍了,检测浏览器是否支持某项特性,我们可以用这种语法:
Modernizr.featuretodetect
再举一个通常的例子
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.1.min.js">\x3C/script>')</script>
一般我们都会这样加载jQuery类库,先从Google CDN上拿,如果没拿到再加载本地的。
Modernizr.load()根据一些条件判断来动态选择加载CSS和JavaScript,这无疑对避免不必要的资源加载有极大的帮助。
那么上面的例子可以用Modernizr.load写成如下所示
Modernizr.load([
{
load: '//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js',
complete: function () {
if ( !window.jQuery ) {
Modernizr.load('js/libs/jquery-1.7.1.min.js');
}
}
},
{
// This will wait for the fallback to load and
// execute if it needs to.
load: 'needs-jQuery.js'
}
]);
事实上Modernizr.load最简单的语法如下所示:
Modernizr.load(
test: Modernizr.webgl,
yep : 'three.js',
nope: 'jebgl.js'
);
也就是当浏览器支持WebGL的时候,就引入 three.js 这个类库做一些3D效果。浏览器不支持WebGL的时候可以使用 jebgl.js 做一些fallback操作。
有兴趣可以去官网看看具体API
HTML5系列四(特征检测、Modernizr.js的相关介绍)的更多相关文章
- HTML5系列四(WebWorker、地理定位)
WebWorker简单应用 先从一个简单例子说起,计算数值加法 <script> var worker = new Worker('sumCalculate.js'); worker.on ...
- SaltStack系列(三)之state相关介绍
一.管理对象 saltstack系统中管理对象叫做Target,在master上可以采用不同的Tatget去管理不同的minion.这些Target都是通过去管理和匹配Minion的ID来做一些集合. ...
- Modernizr.js:为HTML5和CSS3而生!
原文链接:http://caibaojian.com/modernizr-js.html modernizr这个JS,在国外的主题里面很多地方都看到,就只记得是为html补充的,有点类似与respon ...
- Modernizr.js入门指南(HTML5&CSS3浏览器兼容插件)
HTML5 和 CSS3 的快速发展,给我们带来了极大的便利,比如从此再也不用花费大量的时间只是为了设计一个圆角的效果. 但是!我们不能像控制机器一样来控制所有的人都一夜之间升级到现代浏览器,因为那些 ...
- 转:arcgis api for js入门开发系列四地图查询
原文地址:arcgis api for js入门开发系列四地图查询 arcgis for js的地图查询方式,一般来说,总共有三种查询方式:FindTask.IdentifyTask.QueryTas ...
- 前端的瑞士军刀:Modernizr.js
前言 Modernizr.js既能给老版本浏览器打补丁,又能保证新浏览器渐进增强的用户体验. 作用: 从实际操作来看,Modernizr默认做的事情很少,除了(在你选择的情况下)给不支持html5的标 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- LayaAir引擎开发HTML5最简单教程(面向JS开发者)
LayaAir引擎开发HTML5最简单教程(面向JS开发者) 一.总结 一句话总结:开发游戏还是得用游戏引擎来开发,其实很简单啦 切记:开发游戏还是得用游戏引擎来开发,其实很简单,引擎很多东西都帮你做 ...
- 前端构建大法 Gulp 系列 (四):gulp实战
前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...
随机推荐
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- Laravel如何优雅的使用Swoole
背景 正在做一个智能家居的项目(钱低的吓死人怎么办),接收下位机(就是控制智能家居硬件模块的HUB)协议解析,Web端维护硬件状态,利用APP交互.由于下位机数据是发送到服务器的XXX端口,所以必须对 ...
- 项目分享二:APP 小红点中数字的处理
小红点,是 APP 中最常见的一个功能,我们先来看一下面的案例,下图中,待评价的商品有 2 个,点击“评价晒单”按钮进行评价后,那么待评价数量应该变成 1,那么这个功能是如何去实现的呢? 一般来说,实 ...
- css+div 浮动分块
前段时间学过几天html,只是怀着了解的态度,能够读懂别人的页面,能够扒现成就行,一直没有自己动手去实践过,其实也不是没有实践过,前段时间扒了一个网页,想按照自己的要求来改,可后果是越改越乱.今天心血 ...
- (二十三)原型模式详解(clone方法源码的简单剖析)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...
- 基于Html5缓存的页面P2P技术可行性探讨
P2P技术,在分享大文件(你懂的)是现在必不可缺的技术,现在的人,已经很难想象在没有这玩意的互联网早期,人们是怎样的艰难求生.想当年,不要说电影,下一个稍大点的文件,都是很吃力的事情. 后来牛人科恩, ...
- iostat命令详解
iostat iostat用于输出CPU和磁盘I/O相关的统计信息. 命令格式: iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ devic ...
- 59-chown 简明笔记
改变文件的所有者或与文件相关联的组 chown [options] owner file-list chown [options] owner: group file-list chown [opti ...
- [转]Java中怎样判断一个字符串能否转成数字
原文地址:http://blog.sina.com.cn/s/blog_7bac470701014mjf.html 判断字符串是否为数字 //1.正则表达式 public static boolea ...
- jsp内置对象作业1-用户登录
题目:编写一个jsp程序,实现用户登录,当用户输入的用户名或密码错误时,将页面重定向到错误提示也,并在该页面显示30秒后,自动返回到用户登录页面. 1.用户登录页面 <%@ page langu ...