1.应用程序标签
- DataList(数据列表)
- Progress(进度条)
- Meter(数值显示器)
示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<html lang="en">
<head>
<meta charset="UTF-8">
<title>应用程序标签</title>
<style>
.my-progress{
-webkit-appearance: none;
}
</style>
</head>
<body>
<!--数据列表,呈现需要载体-->
<input type="text" list="data-list">
<datalist id="data-list">
<option value="张三"></option>
<option value="李四"></option>
</datalist>
<!--进度条-->
<progress></progress>
<!--progress默认最大值是1,可以设定自己想要的值-->
<progress class="my-progress" value="30" max="100"></progress>
<meter min="0" max="100" low="40" high="90" optimum="100" value="91">A+</meter>
</body>
可以利用数据列表(data-list)做一个那种带下拉框的输入框,可以根据用户输入的内容匹配下拉框的内容(select2也可以实现这种需求,而且最低可以兼容到IE8,推荐用select2),后面的progress和meter样式不好控制,用的不太多。
2.自定义属性(data-*)
在html5中可以自定义数据,以data开头,利用这个自定义标签我们可以把属性暂时存储到页面中,在js中可以使用,例子如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43<html lang="en">
<head>
<meta charset="UTF-8">
<title>data属性</title>
</head>
<body>
<ul id="list">
</ul>
</body>
<script>
// 键是ID 值是信息
var data = {
01: {
name: "张三1",
age: 18
},
02: {
name: "张三2",
age: 19
},
03: {
name: "张三3",
age: 20
}
};
var list = document.getElementById("list");
for(var id in data){
var item = data[id];
var liem = document.createElement("li");
liem.innerHTML = item.name;
//自定义data-*属性
liem.setAttribute("data-name",item.name);
liem.setAttribute("data-age",item.age);
list.appendChild(liem);
//点击获取dataset属性
liem.addEventListener("click",function(){
//下面这两种方式均可以,都不带data-
alert(this.dataset['name']);
alert(this.dataset.name);
})
}
</script>
下面这篇文章总结的很好,可以参考:http://blog.csdn.net/qq_31851435/article/details/53100691
3.新的表单提交方式
传统的一共有9中表单提交方式,html5新增了几种,目前只用在移动端,pc端兼容性有问题,而且在输入的时候并没有进行验证,比如类型是email的,并没有校验邮箱格式,还是需要我们自己手动写正则表达式验证的,只是在手机端当唤起输入法的时候会自动切换到英文输入法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<head>
<meta charset="UTF-8">
<title>新的表单提交方式</title>
</head>
<body>
<h3>传统的表单提交方式(9种)</h3>
用户名:<input type="text"> <br>
密码:<input type="password"><br>
性别:<input type="radio"><br>
课程:<input type="checkbox"><br>
隐藏:<input type="hidden">
文件:<input type="file"><br>
按钮:<input type="button" value="按钮"><br>
表单:<input type="submit"><br>
重置:<input type="reset"><br><hr>
<h3>新的表单提交方式(目前只用在移动端)</h3>
颜色:<input type="color"><br>
网址:<input type="url"><br>
搜索:<input type="search" results="10" placeholder="Search..."><br>
邮箱:<input type="email" pattern="^\*.com"><br>
日期:<input type="date" min="2015-09-01" max="2018-09-01"><br>
图片:<input type="image"><br>
范围:<input type="range" min="0" max="50" value="10"><br>
数字:<input type="number">
</body>
4.新的选择器
html5提供新的选择器,querySelector选择单个的元素,返回满足条件的第一个元素,是一个dom元素,querySelectorAll选择全部的元素,返回满足条件的全部元素,是一个dom数组,里面可以是id,标签或class类。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35<html lang="en">
<head>
<meta charset="UTF-8">
<title>新选择器</title>
</head>
<body>
<h3>新选择器</h3>
<ul>
<li class="item">item1</li>
<li class="item">item2</li>
<li class="item">item3</li>
<li class="item">item4</li>
<li class="item">item5</li>
<li class="item">item6</li>
<li class="item">item7</li>
<li class="item">item8</li>
<li class="item">item9</li>
<li class="item">item10</li>
</ul>
</body>
<script>
//匿名函数,可以将作用域分隔开
(function(){
var liem = document.querySelector(".item"); //只选择第一个
console.log(liem.innerHTML);
var lis = document.querySelectorAll("ul>li"); //选择全部
for(var i=0;i<lis.length;i++){
console.log(lis[i]);
lis[i].addEventListener("click",function(){
debugger; //可以调试代码。类似于浏览器打断点
console.log(this.innerHTML);
})
}
})()
</script>
5.元素类列表(Element.classList)
新H5中DOM对象多了一个classList属性,是一个数组:
- add 添加一个新的类名
- remove 删除一个类名
- contains 判断是否包含一个指定的类名
- toggle 切换一个类名。 element.toggle(‘class-name’,[add_or_remove]),第一个参数是类名,第二个参数是布尔值,如果是true,则添加类名,如果是false,则去掉类名。示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47<head>
<meta charset="UTF-8">
<title>元素类列表</title>
<link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
<div class="container">
<div class="collapse navbar-collapse">
<nav class="navbar navbar-default">
<a class="navbar-brand" href="#">Brand</a>
<ul class="nav navbar-nav">
<li><a href="#">Home</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</nav>
</div>
</div>
<script>
//匿名函数
(function(){
/** 点击时添加和删除类名**/
var lis = document.querySelectorAll(".nav li");
for(var i=0;i<lis.length;i++){
lis[i].addEventListener("click",function(e){
//去掉原先所有的样式
for(var j=0;j<lis.length;j++){
lis[j].classList.remove("active");
}
//添加点击样式
this.classList.add("active");
e.preventDefault(); //取消事件的默认操作
})
}
/** 点击时存在类名则删除,不存在类名则添加**/
var elem = document.querySelector(".navbar-brand");
//点击时如果存在active这个属性则去掉,如果不存在这个属性则加上
elem.addEventListener("click",function(e){
//判断是否包含active这个类名
var isExist = elem.classList.contains("active");
this.classList.toggle("active",!isExist);
e.preventDefault();
})
})()
</script>
</body>
6.访问历史Api
在HTML5中可以通过window.history操作访问历史状态,让一个页面可以有多个历史状态
- window.history.forward(); // 前进
- window.history.back(); // 后退
- window.history.go(); // 刷新
- history.pushState(放入历史中的状态数据, 设置title(现在浏览器不支持), 改变历史状态),通过JS可以加入一个访问状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<head>
<meta charset="UTF-8">
<title>历史记录</title>
</head>
<body>
<input type="button" value="测试历史记录" onclick="addHistory()">
</body>
<script>
//添加历史记录
function addHistory(){
//判断浏览器是否支持历史记录,毕竟是h5的新特性,低版本浏览器不支持
if(window.history && history.pushState){
//支持
history.pushState(new Date().toLocaleDateString(),"设置历史记录的标签,但是目前浏览器还不支持","?demo="+new Date().toLocaleTimeString());
}else{
console.log("抱歉,浏览器不支持历史记录")
}
}
//下面这个事件是点击浏览器中的前进或后退时触发
window.addEventListener("popstate",function(e){
console.log("点击了历史按钮"+e.state);
})
</script>
7.全屏Api
H5中可以用requestFullScreen()方法实现指定元素的全屏显示(类似于浏览器中按F11)。
首先需要获取需要全屏显示的元素,然后判断浏览器是属于谷歌内核还是火狐内核或者其它浏览器,然后调用响应方法即可。(注意:目前这个特性浏览器兼容性还比较差,谷歌和火狐可以)1
2
3
4
5
6
7
8var elem = 需要全屏的元素;
if (elem.webkitRequestFullScreen) {
elem.webkitRequestFullScreen();
} else if (elem.mozRequestFullScreen) {
elem.mozRequestFullScreen();
} else if (elem.requestFullScreen){
elem.requestFullScreen();
}
1 | <head> |
8.Application Cache离线访问技术
在H5中可以利用Application Cache实现离线访问技术,测试时可以通过谷歌浏览器——NetWork——No throttling(Disable cache后面的那个下拉框)——下拉选择Offline(模拟未联网的情形)。
示例如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32html代码:
<html lang="en" manifest="cache.manifest">
<head>
<meta charset="UTF-8">
<title>离线访问</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<p>这是html页面中的内容</p>
<script src="script.js"></script>
</body>
style.css文件代码
body::before{
content: "这是Css中引入的内容";
font-size: 40px;
}
script.js文件代码:
document.write("这是js中引入的内容")
cache.manifest文件代码:
CACHE MANIFEST
# version 1.0.1
CACHE:
08离线访问.html
script.js
style.css
NETWORK:
*
解释:在html代码中通过css的伪类和js的document.write函数分别输出两句话,模拟请求其它文件,然后在manifest(缓存清单)中定义了一个cache.manifest的缓存清单文件,文件里首先定义了当前软件的版本,下面的CACHE,代表断网情况下,从下面定义的文件中读取文件,NETWORK代表联网时候要读取的文件,星号代表全部。即断网时从我定义的文件中读取文件,联网时,读取全部文件,这样便可实现离线访问。
9.web网页存储
h5中提供sessionStorage和localStorage两种数据存储方式,前者存储的内容只在本次会话中存储,浏览器关闭数据消失,后者是可以永久存储在浏览器中,除非手动或通过程序删除。这两种存储方式比cookie存储的数据量大,而且可以存储对象数据(cookie只能存储字符串数据)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34<head>
<meta charset="UTF-8">
<title>网页存储</title>
</head>
<body>
<textarea rows="5" cols="30" id="txt-data"></textarea>
<input type="button" value="设置数据" id="set-data">
<input type="button" value="获取数据" id="get-data">
<script>
(function(){
var txtValue = document.querySelector("#txt-data");
console.log(txtValue.value);
//设置数据
document.querySelector("#set-data").addEventListener("click",function (e) {
//判断是否支持存储
if(window.sessionStorage){
sessionStorage.setItem("key",txtValue.value);
}else{
console.log("还在用渣渣IE吗?升级吧。。。")
}
})
//获取数据
document.querySelector("#get-data").addEventListener("click",function (e) {
//判断是否支持存储
if(window.sessionStorage){
txtValue.value = sessionStorage.getItem("key");
}else{
console.log("还在用渣渣IE吗?升级吧。。。")
}
})
})()
</script>
</body>
10.操作文件Api
通过file表单选择文件,之后利用h5提供的文件api可以获取文件名,大小,类型,最后修改时间等文件信息。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42<html lang="en">
<head>
<meta charset="UTF-8">
<title>操作文件</title>
<link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
<div class="container">
<form>
<input type="file" class="form-control hidden" id="btn_file" multiple>
<input type="button" value="选择文件" class="btn btn-success" id="btn_select">
<div class="list-group" id="ul_list">
<!--待追加数据位置-->
</div>
</form>
</div>
</body>
<script>
(function(){
var btn_file = document.querySelector("#btn_file");
var btn_select = document.querySelector("#btn_select");
var ul_list = document.querySelector("#ul_list");
//利用“hidden”类将文件输入框隐藏,当点击“选择文件按钮时”,调用选择文件按钮,选择文件,
// 因为input type="file"这个无法修改样式,把它隐藏,点击其它按钮时,在其它按钮中调用点击上传文件
btn_select.addEventListener("click",function(){
btn_file.click();
})
//选择文件完成后(即文件内容发生改变后)
btn_file.addEventListener("change",function(e){
var files = btn_file.files; //获取所有文件,并遍历
for(var i=0;i<files.length;i++){
console.log(files[i]);
var liem = document.createElement("li");
liem.setAttribute("class","list-group-item");
liem.innerHTML = ' <h4 class="list-group-item-heading">'+files[i].name+'</h4>'+
'<p class="list-group-item-text">'+files[i].lastModifiedDate.toLocaleTimeString()+' '+(files[i].size/1024).toFixed(2)+'kb</p>'
ul_list.appendChild(liem);
}
})
})()
</script>
这里是用到了bootstrap的样式,因为file表单比较丑,而且无法改变样式,所以我们可以把文件表单隐藏(用hidden隐藏样式),提供一个按钮,当点击这个按钮时去雕砌选文件的弹框,multiple属性支持一次选择多个文件。
11.拖拽文件
拖拽文件时需要依次注册以下事件:
- dragenter 注册拖拽进入事件
- dragleave 注册拖拽离开事件
- dragover 注册滑动事件(在这里面阻止默认事件)
- drop 注册松手落地事件。
在拖动松手落地事件中判断拖进来的是文件还是图片地址还是文字,分别进行处理。e.dataTransfer获取拖动进来的信息。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83<head>
<meta charset="UTF-8">
<title>拖拽文件</title>
<link rel="stylesheet" href="css/bootstrap.css">
<style>
#target{
height: 200px;
border: 5px dashed #c0c0c0;
color: #505050;
padding: 20px;
font-size: 40px;
cursor: pointer;
text-align: center;
-webkit-user-select: none;
}
#target.actived{
border-color: #888;
color: #080808;
box-shadow: 0 0 80px #e0e0e0 inset;
}
</style>
</head>
<body>
<div class="container">
<div class="page-header">
<h3>拖拽文件</h3>
</div>
<div class="jumbotron">
<p>我们这里测试拖拽文件</p>
<img src="test.png">
</div>
<div id="target">
拖拽文件进来
<ul id="result" class="list-group"></ul>
</div>
</div>
</body>
<script>
(function(){
var target = document.querySelector("#target");
var fileList = document.querySelector('#result');
//注册拖拽进入事件
target.addEventListener("dragenter",function(){
this.classList.add("actived"); //添加样式
})
//注册拖拽文件离开事件
target.addEventListener("dragleave",function(){
this.classList.remove("actived"); //添加样式
})
//注册落地事件之前必须要先阻止默认事件,这里在滑动里面阻止默认事件
target.addEventListener("dragover",function(e){
e.preventDefault(); //阻止默认事件
e.stopPropagation();
})
//注册松手落地事件
target.addEventListener("drop",function(e){
//判断拖入进来的是文件,图片还是文字,分别处理
if(e.dataTransfer.files.length){
//拖入的是文件
var files = e.dataTransfer.files;
for (var i = 0; i < files.length; i++) {
var li = document.createElement('li');
li.setAttribute('class', 'list-group-item');
// 创建信息的子节点
li.innerHTML = '<h5 class="list-group-item-heading">' + files[i].name + '</h5><p class="list-group-item-text">' + files[i].lastModifiedDate.toLocaleDateString() + ' ' + files[i].lastModifiedDate.toLocaleTimeString() + ' ' + (files[i].size / 1024).toFixed(2) + 'KB</p>';
fileList.appendChild(li);
}
}else{
//不是文件
var data = e.dataTransfer.getData('text/plain'); //判断拖入的是文本还是图片
if(data){
//拖入的是文本,直接置换
target.innerHTML = data;
}else{
//拖入的是图片
var imgElem = document.createElement("img");
imgElem.src = data;
target.appendChild(imgElem);
}
}
})
})()
</script>
12.访问设备信息
h5提供了许多可以访问设备的Api,但是目前基本都应用在手机端,pc端使用非常有限。
获取网络状态。
1
2
3
4
5
6
7
8// × 所有PC浏览器现在都不支持 只有手机端的Firefox
var connectionInfo = navigator.connection;
或者下面这个方法:
if (navigator.onLine){
console.log('online');
}else{
console.log('offline');
}获取重力感应方向
1
2
3
4
5window.addEventListener('deviceorientation', function(event) {
var a = event.alpha; // Y轴 上下方向
var b = event.beta; // Z轴 东西方向
var g = event.gamma; // X轴 南北方向
});加速度计
1
2
3
4window.addEventListener('devicemotion', function(e) {
// 获取加速计数据 {x,y,z}
var acceleration = e.accelerationIncludingGravity;
});地理坐标
1
2
3
4
5
6
7navigator.geolocation.getCurrentPosition(function(e) {
// e.coords.longitude : 经度, e.coords.latitude : 纬度
document.querySelector('#result').innerHTML = JSON.stringify(e.coords);
}, function(e) {
document.querySelector('#result').innerHTML = JSON.stringify(e);
});
navigator.geolocation.watchPosition(success, error);
H5还有其它的一些特性,包括语义化标签,ARIA无障碍互联网应用,多媒体(包括音频,视频)等等,真正使用的时候再详细研究。