HTML5笔记-加强版
<!doctype html>
<meta charset=“utf-8”/>
2、新的结构化元素:语义化标签:
<header></header> 页眉。主要用于页面的头部的信息介绍,也可用于板块头部
<hgroup></hgroup> 页面上的一个标题组合。一个标题和一个子标题,或者标语的组合
<hgroup>
<h1>妙味课堂</h1>
<h2>带您进入富有人情味的IT培训</h2>
</hgroup>
<nav></nav> 导航 (包含链接的的一个列表)比ul少了一些默认的局限性
<nav><a href=“#”>链接</a><a href=“#”>链接</a></nav>
<nav>
<p><a href=“#”>首页</a></p>
<p><a href=“#”>课堂</a></p>
</nav>
<footer></footer>页脚 页面的底部 或者 版块底部
<section> <section> 页面上的版块。用于划分页面上的不同区域,或者划分文章里不同的节
<article></ article > 用来在页面中表示一套结构完整且独立的内容部分。可以用来呈现论坛的一个帖子,杂志或报纸中的一篇文章,一篇博客,用户提交的评论内容,可互动的页面模块挂件等。
<aside></ aside> 元素标签可以包含与当前页面或主要内容相关的引用、侧边栏、广告、nav元素组,以及其他类似的有别与主要内容的部分
aside 的内容应该与 article 的内容相关:
被包含在<article>中作为主要内容的附属信息部分,其中的内容 以是与当前文章有关的引用、词汇列表等
在<article>之外使用,作为页面或站点全局的附属信息部分;最典型的形式是侧边栏(sidebar),其中的内容可以是友情链接、附属导航或广告单元等。
<figure> < figure > 用于对元素进行组合。一般用于图片或视频。
<figcaption> <figcaption> figure的子元素,用于对figure的内容进行说明。
<figure>
<img src=“miaov.png”/>(注意没有alt)
<figcaption> 妙味课堂 photo © 妙味趣学</figcaption>
</figure>
<time></time>用来表现时间或日期
<p> 我们在每天早上 <time>9:00</time> 开始营业。</p>
<p> 我在 <time datetime="2008-02-14">情人节</time> 有个约会。 </p>
<datalist></datalist>选项列表。与 input 元素配合使用,来定义 input 可能的值。
当输入的时候,会出现下拉菜单,里面有可能的选项。当输入选项前几个字母会匹配含有的选项值。
<input type="text" list="valList" />
<datalist id="valList">
<option value="javascript">javascript</option>
<option value="html">html</option>
<option value="css">css</option>
</datalist>
<details></details>用于描述文档或文档某个部分的细节。该元素用于摘录引用等,应该与页面的主要内容区分开的其他内容
属性: Open 进入页面时属性默认展开
< summary></summary> details 元素的标题
<details>
<summary>妙味课堂</summary> (显示)
<p>国内将知名的IT培训机构</p> (隐藏)
</details>
<dialog></dialog>定义一段对话 :
<dialog>
<dt>老师</dt>
<dd>2+2 等于?</dd>
<dt>学生</dt>
<dd>4</dd>
<dt>老师</dt>
<dd>答对了!</dd>
</dialog>
<address></address> 定义文章 或页面作者的详细联系信息
<mark></mark> 需要标记的词或句子(字体的背景默认为黄色标记)
<keygen>给表单添加一个公钥
<form action="http://www.baidu.com" method="get">
用户: <input type="text" name="usr_name" />
公钥: <keygen name="security" />
<input type="submit" />
</form>
<progress><progress>定义进度条
<progress max="100" value="76">
<span>76</span>%
</progress>
3、IE下的兼容
1)标签
针对IE6-8这些不支持HTML5语义化标签的浏览器我们可以使用javascript创建标签来解决他们
方法如下:
在页面的头部加下:
<script>
document.createElement(“header”);
document.createElement(“nav”);
document.createElement(“footer”);
……
</script>
2)样式
HTML5语义化标签在IE6-8下,我们用js创建出来之后,他是不会有任何默认样式的甚至是 display,所以在样式表里要对这些标签定义一下它默认的display,一般为display:block
3)直接引入兼容插件
4、表单forms
1)新的输入型控件:type=" "
email : 电子邮箱文本框,跟普通的没什么区别。当输入不是邮箱的时候,验证通不过。移动端的键盘会有变化。
tel : 电话号码
url : 网页的URL
search : 搜索引擎。chrome下输入文字后,会多出一个关闭的X
range : 特定范围内的数值选择器。属性:min、max、step( 步数 )
number : 只能包含数字的输入框
color : 颜色选择器
datetime : 显示完整日期(UTC)
datetime-local : 显示完整日期,不含时区
time : 显示时间,不含时区
date : 显示日期
week : 显示周
month : 显示月
2)新的表单属性
placeholder : 输入框提示信息
autocomplete : 是否保存用户输入值,下次输入显示历史输入内容。默认为on,关闭提示选择off
autofocus : 指定表单获取输入焦点
list和datalist : 为输入框构造一个选择列表
list值为datalist标签的id
required : 此项必填,不能为空
pattern : 正则验证 pattern="\d{1,5}"
formaction 在submit里定义提交地址。
保存到草稿:
<input type="submit" value="保存至草稿箱" formaction="http://www.qq.com" />
5、表单验证
表单验证
Invalid事件 : 验证反馈 input.addEventListener('invalid',fn,false)
阻止默认验证:ev.preventDefault()
formnovalidate属性 : 关闭验证
validity对象,通过下面的valid可以查看验证是否通过,如果八种验证都通过返回true,一种验证失败返回false
oText.addEventListener("invalid",fn1,false);
ev.preventDefault()
valueMissing : 输入值为空时
typeMismatch : 控件值与预期类型不匹配
patternMismatch : 输入值不满足pattern正则
tooLong : 超过maxLength最大限制
rangeUnderflow : 验证的range最小值
rangeOverflow:验证的range最大值
stepMismatch: 验证range 的当前值 是否符合min、max及step的规则
customError 不符合自定义验证
setCustomValidity(); 自定义验证
eg:
var oText=document.getElementById("text");
oText.addEventListener("invalid",fn,false);
function fn()
{
alert(this.validity.patternMismatch);// 八种验证不匹配不一致的时候返回true
ev.preventDefault();
}
HTML5新特性
querySelector 只能选择一组中的第一个元素:
var oDiv = document.querySelector('#box'); //也可通.class和[title=box]选择
querySelectorAll 获取一组元素:
var aDiv = document.querySelectorAll('.box');
getElementsByClassName:通过class获取元素
var aDiv = document.getElementsByClassName('box'); //可以获取一组元素
获取class列表属性:classList:
length : class的长度
add() : 添加class方法
remove() : 删除class方法
toggle() : 切换class方法
var oDiv = document.getElementById('div1');
alert( oDiv.classList ); //类似与数组的对象
alert( oDiv.classList.length ); //3
oDiv.classList.add('box4');
oDiv.classList.remove('box2');
oDiv.classList.toggle('box2');//当box2存在时则删除,当box2不存在时则添加
2、JSON的新方法
JSON.parse() : 把字符串转成js。字符串中的属性要严格的加上引号。
JSON.stringify() : 把json转化成字符串。会自动的把双引号加上。
新方法与eval的区别:
eval : 可以解析任何字符串变成JS
parse : 只能解析JSON形式的字符串变成JS (安全性要高一些)
新方法的应用:可以深度克隆新对象,为了防止对象的引用造成互相的影响可以进行:
浅拷贝:for in
var a = {
name : 'hello'
};
var b = {};
for(var attr in a){
b[attr] = a[attr];
}
b.name = 'hi';
alert( a.name ); //hello
深拷贝:
var a = {
name : { age : 100 }
};
var str = JSON.stringify(a);
var b = JSON.parse(str);
b.name.age = 200;
alert( a.name.age ); //100
如何其他浏览器做到兼容:(IE8以下不支持)
http://www.json.org/去下载json2.js
3、data自定义数据
很多库都采用自定义数据,使得JS与HTML进行分离,比如jQuery mobile
dataset:
data-name : dataset.name
data-name-first : dataset.nameFirst
eg:
<div id="div1" data-miao="喵" data-miao-all="喵">div</div>
var oDiv = document.getElementById('div1');
//JS获取自定义属性:
oDiv.dataset.miao
oDiv.dataset.miaoAll
4、延迟加载JS
JS的加载会影响后面的内容加载。很多浏览器都采用了并行加载JS,但还是会影响其他内容。
defer : 延迟加载,会按顺序执行,在onload执行前被触发:
<script src="a.js" defer="defer"></script>
<script src="b.js" defer="defer"></script>
async : 异步加载,加载完就触发,有顺序问题,有依赖关系的JS不要异步
<script src="a.js" async ="async"></script>
<script src="b.js" async ="async"></script>
Labjs库:可以处理是否有依赖关系的JS,来控制谁应该异步加载。
音频视频:
aS[0].src = 'xxxx.mp4';aS[1].src = 'yyyy.mp4';oV.load(); //动态修改播放地址的后要重新加载,执行load()函数,否则修改不生效。
跨文档消息通信、地理信息、本地存储、离线存储
iframe方法:
如果我们要操作一个iframe里面的dom元素,首先要获取到iframe引入的页面的window
var Iframe= document.getElementById('myframe');
Iframe.contentWindow -> 被iframe包含的页面的window对象
Iframe.contentWindow.document.body.style.background = 'red';
当本页面和包含页面不在同一个域名下的时候,这样操作就会有跨域操作安全限制问题。
如果我们要在iframe中操作父级页面:
parent => window 如果当前页面是顶级,没有被其他页面所包含,那么parent就是当前页面的window对象,那么如果被包含了,则parent就是包含当前页面的父级页面的window对象
window : 当前窗口
parent : 父级窗口
top : 顶级窗口(最外面的父级)
parent.document.body.style.background = 'green';
window.open方法:
window.open 返回被打开窗口的window对象
打开之后并改变背景颜色:
window.open('4.window.open.html', '_blank').document.body.style.background = 'red';
window.opener : 返回通过window.open方法打开当前页面的窗口window
该方法适用在一个页面(A)用window.open方法打开的新页面(B)中,来操作之前的页面(A)
window.opener.document.body.style.background = 'green';
2)跨文档消息通信(不同域下的窗口通信)
假设发送消息的域名为a.com,接收域为b.com
a.com下:
postMessage对象,可以通过这个方法给另外一个窗口发送信息。
接收消息的window对象.postMessage()
第一个参数:发送的数据
第二个参数:接收数据的域名{带上协议(http://)}
var oMyIframe = document.getElementById('myframe');
oMyIframe.contentWindow.postMessage('1', 'http://www.b.com');
b.com下:
message : 当窗口接收到通过postMessage发送过来的数据的时候触发
message事件的事件对象下保存了发送过来的内容
ev.data : 发送过来的数据
ev.origin:发送数据的来源
window.addEventListener('message', function(ev) {
alert(ev.data); // 1alert(ev.origin);// http://www.a.comalert('我接收到了a.com页面发送过来的数据,内容是:' + ev.data);if (ev.data == '1') { // a.com相当于发送指令给b.com,然后b.com确认后作出相应的改变
document.body.style.background = 'red';
}
}, false);
同域下的:
var oBtn = document.getElementById('btn');
oBtn.onclick = function() {
var xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {if (xhr.status == 200) {alert(xhr.responseText);}}
}
xhr.open('get', 'ajax.php', true);
xhr.send();
}
跨域下的:
在标准浏览器下,XMLHttpRequest对象已经是升级版本,支持了更多的特性,可以跨域了。但是,如果想实现跨域请求,还需要后端的相关配合,后端要设置响应头信息:
<?php
header('Access-Control-Allow-Origin:http://www.a.com'); //这是允许访问该资源的域
XMLHttpRequest : 增加很多功能,它也不推荐使用onreadystatechange这个事件来监听,推荐使用新事件onload
XDomainRequest : IE如果想实现跨域请求,则需要使用另外一个对象XDomainRequest 去实现
var oXDomainRequest = new XDomainRequest();
oXDomainRequest.onload = function() {
alert(this.responseText);
}
oXDomainRequest.open('get', 'http://www.b.com/ajax.php', true);
oXDomainRequest.send();
ajax实现无刷新页面上传(带进度条):
进度事件:
upload.onprogress :上传过程中的事件
FormData对象,通过FormData来构建二进制,提交数据
ev.total(发送的总量)
ev.loaded(已发送的数量)
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<style>
#div1 {width: 300px; height: 30px; border: 1px solid #000; position: relative;}
#div2 {width: 0; height: 30px; background: #CCC;}
#div3 {width: 300px; height: 30px; line-height: 30px; text-align: center; position: absolute; left: 0; top: 0;}
</style>
<script>
window.onload = function() {
var oBtn = document.getElementById('btn');var oMyFile = document.getElementById('myFile');var oDiv1 = document.getElementById('div1');var oDiv2 = document.getElementById('div2');var oDiv3 = document.getElementById('div3');oBtn.onclick = function() {//alert(oMyFile.value); //获取到的是file控件的value值,这个内容是显示给你看的文字,不是我们选择的文件//oMyFile.files :file控件中选择的文件列表对象//alert(oMyFile.files);//我们是要通过ajax把oMyFile.files[0]数据发送给后端var xhr = new XMLHttpRequest();xhr.onload = function() {//var d = JSON.parse(this.responseText);//alert(d.msg + ' : ' + d.url);alert('OK,上传完成');oDiv2.style.background = "green";}var oUpload = xhr.upload;oUpload.onprogress = function(ev) {//console.log(ev.total + ' : ' + ev.loaded);var iScale = ev.loaded / ev.total;oDiv2.style.width = 300 * iScale + 'px';oDiv3.innerHTML = iScale * 100 + '%';}xhr.open('post', 'post_file.php', true); // 大数据量的用postxhr.setRequestHeader('X-Request-With', 'XMLHttpRequest'); //设置请求头信息var oFormData = new FormData(); //通过FormData来构建二进制,提交数据oFormData.append('file', oMyFile.files[0]); //file为后端要接收文件设置的值xhr.send(oFormData);}
<input type="file" id="myFile" /><input type="button" id="btn" value="上传" /><div id="div1"><div id="div2"></div><div id="div3">0%</div></div>
互联网协议:
http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
TCP/IP协议
定义了电子设备如何连入因特网,以及数据在它们之间传输的标准(如何传输)
传输数据(协议)类型:Email,www,FTP等
HTTP协议
浏览器和万维网服务器之间互相通信的规则
HTTP协议特点
功能很强大
采用请求、响应模式,单项通信
短连接,响应完成连接就断开
实时web交互:
股票、聊天室、网游等应用
如果实现实时应用?服务器推送
什么是web socket?
基于TCP的双向的、全双工的数据连接
双向的:客户端、服务器端
全双工:数据的发送与接收,两者同步进行
建立socket应用?
服务器必须支持web socket.
Nodejs的简介:
Ryan Dahl基于GoogleV8引擎创建的一套用来编写高性能网络服务器的JavaScript工具包
Nodejs : 用js去写服务器应用
一个简单的web服务器
创建HTTP服务
监听客户端HTTP请求连接
处理请求响应,向客户端输出返回内容
Websocket连接
客户端发送Websocket连接请求
服务器监听来自Websocket连接请求
当连接成功后,客户端和服务器可以随时接收和发送数据
地理位置与本地存储
1、地理位置:
经度 : 南北极的连接线
纬度 : 东西连接的线
2、位置信息从何而来:
IP地址
GPS全球定位系统
Wi-Fi无线网络
基站
3、地理位置对象navigator.geolocation:
1)单次定位请求 :getCurrentPosition(请求成功,请求失败,数据收集方式)
2)请求成功函数
经度 : coords.longitude
纬度 : coords.latitude
准确度 : coords.accuracy
海拔 : coords.altitude
海拔准确度 : coords.altitudeAcuracy
行进方向 : coords.heading
地面速度 : coords.speed
时间戳 : new Date(position.timestamp)
3)请求失败函数:
失败编号 :code
0 : 不包括其他错误编号中的错误
1 : 用户拒绝浏览器获取位置信息
2 : 尝试获取用户信息,但失败了
3 : 设置了timeout值,获取位置超时了
4)数据收集 : json的形式:
enableHighAcuracy : 更精确的查找,默认false
timeout : 获取位置允许最长时间,默认infinity
maximumAge : 位置可以缓存的最大时间,默认0
5)多次定位请求 : watchPosition(像setInterval)
移动设备有用,位置改变才会触发
配置参数:frequency 更新的频率
6)关闭更新请求 : clearWatch(像clearInterval)
4、百度地图API<script src="http://api.map.baidu.com/api?v=1.3"></script>
本地存储:
Cookie:
数据存储到计算机中,通过浏览器控制添加与删除数据
Cookie的特点:存储限制,域名100个cookie,每组值大小4KB。客户端、服务器端,都会请求服务器(头信息)。页面间的cookie是共享。
Storage:
sessionStorage:session临时回话,从页面打开到页面关闭的时间段
窗口的临时存储,页面关闭,本地存储消失
localStorage:永久存储(可以手动删除数据)
Storage的特点:
存储量限制 ( 5M )。客户端完成,不会请求服务器处理。sessionStorage数据是不共享、 localStorage共享。
Storage API:
setItem():
设置数据,key\value类型,类型都是字符串
可以用获取属性的形式操作
getItem():
获取数据,通过key来获取到相应的value
removeItem():
删除数据,通过key来删除相应的value
clear():
删除全部存储的值
存储事件:
当数据有修改或删除的情况下,就会触发storage事件
在对数据进行改变的窗口对象上是不会触发的
Key : 修改或删除的key值,如果调用clear(),key为null
newValue : 新设置的值,如果调用removeStorage(),key为null
oldValue : 调用改变前的value值
storageArea : 当前的storage对象
url : 触发该脚本变化的文档的url
注:session同窗口才可以,例子:iframe操作