| 文件API FileList对象上传文件信息、FileReader()文件读取对象、FormData()异步上传文件
| 拖放API
| 离线应用 manifest
| postMessage 跨文档消息传送
| webScoket
| 本地存储localStorage、sessionStorage
| 多线程 web workers
| 获取地理位置 geolocation
| video、audio
| canvas绘图
| History 历史管理
新增语义类标签
1、header: 用于头部
2、footer: 用于页尾
3、nav: 用于导航
4、aside: 侧边栏,放置导航性质的内容
5、section: 文档的区块
6、article: 文章的独立主体
7、hgroup: 标题元素进行组合
8、details: 展示和隐藏文档的细节
<details>
<summary>Copyright 2011.</summary> // 标题,默认【详细信息】
生成于比比1
</details>
9、abbr: 标签用来表示缩写
10、blockquote:
<blockquote>
Here is a long quotation here is a long quotation here is a long quotation
here is a long quotation here is a long quotation here is a long quotation
here is a long quotation here is a long quotation here is a long quotation.
</blockquote>
11、time: 日期
12、figure, figcaption: 用于图表和标签的结合
<figure>
<img src="https://.....440px-NeXTcube_first_webserver.JPG"/>
<figcaption>The NeXT Computer used by Tim Berners-Lee at CERN.</figcaption>
</figure>
13、dfn:
14、s: 用于电商商品的打折 <s>¥5000000</s>
如果老浏览器对新增HTML5元素不使用JS来创建元素:
document.createElement('article')
公用属性
1、draggable: 可拖拽 <section draggable='true'></section>
2、contenteditable: 可以直接编辑页面的内容
表单类
一、input元素新增类型
1、search: 用于搜索关键词 <input type="search" vlaue="" >
2、email: 需要输入正确的电子邮件地址 <input type="email" vlaue="" >
3、number: 只能输入数字,配合min、max属性
4、range: 数值范围
<input type="range" name="points" min="-360" max="360" class="rang" id="lateZ" />
事件: onchange: 触发后执行,只触发一次 oninput: 最真实触发,拖动就触发
5、tel: 点击只提供数字键盘
6、url: 输入url
7、pattern: 正则表达式 <input type="email" pattern="[^ @]*@[^ @]*" value="">
二、input元素属性:
1、readonly 只读
2、disabled 不可用
3、autocomplete: 自动完成功能就是输入过的内容会被缓存,下次在触发这个文本框会有下拉菜单的提示之前的输入,值为on或off
4、placeholder: 内容为空时的提示 <input type="text" placeholder="请输入用户名">
5、autofocus: 指定控件自动获取焦点 <input type="text" autofocus >
6、require: 如果该元素为空,则无法提交表单 <input type="text" required />
邮件链接: <a href="mailto:cxz@126.com">发送邮件</a>
电话链接: <a href="tel:15012345678">打电话</a>
dataList数据列表
通过数据列表来实现自动补全的功能
<form action="/server" method="post">
<input list="jslib" name="jslib">
<datalist id="jslib">
<option value="jQuery">
<option value="Dojo">
<option value="Prototype">
<option value="Augular">
</datalist>
<input type="submit" value="完成" />
</form>
文件API
FileList、FileReader()、FormData() 对象
一、FileList对象、File对象: 读取本地文件
HTML4: <file>控件内只允许放置一个文件,HTML5: 加入multipe属性,允许file添加多个文件
Example:
<input type="file" id="fileLoad" />
<input type="file" id="fileLoad" multiple /> // mutiple 可以进行多个文件的选取
<script>
oUpFile.onclick = function(){
var oFileLoad = document.querySelector('#fileLoad').files[0]; // 返回的是FileList对象列表
for(var k in oFileLoad){
console.log(k, oFileLoad[k]);
}
}
</script>
FileList返回:
{
name: f82f4a858d04d0a68f52.jpg, // 文件名
lastModified: 1462944176000, // 最后修改日期
lastModifiedDate: Wed May 11 2016 13:22:56 GMT+0800 (CST),// 最后修改日期
webkitRelativePath,
size: 554902, // 文件大小
type: image/jpeg // 文件名型
}
https://segmentfault.com/a/1190000004084956
二、FileReader() 文件读取对象
FileReader() 将文件读入内存,并且转成不同类型(二进制、DataURL、文本)
方法:
1、readAsBinaryString: 将文件读取为二进制码
2、readAsDataURL: 将文件读取为DataURL,一段是以data:开头的 Base64位图片编码
3、readAsText: 将文件读取为文本,第2个参数为编码类型,默认为UTF-8
4、abort: 中断读取
Example:
let oFile = document.querySelector("oFile").files[0]; // 返回FileList对象
let reader = new FileReader(); // 创建FileReader()对象读取文件
reader.readAsDataURL(oFile); // 将文件以什么格式读入页面
reader.onload = function(e){
$("#oimg").attr('src', e.target.result); // e.target.result 来获取文件的格式
$("#fileText").text(e.target.result);
}
三、FormData() 对象
FormData()可以异步上传二进制文件, 只能传文件、图片的二进制等
<form>表单的enctype属性有三个值:
1、application/x-www-form-urlencoded: 用来设置表单传输,默认也是这个值,所以form中不写enctype属性也是按这个默认去传的
2、multipart/form-data: 用来传输图片或MP3等文件, 会以request payload提交数据
3、text/plain: 用于传输文本,邮件用此编码
API:
1、创建FormData , var formData = new FormData('表单名')
2、get(key): 获取存储的字段的值
3、append(key, value): 存储字段
4、set(key, value): 修改值
5、has(key): 判断是否存已经有了key
6、delete(key): 删除数据
7、formData.entries(): 遍历FormData
8、next(): 遍历时所用下一个节点数据,如果没有返回undefined
9、发送数据: 通过XHR
var xhr = new XMLHttpRequest();
xhr.open('post', 'login');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(formData);
Example:
<form id="upFileForm" method="post" enctype=”multipart/form-data”>
<input type="file" name="file" id="upFile">
<input type="button" id="upFile" value="上传">
</form>
<script>
let from = document.querySelector('#upFileForm')[0];
let uploadFile = document.querySelector("#upFile");
let formData = new FormData(from);
formData.append('file', uploadFile.files[0]);
console.log(formData)
$.ajax({
url: '/remittanceDetail/import',
type: "post",
data: formData,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
success: function(res) {
console.log('err', res)
},
error: function(res){
if(res == 0){
console.log('err', res)
}
console.log('err', res)
}
});
</script>
https://segmentfault.com/a/1190000002680797
https://segmentfault.com/a/1190000006716454
http://www.cnblogs.com/lhb25/p/html5-formdata-tutorials.html
ArrayBuffer
ArrayBuffer是一段连续的长度固定的字节序列,如:通过实例化ArrayBuffer对象在内存中创建一段二进制存储空间(或叫二进制缓冲区),
// 创建一段字节长度为8的内存空间
var buffer = new ArrayBuffer(8);
// 获取字节长度
console.log(buffer.byteLength); // 8
Blob对象
处理对二进制的方法,通过Blob来操作二进制数据
var abc = new ArrayBuffer(80); // ArrayBuffer ES6用来在内存中存一段二进制数据
var blob = new Blob([abc], {type: 'text/plain});
方法:
1、slice(): 将大文件分片,用于分片上传
https://www.cnblogs.com/hhhyaaon/p/5928152.html
https://github.com/eligrey/FileSaver.js
拖放API
拖放过程由两个部分构成:
被拖拽的元素,之后简称为子项(item)
放置被拖拽元素的元素,之后简称为容器(container)
1、draggable属性: 将想要拖放对象元素加入引属性设置为true
2、拖放事件:
子项事件:
1)dragstart - 拖拽开始
2)drag - 拖拽过程中不断触发
3)dragend - 拖拽结束,无论有没有拖进容器( 鼠标松开就触发 )
容器事件:
1)dragenter - 子项进入容器范围
2)dragover - 子项在容器范围内不断触发
3)dragleave - 子项离开容器范围
4)drop - 拖拽结束,且子项成功拖进容器
Example:
<script>
var oBox = document.querySelector('#box'); // 容器
var oDragBlcok = document.querySelector('#dragBlcok'); // 拖拽块
oDragBlcok.addEventListener('dragstart', function(e){
e.dataTransfer.setData('name', 'siguang');
})
oDragBlcok.addEventListener('dragend', function(e){
var name = e.dataTransfer.getData('name');
console.log(name);
})
</script>
3、拖拽事件对象
e.dataTransfer: 拖拽文件的信息
files: FileList对象,相当于input的type="file"的内容
astModified:1494234931000
lastModifiedDate:
Mon May 08 2017 17:15:31 GMT+0800 (CST)
name:"chongwutupianxiaotuxiaom.jpg"
size:20926type:"image/jpeg"
webkitRelativePath:""
4、DataTransfer对象: 拖拽时需要传递一些数据,DataTransfer就可以来对数据进行传输,绑定在拖放事件的Event中
1)dataTransfer.items: 一个数据集合
2)dataTransfer.setDragImage(element, x, y): 拖拽过程中定义一个元素替换原有的,可以看到拖拽元素跟随的效果。
3)dataTransfer.setData(key, val): 添加自定义数据
4)dataTransfer.getData(key): 获取自定义数据
5)dataTransfer.clearData(): 清除自定义数据
6)dataTransfer.getData(format): 播放文件列表
离线应用
在没有网络的情况下,可以使用本地缓存的离线数据也可以使web应用运行进来
1、离线与缓存的区别
两都都是为了更好的缓存各种文件以提高读取速度,两者对网络环境有要求:
1、网页缓存依赖有网络的情况,离线应用在离线下仍然可用
2、网页缓存主要缓存当前页面的内容,离线应用是缓存的指定文件,在离线状态下仍可以访问
2、manifest([ˈmænəˌfɛst]显示)文件
通过manifest文件来管理哪些文件需要缓存
设置完后所有本地缓存的文件存储到Application Cache中,如果段网时在Network中查看缓存的文件为(from cache)
offline.manifest:
CACHE MANIFEST // 必要,把文件的作用告诉给浏览器,让文件支持text/cache-manifest
#Version 1.0
CACHE: // chche,指定需要被缓存的资源,浏览器会对这些设置的资源
index.html
style.css
images/2.jpg
default.js
NETWORK: // 指定不进行缓存的资源,如果为“*”通配符,表示所有资源都不被缓存
# 1.jpg
images/1.jpg
FALLBACK: // 每行指定两个资源,如果
/js/test/index.html /js/test/404.html
3、需要在html页面中的<html>标签加入manifest="offline.manifest"
<html lang="en" manifest="offline.manifest">
4、applicationCache对象
1)检测是否支持离线应用
if(window.applicationCache){
// 支持
}
2)属性:
applicationCache.status返回: 离线缓存状态
0: 无缓存
1: 闲置
2: 检查中
3: 下载中
4: 更新完成
5: 废弃
3)事件:
checking: 检查缓存更新时;
error: 检查更新或下载资源时发声错误
noupdate: 描述文件无变化
downloading: 开始下载应用缓存资源
progress: 下载缓存资源过程中
updateready: 下载完毕
cached: 应用缓存完整可用时
applicationCache.addEventListener('updateready', function(){ // 资源下载中 }, false)
4)applicationCache.update(): 让离线缓存检查更新上面的事件
5、检测是否有网络 online 和 offline
// navigator.onLine如果设置为true表示能上网
if (navigator.onLine) {
// statement if online
} else {
// statement if offline
}
// 侦听当网络变化的时候触发
window.addEventListener('online', function(){
console.log('在线');
}, false);
window.addEventListener('offline', function(){
console.log('离线');
}, false);
postMessage() 跨文档消息传输
HTML5来进行两个不同跨域的页面来消息传递(iframe不同域)
1、postMessage('发送数据', 要发送到的URL): 发送消息
2、message: 事件来接收消息,其中event对象
evt.origin: 发送消息所在的域
evt.data: 接收到的数据
evt.source: 向来源可以在回执信息
Example:
<iframe id="myframe" src="originPage.html"></iframe>
<button id="sendBtn">发送消息</button>
<script>
// 接收originPage.html页面消息
window.addEventListener('message', function(evt){
// ev.origin 获取消息的URL,如果不是taobao就不执行
if(ev.origin != "http://www.taobao.com"){
return false;
}
// ev.data 传输的数据
alert("那里传来的消息: " + ev.data)
}, false);
// 向originPage.html页面 发送消息
var oSendBtn = document.querySelector('#sendBtn');
oSendBtn.onclick = function(){
var iframWindow = document.querySelector('#myframe');
// postMessage()
iframWindow.postMessage("A secret", "http://www.w3cmm.com"); // window.parent.postMessage(data,'*');
}
</script>
iframe的父子窗口操作:
iframe获取父窗体的元素: window.parent.xxxx
如果iframe嵌套多层,直接获取最顶层的窗体 window.top.xxxx
父窗体获取iframe内的元素: oIfr.contentWindow.document.body.offsetHeight
webSocket
webScoket提供了浏览器和服务器之间的长链接通信,只有一方提出断开socket才会断开,否则使终链接状态
传统使用Ajax轮询来定时获取服务器的数据,缺点是每隔一断时间就需要请求一次服务器,都需要创建一次TCP和断开一次TCP连接,HTTP请求,会对服务器有压力,
使用webScoket就可以省去连接的步聚,客户端可以一直侦听服务器端推送的数据来进行处理就可以了.
创建WebSocket对象 var oWebSocket = new WebSocket('ws://192.168.1.1:8005/socket');
属性:
1、readyState: 获取socket的状态 ["正在连接", "已建立连接", "正在关闭连接", "已关闭连接"]
方法:
1、send(data): 向服务器发送数据
2、close(): 关闭socket连接
事件:
1、onmessage(): 接收服务器发送的消息
2、onopen(): 侦听打开socket
3、onclose(): 侦听关闭socket时
示例:
<script>
var statusArr = ["正在连接", "已建立连接", "正在关闭连接", "已关闭连接"];
var oSocket = new WebSocket("ws//www.baidu.com:8089"); // 必须使用ws或wss开头
// 侦听socket打开事件
oSocket.onopen = function(evt){
console.log(statusArr[oSocket.readyState]);
}
// 侦听socket关闭
oSocket.onclose = function(evt){
console.log(statusArr[oSocket.readyState]);
}
// 侦听接收服务器端传来的数据
oSocket.onmessage = function(evt){
var data = evt.data;
console.log(data);
}
// 向服务器发送数据
$("#box").click(function(){
oSocket.send("向服务器发送数据")
})
// 断开与服务器的socket连接
$("#close").click(function(){
oSocket.close();
})
</script>
本地存储 localStorage、sessionStorage
本地存储与cookie的区别
cookie: 存储量比较少(浏览器不同,大致4k),有个数限制,会随请求发送到服务器
localStorage: 永久存储,每个域存储(Chrome是2.6MB,IE是5MB),总体数量无限制
sessionStorage: 只在session内有限,存储没有限制
方法:
1、setItem(key, value): 保存数据
2、getItem(key): 获取数据
3、clear(): 清空存储中的所有数据
4、removeItem(key): 删除存储中的一项
5、key(n): 返回存储中的第n个键名
length: 返回存储数量
监听:
window.addEventListener('storage', showStorageEvent, false);
web Workers 多线程
js是单线程,页面有大量计算就很容易阻塞页面的执行,H5可以使用web workers来处理.
创建web workers对象: new Worker('work.js');
方法:
1、postMessage(data): 向web workers传送数据
事件:
1、onmessage(): 监听处理完发送的数据
2、onerror(): 错误时处理的事件
Example:
main.js:
var oWorker = new Worker('js/worker.js');
oWorker.postMessage(1000000); // 发送要处理的数据
oWorker.onmessage = function(ev){
var od = ev.data; // 接收处理完的值
}
worker.js
onmessage = function(ev){ // 侦听传来的数据
var od = ev.data;
var num = 20;
for(var i=0; i<od; i++){
num *= i;
}
postMessage(num); // 多处理处理完返回的数据
}
注意:
1、多线程必须要在服务环境下进行开发,否则会报错
2、处理线程的JS文件,没有window,document,DOM等对象。但是可以使用navigator,location,XMLHttpRequest等对象。
这些限制导致了Web Worker一般用于有耗时较长的业务中,比如有大量计算的页面
Geoloation 地理位置
处于安全考虑,地理位置信息属于用户隐私,当浏览器获取设备信息需要得到用户的确认
检测是否可以使用:
if(navigator.geoloation){
// 支持地址位置信息
}
一、Geoloation方法:
1、getCurrentPosition( // 首次取得当前地理位置
function(position){
// 返回坐标回调 position对象
pos.latitude
},
function(error){
// 错误显示
},
{对象用来处理如何获取位置}
}
2、watchPosition(): 监听不断变化的移动设备,原理与steInterval差不多,用法与getCurrentPosition一样也是三个参数
3、clearWatch(): 删除监听watchPosition()
Example:
navigator.geoloation.getCurrentPosition(function(pos){
// pos.coords.latitude; // 当前纬度
})
二、position对象: 获取地理位置成功后返回position对象
属性:
1、latitude: 纬度
2、longitude: 经度
3、altitude: 海拔
4、accuracy: 纬度或纬度的精度(以米为单位)
5、altitudeAccurancy: 获取到海拔高度的精度(以米为单位)
6、heading: 设备前进方向,以旋转角度来表示
7、speed: 设备前进的速度(以米/秒为单位)
8、timestamp: 获取地理位置信息的时间
错误返回三种值: 1 = 用户拒绝了位置服务、 2 = 获取不到位置信息、3 = 获取信息超时错误
timeout: 几秒后获取不到返回失败
maxmumAge: 对地理位置 进行缓存的有效时间(毫秒)
Example:
<script>
var oBox = getId("box");
var sHtml = [];
function getId(id){
return document.getElementById(id);
}
function successFun(position){
console.log("地理位置是: " +position.coords.latitude+","+position.coords.longitude);
}
function errorFun(err){
// console.log(err.message); // 错误信息
// console.log(err.code); // 错误码
switch(err.code){
case 1:
alert("用户拒绝了位置服务");
break;
case 2:
alert("获取不到位置信息");
break;
case 3:
alert("获取信息超时错误");
break;
}
}
// 创建geolocation对象
function createGeolocation(){
if(navigator.geolocation){ // 标准浏览器支持
// 获取坐标
navigator.geolocation.getCurrentPosition(successFun, errorFun, {
// 设置缓存有效时间为2分钟
maximumAge : 60*1000*2,
// 5秒内未获取到地理位置则返回错误
timeout : 10000
})
}
else{
alert("你使用的是非标准浏览器");
}
}
createGeolocation();
</script>
http://www.alloyteam.com/2015/08/mobile-phone-location-on-the-sensor/
Video 和 audio 多媒体
canvas绘图
History 历史管理
可以在添加一条记录到历史记录的列表中,或者在没有刷新时,可以更新地址栏的URL。单页面的的跳转就用到了这里
例Vue的路由有两种模式: hash和history, history就用到了历史管理,使url改变不会去请求http
一、JS对象
1、length: 浏览器历史列表url的数量
2、back(): 向后一个url
3、forward(): 向前一个url
4、go(-1): 指定跳转到哪个历史
二、HTML5提供两个新方法:
可以通过新增的方法做到页面跳转不重新请求页面
1、history.state: 当前url下对应状态信息,如果当前url不是通过pushState或replaceState添加的, state
2、history.pushState(state, title, url): 在不刷新页面的情况下,添加历史记录,可以前进和后退
state: 存储JSON字符串
title: 浏览器不支持设置null
url: 更新浏览器的地址
3、history.replaceState(): 与pushState基本上同,不同的是不可以前进和后退
4、popstate 事件: 侦听前进和后退
Example:
window.addEventListener('popstate', function(e){
getContent(location.pathname, false);
})
var getContent=(url, addEnter) => {
$.get(url, function(dat){
history.pushState(null, null, url)
})
}
https://segmentfault.com/a/1190000002468274
http://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/
http://www.cnblogs.com/flash3d/archive/2013/10/23/3384823.html