HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)
各浏览器对编码格式的支持情况
audio和video元素的属性介绍
1、src:媒体数据的URL地址
<video src="pr6.mp4"></video>
<video src="pr6.mp4" width="320" height="240"></video>
2、autoplay:是否自动播放
<video src="pr6.mp4" autoplay></video>
3、preload:是否预加载(有三个可选择的值)
4、poster:当视频不可用时,向用户展示一幅可以替代的图片
5、loop:是否循环播放视频或音频
<video src="pr6.mp4" preload loop></video>
6、controls:是否为视频或音频添加浏览器自带的播放用的控制条
<video src="pr6.mp4" controls></video>
7、error(只读属性):在正常情况下error属性为null,在发生错误的情况下error属性将返回一个MediaError对象,该对象的code返回对应的错误状态,如下图所示:
8、networkState(只读属性):在媒体数据加载过程中可以使用video元素或audio元素的networkState属性读取当前网络状态
9、currentSrc(只读属性):播放中的媒体数据的URL地址
10、buffered(只读属性):利用该属性返回一个对象,该对象实现TimeRange接口
11、readyState(只读属性):返回媒体当前播放位置的就绪状态
12、seeking(只读属性):如果浏览器正在请求数据,则为true 如果返回false则表示浏览器已停止请求
13、seekable(只读属性):返回一个TimeRanges对象,该对象表示请求到的数据的时间范围
14、currentTime:用来修改当前播放位置
15、startTime(只读属性):读取媒体播放的开始时间,通常为0
16、duration(只读属性):媒体文件总的播放时间
17、defaultPlaybackRate、playbackRate:用于读取或修改媒体默认的播放速率和当前播放速率
18、volume:播放音量(0为静音 1为最大音量)
19、muted:如果该值为true则表示处于静音状态,false为非静音状态
audio和video元素的方法介绍
1、play:播放媒体,自动将元素折paused属性值变为false
2、pause:暂停播放,自动将元素折paused属性值变为true
3、load:重新载入媒体进行播放,自动将元素的playbackRate属性值变为defaultPlaybackRate,自动将元素的error属性的值变为null
4、canPlayType:测试浏览器是否支持指定的媒体类型,该方法返回的值如下图所示
audio和video元素的事件介绍
Web Storage
cookie储存永久数据存在以下几个问题:
说说历史吧
大家都知道现在本地存储都已经应用非常广泛了,主要是因为各大浏览器都很好的支持了html5的这一特性
web storage分为两种:
1)sessionStorage:(临时保存)将数据保存在session对象中,也就是用户浏览器网站的这段时间内保存的数据
2)localStorage:(永久保存)保存在客户端本地的硬件设备中,即使浏览器被关闭,该数据仍然存在,下次打开浏览器访问网站时仍然可以继续使用(有一点需要注意的是,虽然数据是保存在客户端本地,但是如果说先使用a浏览器进行数据缓存的,如果用b浏览器来读取缓存下来的数据是访问不到的)
使用方法:
1)sessionStorage
2)localStorage
事实上还可以用如下的方式进行保存和修改
var storage = window.localStorage; //获得本地存储对象
storage["author"] = "angela"; //设置
var b = storage["author"] //获取
需要注意点:
1)保存时不允许重要保存相同的键名
2)保存后可以修改键值,但不允许修改键名
3)Local Storage只能存储字符串,任何值都会转成字符串的方式进行存储(这个时候就不免会使用JSON.stringify() 和 JSON.parse()这俩工具函数了)
4)storage事件最大的作用是跨页面监听
使用chrome控制台查看
本地存储事件监听:
storage事件可以很方便的监听本地存储是否改变(增、删)
window.addEventListener("storage",handle_storage,false);
window.attachEvent("onstorage",handle_storage);
function handle_storage(e){ e = e || window.event;}
事件e对象包含4个属性,如下表所示
当原源页面中的某一个页面对Storage数据进行添加或更新处理后,其余的同源页面只要注册Storage事件,就会触发事件。利用本地存在 的这个特性,可以减轻服务器的压力及数据的可访问性。
本地数据库
Web SQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范。它通过一套API来操纵客户端的数据库。HTML5的Web SQL Databases的确很诱惑人,可以用与sql查询一样的查询语句来操作本地数据库。
核心方法:
1、openDatabase:这个方法使用现有数据库或创建新数据库创建数据库对象。
var db = openDatabase('MyData', '1.0', 'My Database', 102400, function () { });
if (!db) {
alert("fail!");
} else {
alert("success!");
}
openDatabase方法打开一个已经存在的数据库,如果数据库不存在,它还可以创建数据库。几个参数意义分别是:
1)数据库名称。
2)版本号 目前为1.0,不管他,写死就OK。
3)对数据库的描述。
4)设置数据的大小。
5)回调函数(可省略)。
创建的数据库就存在本地,路径如下:C:\Users\angela\AppData\Local\Google\Chrome\User Data\Default\databases\http_localhost_*
2、transaction:这个方法允许我们根据情况控制事务提交或回滚。
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,message TEXT,time INTEGER)', []);
tx.executeSql('SELECT * FROM MsgData', [], function (tx, rs) {
removeAllData();
for (var i = 0; i < rs.rows.length; i++) {
showData(rs.rows.item(i));
}
});
})
3、executeSql:这个方法用于执行真实的SQL查询。
db.transaction(function (tx) {
tx.executeSql('INSERT INTO MsgData VALUES (?,?,?)', [name, message, time], function () {
alert('success');
}, function (tx, error) {
alert(error.source + ':' + error.message);
});
});
executeSql函数有四个参数,其意义分别是:
1)表示查询的字符串,使用的SQL语言是SQLite 3.6.19。(必选)
2)插入到查询中问号所在处的字符串数据。(可选)
3)成功时执行的回调函数。返回两个参数:tx和执行的结果。(可选)
4)一个失败时执行的回调函数。返回两个参数:tx和失败的错误信息。(可选)
下面看一个具体的例子,代码如下所示:
<script type="text/javascript">
var datatable = null;
var db = openDatabase('MyData1', '1.0', 'My Database', 102400, function () { });
function init() {
datatable = document.getElementById('datatable');
showAllData();
}
function removeAllData() {
for (var i = datatable.childNodes.length - 1; i > 0; i--) {
datatable.removeChild(datatable.childNodes[i]);
}
var tr = document.createElement('tr');
var th1 = document.createElement('th');
var th2 = document.createElement('th');
var th3 = document.createElement('th');
th1.innerHTML = '姓名';
th2.innerHTML = '留言';
th3.innerHTML = '时间';
tr.appendChild(th1);
tr.appendChild(th2);
tr.appendChild(th3);
datatable.appendChild(tr);
}
function showData(row) {
var tr = document.createElement('tr');
var td1 = document.createElement('td');
td1.innerHTML = row.name;
var td2 = document.createElement('td');
td2.innerHTML = row.message;
var td3 = document.createElement('td');
var t = new Date();
t.setTime(row.time);
td3.innerHTML = t.toLocaleDateString() + '' + t.toLocaleTimeString();
tr.appendChild(td1);
tr.appendChild(td2);
tr.appendChild(td3);
datatable.appendChild(tr);
}
function showAllData() {
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,message TEXT,time INTEGER)', []);
tx.executeSql('SELECT * FROM MsgData', [], function (tx, rs) {
removeAllData();
for (var i = 0; i < rs.rows.length; i++) {
showData(rs.rows.item(i));
}
});
})
}
function addData(name, message, time) {
db.transaction(function (tx) {
tx.executeSql('INSERT INTO MsgData VALUES (?,?,?)', [name, message, time], function () {
alert('success');
}, function (tx, error) {
alert(error.source + ':' + error.message);
});
});
}
function saveData() {
var name = document.getElementById('name').value;
var memo = document.getElementById('memo').value;
var time = new Date().getTime();
addData(name, memo, time);
showAllData();
}
</script>
<body onload="init()">
<table>
<tr>
<td>姓名:</td>
<td>
<input id="name" type="text" />
</td>
</tr>
<tr>
<td>留言:</td>
<td>
<input id="memo" type="text" /></td>
</tr>
<tr>
<td colspan="2">
<input id="btn" onclick='saveData();' type="button" value="保存" />
</td> </tr>
</table>
<table id="datatable" border="1">
</table>
<p id="msg"></p>
</body>
运行效果图如下所示:(大家可以试一下,其实用起来还是挺有趣的)
离线应用
离线应用应该是html5中的一个重大特色,好用而且简单。
离线应用(Offline Applications)与本地存储不同,“本地存储”存储的仅仅只是键值对的数据,而离线应用存储的是整个程序
<!DOCTYPE HTML>
<html manifest="myManifest.manifest">
<body>
...
</body>
</html>
使用示例:
CACHE MANIFEST
# angela 2015-06-21 这里特意写点注释以便下次我随意更改注释即可让页面更新离线应用
NETWORK:
*
CACHE:
test.js FALLBACK:
/ /offline.html
其中使用的时候需要注意以下几点细节:
1)允许在同一个manifest文件中重复书写同一个类别
2)如果文件开头没有指定类别而直接书写资源文件的话,浏览器会把这些资源文件被为CACHE类型,直到看到文件中第一个被书写出来的类别为止
3)当前应用manifest的页面会自动被缓存起来,所以无需要manifest文件中特意指定了
使用离线应用并不难,关键是理解离线应用的原理,也就是理解浏览器与服务器交互的过程,假设我现在要访问http://Lulingniu,引用《HTML5与CSS3权威指南》中的交互过程介绍如下:
也就是说服务器会先请求所有的资源文件并显示,之后再处理manifest文件,根据manifest文件的设置进行本地缓存
事实上当你的页面使用了离线缓存的话,在chrome浏览器控制台可以清楚的看到相应的离线文件
那接下来会有两种情况
1)manifest文件没有被修改(先直接使用本地缓存然后再向服务器请求manifest文件进行比较)
相应的,如果manifest文件没有被修改,在chrome控制台将会看到类似如下界面
2)manifest文件被修改过了(注意的地方是:即使资源文件被修改过了,更新过后的本地缓存中的内容还不能被使用,只有重新打开这个页面的时候才会使用更新过后的资源文件)
如果manifest文件被修改了,chrome控制台会显示类似如下所示:
离线应用相关方法及何时触发相关事件
applicationCache对象代表了本地缓存,可以用它来通知用户本地缓存中已经被更新,也允许用户手工更新本地缓存
1)当浏览器对本地缓存进行更新,装入新的资源文件时,会触发applicationCache对象的updateready事件,通知本地缓存已被更新
2)swapCache方法用来手工执行本地缓存的更新,当然这个方法只能在updateready事件中进行调用 ,不过需要注意的是即使调用了这个方法立刻更新了本地缓存,它们也会在重新打开页面时才生效
下面来说说applicationCache对象的事件
1)浏览器发现网页具有manifest属性,会触发checking事件
2)浏览器返回所有要求本地缓存的文件,会触发downloading事件,然后开始下载资源文件
3)在下载资源文件的同时,会周期性的触发progress事件
4)下载结束后会触发cached事件
5)如果任何与本地缓存有关的处理中发生错误的话,会触发error事件
6)当浏览器对本地缓存进行更新,装入新的资源文件时,会触发updateready事件,通知本地缓存已被更新
6)当重新打开页面时,如果manifest文件没有被更新,则会触发noupdate事件
application.status各状态含义如下:
var appCache = window.applicationCache;
switch (appCache.status) {
case appCache.UNCACHED: // UNCACHED == 0
return 'UNCACHED';
break;
case appCache.IDLE: // IDLE == 1
return 'IDLE';
break;
case appCache.CHECKING: // CHECKING == 2
return 'CHECKING';
break;
case appCache.DOWNLOADING: // DOWNLOADING == 3
return 'DOWNLOADING';
break;
case appCache.UPDATEREADY: // UPDATEREADY == 4
return 'UPDATEREADY';
break;
case appCache.OBSOLETE: // OBSOLETE == 5
return 'OBSOLETE';
break;
default:
return 'UKNOWN CACHE STATUS';
break;
};
HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)的更多相关文章
- Html5本地存储+本地数据库+离线存储
首先介绍什么叫存储: cache:通常把它叫做缓存,功能就是把从DB,或者磁盘拿出来的东西放在缓存里面,这样的话可以减少读取磁盘的IO. 磁盘文件:通常把一些图片或者一些视频都存放在磁盘上. 数据库: ...
- Sencha Touch 2 结合HTML5的本地存储创建数据库实现增、删、改、查
大家好!我是范范.本人刚接触ST2到现在刚刚两个月,6月1号接的项目,那时才知道有Sencha Touch2这个东西,到现在两个月了期间的幸酸就不说了.今天说说在项目中用到的HTML5的本地存储.可能 ...
- (原创)PouchDB 图片本地存储(web离线应用)
/* * 参数 * db: 已建或未建数据库 * pouchId: 数据库唯一的主键_id * src: 图片img的DOM对象 * bg: 判断是否是背景图 * */ function addTod ...
- 初学HTML5系列三:事件
Window 事件属性 针对 window 对象触发的事件(应用到 <body> 标签): 属性 值 描述 onafterprint script 文档打印之后运行的脚本. onbefor ...
- mfc 位图本地存储 本地位图读取显示
一.读取CImage //在绘图函数中直接使用参数pDC,无需定义 CDC* pDC = GetDC(): //读去位图路径,根据实际情况修改 CString loatImagePath = TEXT ...
- objective-c ios webkit 本地存储local-storage
我有一个Cocoa / Objective-C的应用程序,它嵌入了一个WebKit的web视图.我需要打开的数据库支持和本地存储.我知道这是可以做到-我有它在Safari中工作-但我无法找到如何设置这 ...
- 前端之本地存储和jqueryUI
本地存储 本地存储分为cookie,以及新增的localStorage和sessionStorage 1.cookie 存储在本地,容量最大4k,在同源的http请求时携带传递,损耗带宽,可设置访问路 ...
- web前端知识大纲:系列三 html篇
web前端庞大而复杂的知识体系的组成:html.css和 javascript 三.HTML 1.BOM BOM 是 Browser Object Model的缩写,即浏览器对象模型,当一个浏览器页面 ...
- Html5 学习系列(六)Html5本地存储和本地数据库
一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...
随机推荐
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- requirejs:性能优化-及早并行加载
为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串 ...
- 深入理解OOP(第一天):多态和继承(初期绑定和编译时多态)
在本系列中,我们以CodeProject上比较火的OOP系列博客为主,进行OOP深入浅出展现. 无论作为软件设计的高手.或者菜鸟,对于架构设计而言,均需要多次重构.取舍,以有利于整个软件项目的健康构建 ...
- Orchard搜索与索引
Orchard提供了索引与搜索的功能.开启Indexing属性可实现索引功能,伴随着一个特定的索引执行(默认包含基础搜索引擎).除了Indexing和Search提供查询索引的功能外(通过关键字或使用 ...
- 如何阻止SELECT * 语句
我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句.这个方法有很多弊端: 你从你的表里返回每个列,甚至后期加的列.想下如果你的查询里将来加上了VARCHAR(MAX ...
- Android几种打开SQLite的方法
第一种:用SQLiteOpenHelper辅助类 SQLiteOpenHelper类可以用来创建或打开数据库,两个关键的方法:onCreate(SQLiteDatabase db)和onUpgrade ...
- Android四大组件之Activity详解——传值和获取结果
废话不多说,先来看效果图 项目源码: http://download.csdn.net/detail/ginodung/8331535 程序说明: 在MainActivity中输入用户名和密码,然后提 ...
- Java的反射机制(Reflection)
反射机制 指可以在运动时加载.探知.使用编译期间完全未知的类 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够获取这个类的属性和方法:对于任意一个对象可以调用它的任意一个 ...
- ASP.NET杂谈-一切都从web.config说起(2)(ConfigSections详解-下)
还是接着上一篇说起,在上两篇中主要和大家探讨了ConfigSection的几种常用形式,并举例几个例子说明了一下.其实它们主要都是继承System.Configuration.Configuratio ...
- Android 自定义Activity基类与TitleBar
我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...