对码当歌,猿生几何?

Html5

1>语义化标签

1)兼容问题

IE8以上兼容

解决方案:

1>document.createElement("标签名"),然后再给它样式,但是创建的标签并不是一个块标签,所有可以利用display:block;使标签成为块标签.

2>利用插件 html5shiv.js

2)具体内容

header

footer

nav导航

aside一般用于侧边栏

article在页面中表示一套结构完整且独立的内容部分,我们可以在一篇博客、一个论坛帖子、一篇新闻报道或者一个用户评论中使用它

section页面上的版块

hgroup一个标题组合(已经废弃)

2>表单控件

1)简单介绍

<form>元素用于生成表单,该元素不会生成可视化部分。
<input>元素是表单元素中功能最丰富的控件
<label>元素用于在表单中定义标签

2)具体内容

以下当格式不正确的时候,验证不会通过的

email(移动端)提交时会进行格式的验证

<input type="email">

url(移动端)提交时会进行格式的验证

tel:电话号码,移动端 会变成数字键盘

search:搜索引擎,手机中键盘中的“搜索”

range:数值选择器 step:每次跳的步数 min:最小值 max:最大值  value:此时的值

<input type="range" step="2" min="0" max="10" value="5">

time:显示时间,不含时区

date:显示日期

week:显示周

month:显示月

color:颜色

datetime:显示完整的日期

datetime-local:显示完整的日期,不含时区

新加属性:

 <input type="text" placeholder="请输入4到16个字符" autocomplete="on" autofocus>

 <input type="text" placeholder="请输入4到16个字符" autocomplete="on" autofocus>

palceholder:显示提示信息,

autocomplete:是否保存用户输入值,默认是on,关闭提示选择off

autofocus:鼠标焦点自动聚集,没有值

list和datalist:为输入框构造一个选择列表(list的值为datalist的ID)

required:必须填写,验证条件

pattern:正则验证,例如pattern="d{1,5}"只能输入1到5 的数字

formaction:在submit中定义提交地址,只在submit中有用

3)id,name,class比较

id:为了js方便获取这个元素

name:要跟服务器进行交互,服务器到时候要获取客户端表单提交的数据,它根据的是name

class:通过样式去批量控制元素

input设置为只读属性

disabled 属性规定应该禁用 input 元素,被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值。

readonly 属性规定输入字段为只读可复制,后台会接收到传值. readonly 属性可以防止用户对值进行修改

readonly unselectable="on" 该属性跟disable类似

3>用于绘画的canvas,svg

1)canvas制作动画

实例:http://www.hangge.com/blog/cache/detail_1019.html

1》已经为快速绘图做过优化,所以用它做出来的动画速度比较快

2》绘制简单居形的方法

<canvas id="canvas" width="400" height="400">
		<p>你的浏览器不支持"canvas"</p>
	</canvas>
	<script>
	var ctx=document.getElementById("canvas");
	var ctx=canvas.getContext('2d');//获取2dcanvas对象
	ctx.rect(0,0,20,20);
	ctx.fillStyle="red";//绘制或返回用于填充绘画的颜色
	ctx.fill();//填充当前的绘画
	ctx.stroke();//绘制已定义的路线
	</script>

3》绘直线

ctx.moveTo(10,10)//将笔触移到指定位置
ctx.lineTo(20,20);//绘制一条从当前位置到指坐标的位置
ctx.stroke();

2)Svg绘画

1》基本

矩形 < rect >
圆形 < circle >
椭圆 < ellipse >
线 < line >
折线 < polyline >
多边形 < polygon >
路径 < path >
文本 < text >

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
  <rect x="50" y="20" rx="20" ry="20" width="150" height="100"
  style="fill:red;stroke:black;stroke-width:5;opacity:0.5"/>
</svg>
x,y 为图形左上角相对父元素svg的坐标,rx,ry分别为x,y方向的圆角半径;style定义样式

2》详解

矩形 - rect元素
x:矩形左上角的坐标(用户坐标系)的x值。
y:矩形左上角的坐标(用户坐标系)的y值。
width:矩形宽度。
height:矩形高度。
rx:实现圆角效果时,圆角沿x轴的半径。
ry:实现圆角效果时,圆角沿y轴的半径。

圆 - circle元素
r:圆的半径。
cx:圆心坐标x值。
cy:圆心坐标y值。

