一些标签
- <header>用在页面头部或板块头部<header>
- <footer>用在页面尾部或板块尾部</footer>
- <nav></nav>用于标签导航
<nav>
<p><a href="">导航栏目1</a></p>
<p><a href="">导航栏目2</a></p>
</nav>
<nav>
<h2>标题</h2>
<ul>
<li><a href="">js</a></li>
<li><a href="">html</a></li>
</ul>
</nav>
- <hgroup></hgroup>标题组
<hgroup>
<h1>标题1</h1>
<h1>标题2</h1>
</hgroup>
- <section>用来划分区域</section>
- <article></article>用来在页面中表示一套结构完整且独立的内容部分,比如报纸中的某一篇文章。
- <aside></aside>和主体相关的附属信息
- <figure></figure>用来包含多媒体的标签
<figure>
<img src="img/jzz.jpg" alt=""/>
<figcaption>多媒体需要的文字内容</figcaption>
</figure>
- <time></time>
<p>现在是<time>21:00</time></p>
- <details>用来描述文档或文档的某个细节部分</details>(open属性表示展开)
<input type="text" name="" value="" list="valList"/>
<datalist class="" id="valList">
<option value="html"></option>
<option value="css"></option>
<option value="js"></option>
<option value="jquery"></option>
<option value="haha"></option>
</datalist>
// datalist和input元素配合使用,来定义input可能的值
运行结果:
- <summary>details元素的标题</summary>
<details>
<summary>这是标题</summary>
<p>这是正文内容这是正文内容</p>
</details>
// 不写open=”open”,是收起的,设置了open才表示默认展开
运行结果:
- <address>定义文章或页面作者的详细联系地址</address>
- <mark>需要标记的词或句子</mark>,mark标签包裹起来的文本浏览器有默认的背景色,如果需要修改其背景色,在css中修改即可
- <progress>定义进度条</progress>
<progress value="70" max="100">70%</progress>
关于h5在低版本IE中的兼容性
对于IE8及其以下版本的浏览器不兼容h5,两种解决方法:
1、在js中创建标签,eg:document.createElement(“header”);(这时header相当于自定义标签,,记得设置为块状元素)
2、引入插件html5shiv.js
新的输入型控件
- email —— 限制输入为电子邮箱格式(移动端的键盘会有变化)
<form class="" action="index.html" method="get">
<input type="email" name="" value="">
<input type="submit" value="submit">
</form>
// 如果输入的不是电子邮箱格式就提交,会出现相关的错误信息提示
- tel —— 电话号码
- url —— 网页url
- search —— 搜索引擎(Chrome下输入文字后,会多出一个关闭的x)
- range —— 特定范围内的数值选择器
<input type="range" name="" id="" step="2" min="0" max="10" value="4">
- number —— 只能包含数字的输入框
- color —— 颜色选择器
- datetime —— 显示完整日期
- datetime-local —— 显示完整日期,不含时区
- time —— 显示时间,不含时区
- date —— 显示日期
- week —— 显示周
- month —— 显示月
- autocomplete —— 是否保存用户输入过的值,默认为on,关闭提示为off
- autofocus —— 指定表单获取输入焦点
- list和datalist —— 为输入框构造一个选择列表
- required —— 此项必填,不能为空
- pattern —— 正则验证pattern=“\d{1-5}”
- formaction —— 在submit里定义提交地址
关于h5新特性浏览器的支持情况: http://www.caniuse.com/#index
新的选择器
- querySelector,获取的就是一组中的第一个元素——获取的是单个元素
document.querySelector(“div”)
document.querySelector(“.box”)
document.querySelector(“[title=hello]”)
- querySelectorAll
document.querySelectorAll(“div”);
- getElementsByClassName
获取class列表属性
- classList
length:class的长度 add():添加class remove():删除class toggle():切换class
<div id="div1" class="box box1 box2" title=“hello"></div> var oDiv = document.getElementById("div1"); console.log(oDiv.classList); console.log(oDiv.classList.length); //3 oDiv.classList.add('box4'); //添加类box4 oDiv.classList.remove(‘box2'); //删除类box2 oDiv.classList.toggle(‘box5'); //如果有类box5,则删除;如果没有,则加上
json新方法
- parse() —— 字符串转化为json(字符串中的属性要严格加上引号)
- stringfy() —— json转化为字符串(自动给属性加上引号)
新方法和eval()的区别
var str = "function a(){console.log('a');}" eval(str); a(); //打印出hello
eval可以解析任何形式字符串为js parse只能解析json格式字符串为js 由于parse有解析格式限制,所以parse的安全性较eval要高一些(万一eval中有病毒,会被执行)
- 新方法的应用——深度克隆对象
- 其他浏览器如何做到兼容 ——(http://www.json.org/去下载json2.js)
关于克隆
var a = {name: "Alice"};
var b = a;
b.name = "Bob";
console.log(a.name); //Bob 改变了a对象的属性值
var a = {name: "Alice"};
var b = {};
for (var attr in a) {
b[attr] = a[attr];
}
b.name = "Bob";
console.log(a.name); //Alice 然而,如果对象里是复合属性,则需要使用循环和递归的方式进行克隆
var a = {name: "Alice"};
var str = JSON.stringify(a);
var b = JSON.parse(str);
b.name = "Bob";
console.log(a.name); //Alice 不管是不是复合属性,此种方法都可以完成克隆
data- 属性
<div data-slogan="好好学习" id="oDiv"></div>
<div data-slogan-all="天天向上" id="oDiv1"></div>
var oDiv = document.getElementById("oDiv");
console.log(oDiv.dataset.slogan); //好好学习
var oDiv1 = document.getElementById("oDiv1");
console.log(oDiv1.dataset.sloganAll); //天天向上
注:dataset.这种方式获取其属性是只读的,这种方式不能修改属性
延迟加载js
js的加载会影响后面的内容加载
- 很多浏览器都采用了并行方式加载js,但还是会影响其他内容
h5的defer和async
- defer,延迟加载,会按顺序执行,在onload执行前被触发
- async,异步加载,加载完就触发,有顺序问题
labjs库
历史管理
- onhashchange:改变hash值来管理
- history:服务器下运行
pushState:三个参数:数据 标题 地址 popstate事件:读取数据event,state 注意:网址是虚假的,需在服务器指定对应页面,不然刷新找不到页面
- 生成随机数
function randomNum(min,max,times){ //随机生成times个从min到max的随机数
var arr = [], //用于存放从min到max的数
resultArr = []; //用于存放结果
var unitLength = max-min;
var arrLength = unitLength>0?unitLength:(-unitLength);
for (var i = min; i < arrLength; i++) { //生成从min到max的数,放到数组arr中
arr.push(i);
}
for (i = 0; i < times; i++) {
// splice删除元素返回的删除元素后的数组
// floor,向下取整
resultArr.push(arr.splice(Math.floor(Math.random()*arr.length),1)[0]);
}
return resultArr;
}
console.log(randomNum(0,35,7)); //生成7个从0到35不重复的随机数
- 使用hash触发页面的历史管理(需求:生成随机数,并可以翻阅历史进行查看)
window.location.hash,windows对象会将这个属性的历史值依次存放起来
<input type="button" id="oInput" value="点击"/>
<div id="oDiv"></div>
var oInput = document.getElementById("oInput"),
oDiv = document.getElementById("oDiv");
oInput.onclick = function(){
var numString = randomNum(0,35,7);
oDiv.innerHTML = numString;
window.location.hash = numString;
}
window.onhashchange = function(){ //onhashchange,小写,hash值改变触发
//substring(1)表示从第二个字符处开始截取字符
oDiv.innerHTML = window.location.hash.substring(1);
}
function randomNum(min,max,times){
var arr = [],
resultArr = [];
var unitLength = max-min;
var arrLength = unitLength>0?unitLength:(-unitLength);
for(var i=min;i<arrLength;i++){
arr.push(i);
}
for(i=0;i<times;i++){
resultArr.push(arr.splice(Math.floor(Math.random()*arr.length),1)[0]);
}
return resultArr;
}
- 使用pushState触发页面的历史管理(需求:生成随机数,并可以翻阅历史进行查看)
<input type="button" id="oInput" value="点击"/>
<div id="oDiv"></div>
var oInput = document.getElementById("oInput"),
oDiv = document.getElementById("oDiv");
oInput.onclick = function(){
var numString = randomNum(0,35,7);
oDiv.innerHTML = numString;
history.pushState(numString,''); //history.state,历史状态
//关于history.pushState,https://developer.mozilla.org/zh-CN/docs/Web/API/History/pushState
}
window.onpopstate = function(e){ //onpopstate,小写,浏览器的前进和后退触发
if(e.state){
oDiv.innerHTML = e.state;
}
}
function randomNum(min,max,times){
var arr = [],
resultArr = [];
var unitLength = max-min;
var arrLength = unitLength>0?unitLength:(-unitLength);
for(var i=min;i<arrLength;i++){
arr.push(i);
}
for(i=0;i<times;i++){
resultArr.push(arr.splice(Math.floor(Math.random()*arr.length),1)[0]);
}
return resultArr;
}
h5拖放事件
- 拖拽元素事件:事件对象为被拖拽元素
dragstart,拖拽前触发 drag,拖拽前、结束之间,连续触发 dragend,拖拽结束触发
- 目标元素事件:事件对象为目标元素
dragenter,进入目标元素触发 dragover,进入目标、离开目标之间,连续触发 dragleave,离开目标元素触发 drop,在目标元素上释放被拖拽元素
- 拖拽示例
.item {
margin: 10px;
width: 100px;
height: 40px;
line-height: 40px;
background-color: #0f0;
}
#oDiv {
margin: 40px 0 0 100px;
width: 200px;
height: 100px;
background-color: #f00;
}
<ul>
<li class="item" draggable="true">a</li>
<li class="item" draggable="true">b</li>
<li class="item" draggable="true">c</li>
</ul>
<div id="oDiv"></div>
var oLis = document.getElementsByTagName("li"),
oDiv = document.getElementById("oDiv");
for (var i = 0; i < oLis.length; i++) {
oLis[i].ondragstart = function(){
console.log("开始拖拽");
}
oLis[i].ondrag = function(){
console.log("拖拽中");
}
oLis[i].ondragend = function(){
console.log("拖拽结束");
}
}
oDiv.ondragenter = function(){
console.log("进入目标元素");
}
oDiv.ondragover = function(e){
console.log("进入和离开目标元素之间连续触发");
e.preventDefault(); //要使drop事件生效,必须在ondragover中加上这句
}
oDiv.ondragleave = function(){
console.log("离开目标元素");
}
oDiv.ondrop = function(){
console.log("在目标元素上释放拖拽元素");
}
火狐下的拖拽问题
- 在火狐的拖拽中,必须设置dataTransfer对象的setData方法才可以拖拽除图片外的其他标签
dataTransfer对象: setData():设置数据key和value(必须是字符串) getData():获取数据,根据key获取对应的value
obj.ondragstart = function(ev){ var ev = ev||window.event; ev.dataTransfer.setData('name','hello'); console.log("开始拖拽"); //设置了dataTransfer,火狐浏览器才会支持拖拽除图片外的其他元素 }
<ul id="oList">
<li class="item" draggable="true" data-id="0">a</li>
<li class="item" draggable="true" data-id="1">b</li>
<li class="item" draggable="true" data-id="2">c</li>
</ul>
<div id=“oDiv"></div>
.item {
margin: 10px;
width: 100px;
height: 40px;
line-height: 40px;
background-color: #0f0;
}
#oDiv {
margin: 40px 0 0 100px;
width: 200px;
height: 100px;
background-color: #f00;
}
var oLis = document.getElementsByTagName("li"),
oDiv = document.getElementById("oDiv"),
oList = document.getElementById("oList");
for (var i = 0; i < oLis.length; i++) {
oLis[i].ondragstart = function(ev){
var ev = ev||window.event;
ev.dataTransfer.setData('name',this.dataset.id);
this.style.background = "#f00";
//设置了dataTransfer,火狐浏览器才会支持拖拽除图片外的其他元素
}
}
oDiv.ondragover = function(e){
e.preventDefault(); //要使drop事件生效,必须添加这句话
}
oDiv.ondrop = function(ev){
//拖拽元素,假装实现了拖拽到目标处的“删除”
oLis[ev.dataTransfer.getData("name")].style.display = 'none';
}
dataTransfer对象
- effectAllowed,设置光标样式(none,copy......百度悉知)
- setDragImage,三个参数:指定的元素,坐标x,坐标y
- files,获取外部拖拽的文件,返回一个fileList列表;fileList下有个type属性,返回文件的类型
for (var i = 0; i < oLis.length; i++) {
oLis[i].ondragstart = function(ev){
var ev = ev||window.event;
ev.dataTransfer.setData('name',this.dataset.id);
ev.dataTransfer.effectAllowed = ‘link';
ev.dataTransfer.setDragImage(oDiv,0,0);
this.style.background = "#f00";
}
}
FileReader(读取文件信息)
- readAsDataUrl —— 参数为要读取的文件对象,将文件读取为DataUrl
- onload —— 当文件读取成功完成时触发
——this.result,用来获取读取的文件数据,如果是图片,将返回base64格式的图片数据
- h5实现购物车拖拽:
https://github.com/AnnabelleLing/ShoppingCartDragH5Demo - h5实现图片上传预览:
https://github.com/AnnabelleLing/ImgUploadPreviewH5Demo
跨文档消息通信
(未完待续...)