椭圆 - ellipse元素
rx:半长轴(x半径)。
ry:半短轴(y半径)。
cx:圆心坐标x值。
cy:圆心坐标y值。

3》渲染

SVG是严格按照定义元素的顺序来渲染的。在SVG中,写在前面的元素先被渲染,写在后面的元素后被渲染。后渲染的元素会覆盖前面的元素。

4》svg和canvas区别

Canvas

SVG

提供API通过JavaScript 绘制

SVG使用 XML 格式定义基于矢量的图形

逐像素进行渲染

每个被绘制的图形均被视为对象

依赖分辨率

不依赖分辨率(图像在放大或改变尺寸的情况下其图形质量不会有损失)

渲染速度快 适合图像密集型的游戏

复杂度高会减慢渲染速度 不适合游戏应用

4>媒体元素video,audio

<video src="http://www.webhek.com/~j/theora_testsuite/320x240.ogg" controls autoplay loop>

</video>

1)video

1>属性

src :视频的属性,url地址,src地址可控制播放区,http://xxxx.com/video.mp4#t=10,20   表示播放范围10s-20s

poster:视频封面,没有播放时显示的图片

preload:none(不预加载)|metadata(部分预加载)|auto(全部预加载)。默认为auto

autoplay:自动播放,是一个布尔属性,当出现时,表示自动播放,去掉是表示不自动播放。

自动播放为<video autoplay />或者<video autoplay=”autoplay” />

loop:循环播放,是一个布尔属性

controls:浏览器自带的控制条,需要浏览器启用本身的播放控制栏。控制栏须包括播放暂停控制,播放进度控制,音量控制等等。

width:视频宽度

height:视频高度

2)audio

 <audio id="media" src="test.mp3"></audio>  

1>控制函数功能说明

load() 加载音频、视频软件,通常不必调用,除非是动态生成的元素,用来在播放前预加载

play()加载并播放音频、视频文件,除非文件已经暂停在其他位置,否则默认重头开始播放

pause() 暂停处于播放状态的音频、视频文件

2>只读属性属性说明

duration   获取媒体文件的播放时长,以s为单位,如果无法获取,则为NaN

paused     如果媒体文件被暂停,则返回true,否则返回false

ended       如果媒体文件播放完毕,则返回true

startTime  返回起始播放时间,一般是0.0,除非是缓冲过的媒体文件,并一部分内容已经不在缓冲区

error          在发生了错误后返回的错误代码

currentSrc  以字符串形式返回正在播放或已加载的文件,对应于浏览器在source元素中选择的文件

3>audio 可脚本控制的特性值

autoplay       自动播放已经加载的的媒体文件,或查询是否已设置为autoplay

loop              将媒体文件设置为循环播放,或查询是否已设置为loop

currentTime 以s为单位返回从开始播放到目前所花的时间,也可设置currentTime的值来跳转到特定位置

controls        显示或者隐藏用户控制界面

volume         在0.0到1.0间设置音量值,或查询当前音量值

muted           设置是否静音

autobuffer     媒体文件播放前是否进行缓冲加载,如果设置了autoplay,则忽略此特性

·  //播放暂停切换  
·  function playAudio() {  
·      if(media.paused) {  
·          play();  
·      } else {  
·          pause();  
·      }  
·  }

3)source标签

1>知识点

Source标签用于给媒体(audio标签同样可以包含此标签,所以这儿用媒体)指定多个可选择的文件地址,但是浏览器最终只能选一个,且只能在媒体标签没有使用src属性时使用。浏览器按source标签的顺序检测标签指定的视频是否能够播放(可能是视频格式不支持,视频不存在等等),如果不能播放,换下一个。此方法多用于兼容不同的浏览器。Source标签本身不代表任何含义,不能单独出现。

2>属性

此标签包含src、type、media三个属性。

src:用于指定媒体的地址,和video标签的一样。

Type:用于说明src属性指定媒体的类型,帮助浏览器在获取媒体前判断是否支持此类别的媒体格式。

media:用于说明媒体在何种媒介中使用,不设置时默认值为all,表示支持所有媒介。

5>Localstorage,sessionstorage

6>新的API

1)用于请求动画的API requestAnimationFrame请求动画帧

1》概念:

requestAnimationFrame它最大的优势是由系统来决定回调函数的执行时机。就是说如果屏幕刷新率是60Hz,那么回调函数就每1000/60被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75,也就是说requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象,也不会导致动画出现卡顿的问题。在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu。

requestAnimationFrame函数会返回一个资源标识符,可以把它作为参数传入cancelAnimationFrame函数来取消requestAnimationFrame的回调

2》优点:

1.CPU节能使用setTimeout实现的动画,当页面被隐藏或最小化时,setTimeout 仍然在后台执行动画任务,由于此时页面处于不可见或不可用状态,刷新动画是没有意义的,完全是浪费CPU资源。而requestAnimationFrame则完全不同,当页面处理未激活的状态下,该页面的屏幕刷新任务也会被系统暂停,因此跟着系统步伐走的requestAnimationFrame也会停止渲染,当页面被激活时,动画就从上次停留的地方继续执行,有效节省了CPU开销。

2.函数节流:在高频率事件(resize,scroll等)中,为了防止在一个刷新间隔内发生多次函数执行,使用requestAnimationFrame可保证每个刷新间隔内,函数只被执行一次,这样既能保证流畅性,也能更好的节省函数执行的开销。

2)FileReader图片上传

1》作用

FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件。

var reader = new FileReader();

2》FileReader接口的方法:有4个方法,其中3个用来读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。

  1. readAsBinaryString(file) : 将文件读取为二进制编码,

  2. readAsText(file,[encoding]) : 将文件读取为文本,

     3. readAsDataURL(file) : 将文件读取为DataURL,

     4. abort(none) : 中断读取操作.

3》FileReader接口事件用于捕获读取文件时的状态。

1. onabort : 中断,

2. onerror : 出错,

3. onloadstart : 开始,

4. onprogress : 正在读取,

5. onload : 读取成功,

6. onloadend : 读取完成,无论成功失败(无论成功失败)。

4》例子

document.getElementById('upload-file').addEventListener('change', function() {
	var file;
	var destination = document.getElementById('destination');
	destination.innerHTML = '';
	// 循环用户多选的文件
	for(var x = 0, xlen = this.files.length; x < xlen; x++) {
		file = this.files[x];
		if(file.type.indexOf('image') != -1) { 
// 非常简单的交验
		    var reader = new FileReader();
		    reader.onload = function(e) {
			var img = new Image();
			img.src = e.target.result; // 显示图片的地方
destination.appendChild(img);
			};
		reader.readAsDataURL(file);
		}
	}});
<-- 一个能上传多媒体文件的表单 -->
<input type="file" id="upload-file" multiple />
<-- 显示图片的地方 -->
<div id="destination"></div>

2.

<script type="text/javascript">  
var result=document.getElementById("result");  
var file=document.getElementById("file");  
//判断浏览器是否支持FileReader接口  
if(typeof FileReader == 'undefined'){  
    result.InnerHTML="<p>你的浏览器不支持FileReader接口!</p>";  
    //使选择控件不可操作  
    file.setAttribute("disabled","disabled");  
}   
function readAsDataURL(){  
    //检验是否为图像文件  
    var file = document.getElementById("file").files[0];  
    if(!/image/w+/.test(file.type)){  
        alert("看清楚,这个需要图片!");  
        return false;  
    }  
    var reader = new FileReader();  
    //将文件以Data URL形式读入页面  
    reader.readAsDataURL(file);  
    reader.onload=function(e){  
        var result=document.getElementById("result");  
        //显示文件  
        result.innerHTML='<img src="' + e.target.result +'" alt="" />';  
    }  
}   
function readAsBinaryString(){  
    var file = document.getElementById("file").files[0];  
    var reader = new FileReader();  
    //将文件以二进制形式读入页面  
    reader.readAsBinaryString(file);  
    reader.onload=function(f){  
        var result=document.getElementById("result");  
        //显示文件  
        result.innerHTML=this.result;  
    }  
}   
function readAsText(){  
    var file = document.getElementById("file").files[0];  
    var reader = new FileReader();  
    //将文件以文本形式读入页面  
    reader.readAsText(file);  
    reader.onload=function(f){  
        var result=document.getElementById("result");  
        //显示文件  
        result.innerHTML=this.result;  
    }  
}  
</script>
<p>  
    <label>请选择一个文件:</label>  
    <input type="file" id="file" />  
    <input type="button" value="读取图像" onclick="readAsDataURL()" />  
    <input type="button" value="读取二进制数据" onclick="readAsBinaryString()" />  
    <input type="button" value="读取文本文件" onclick="readAsText()" />  
</p>  
<div id="result" name="result"></div>

2》Web Worker 可以分为两种不同线程类型

一个是专用线程 Dedicated Worker,一个是共享线程 Shared Worker。两种类型的线程各有不同的用途。

3》专用线程

1)专用线程创建方式:在创建专用线程的时候,需要给 Worker 的构造函数提供一个指向 JavaScript 文件资源的 URL,这也是创建专用线程时所需要的唯一参数。

var worker = new Worker('dedicated.js')

2)专用线程通信:

接收来至工作线程示例代码

worker.onmessage = function (event) { ... };

专用线程发送数据(专用线程不仅仅支持传输二进制数据,也支持结构化的 JavaScript 数据格式。)在这里有一点需要注意,为了高效地传输 ArrayBuffer 对象数据,需要在 postMessage 方法中的第二个参数中指定它。

worker.postMessage({ 
 operation: 'list_all_users', 
 //ArrayBuffer object 
 input: buffer, 
 threshold: 0.8, 
}, [buffer]);
异常处理
worker.onerror = function(e){
    console.log("error at "+e.filename ":" + e.lineno + e.message)
}
结束worker
worker.terminate();

载入工具类函数需要注意的是importScripts是同步方法,一旦importScripts方法返回就可以开始使用载入的脚本,而不需要回调函数。

importScripts("./utils/base64.js","./utils/map.js"...)

4》共享线程

共享线程是为了避免线程的重复创建和销毁过程,降低了系统性能的消耗,共享线程SharedWorker可以同时有多个页面的线程链接。

1)共享线程的创建构造函数使用 URL 作为第一个参数,指向 JavaScript 资源文件的 URL,如果提供了第二个构造参数,那么这个参数将被用于作为这个共享线程的名称。

var worker = new SharedWorker('sharedworker.js', ’ mysharedworker ’ );

2)与共享线程通信

接收数据

 worker.port.onmessage = function (event) { define your logic here... };

发送数据

 worker.port.postMessage('put your message here … ');

5》使用场景

使用工作线程做后台数值(算法)计算

比如:计算两个非常大的数字的最小公倍数和最大公约数。

使用共享线程处理多用户并发连接

创建一个共享线程用于接收从不同连接发送过来的指令,然后实现自己的指令处理逻辑,指令处理完成后将结果返回到各个不同的连接用户。

4)postMessage跨域交换数据(ie8+兼容)

1》解决问题:

不能和服务器交换数据,只能在两个窗口之间交换数据两个窗口能通信的前提是,一个窗口以iframe的形式存在于另一个窗口,或者一个窗口是从另一个窗口通过window.open()或者超链接的形式打开的),也就是说要交换数据必须能获取目标窗口的引用,不然两个窗口毫无联系,想通信也无能为力。

2》使用方式:

2.1>otherWindow.postMessage(message,targetOrigin,[transfer]);

otherWindow->是对接收方窗口的引用,一般表示方式:

window.frames[0],document.getElementsByTagName(‘iframe’)[0],window.opener...

message:发送的内容,支持字符串,数字,json等几乎所有形式的数据

targetOrigin:接收方url(协议+主机+端口),也可以是url形式,但之后的内容(形如xxx.html)会自动忽略

2.2>接收方一般监听message事件,获取postMessage传来的消息

window.addEventListener(message,function(event){

})

event有3个主要的参数:

   data:传递过来的消息

   source:发送消息的窗口对象

   origin:发送消息的源(协议+主机+端口号)

3》安全性:

postMessage采用“双向安全机制”,发送方发送数据的时候,会确认接收方的源,而接受方监听message事件后,也可以用event.origin判断是否来自正确可靠地发送方。

4》例子

<--http://localhost:81-->
<iframe src="http://localhost:8080/index.html"></iframe>
<script>
document.getElementsByTagName('iframe')[0].contentWindow.postMessage({"age":10},'http://localhost:8080')
window.addEventListener('message',function(e){
	console.log(e)
})
<--http://localhost:8080-->
<script>
window.addEventListener('message',function(e){
	if(e.origin!=='http://localhost:81')
		return;
		console.log(e);
		e.source.postMessage('hello world',e.origin)
})
</script>

           

阅读更多