早期的动画循环
在js中创建动画的典型方式就是用setInterval方法控制所有动画:
(function() {
function animations() {
//animations...
}
setInterval(animations, 100);
})()
最平滑动画的最佳循环间隔是100ms/60,约为17ms;大多数电脑显示器的刷新频率是60Hz。
但是如果UI线程繁忙,比如忙于处理用户操作,那么即使把代码加入到列队也不会立即执行。
循环间隔的问题
CSS的动画优势在于浏览器知道动画什么时候开始,因此会计算出正确的循环间隔,在恰当的时候刷新UI,而对于JavaScript动画,浏览器无从知晓什么时候开始。
目前,W3C已经着手起草requestAnimationFrame()
API。
Page Visibility API
该API包括以下三个部分:
document.hidden
:是否隐藏-
document.visibilityState
:4个可能的状态值后台标签或最小化
前台标签
实际页面隐藏,但用户看到页面预览
屏幕外执行预渲染
visibilitychange
事件
如:
document.addEventListener("visibilitychange", function () {
console.log(document.hidden);
});
Geolocation API
navigator.geolocation
这个对象包括三个方法:
-
getCurrentPosition
:接收3个参数(成功回调函数、可选的失败回调函数、可选的选项对象)-
成功回调函数会接收到一个
Position
对象参数,该对象有两个属性:coords
和timestamp
。coords
:对象包括latitude
和longitude
以及accuracy
-
失败回调函数接收
error
对象error对象有
code
和message
两个属性
可选对象接收一个对象:对象内容有
enableHighAccuracy
、timeout
以及maximumAge
-
watchPosition
:该方法接收的参数与上面的一致。配合clearWatch方法使用,类似setTimeout和clearTimeoutclearWatch
如:
navigator.geolocation.getCurrentPosition(function(position) {
do_something(position.coords.latitude, position.coords.longitude); //第一个参数为成功的回调函数
});
navigator.geolocation.getCurrentPosition(function(position) {
console.log(position.coords.latitude);
console.log(position.coords.timestamp);
}, function(err) { //第二个参数为失败的回调函数
console.log("Error code: " + err.code);
console.log("Error message: " + err.message);
});
navigator.geolocation.getCurrentPosition(function(position) {
console.log(position.coords.latitude);
console.log(position.coords.timestamp);
}, function(err) {
console.log("Error code: " + err.code);
console.log("Error message: " + err.message);
}, { //第三个参数接收对象
enableHighAccuracy: true,
timeout: 1000,
maximumAge: 30000
});
File API
HTML5 DOM中添加了元素files集合,通过文件输入字段选择一个或多个文件,files集合中将包括一组File对象,每个File对象对应着一个文件,每个File对象有下面的只读属性:
name
:本地文件系统中的文件名size
:文件的字节大小type
:字符串,文件的MIME类型lastModifiedDate
:字符串,上次文件被修改的事件
如:
var files = document.getElementById("files");
files.onchange = function () {
var list = event.target.files; //FileList对象
// console.log(list); //name: lastModified: lastModifiedDate: webkitRelativePath:
for (var i = 0, len = list.length; i < len; i++) {
console.log("name: " + list[i].name + "; type: " + list[i].type + "; size: " + list[i].size + "bytes"); //name: opening.png; type: image/png; size: 324991bytes
};
};
FileReader
浏览器都支持前两个方法:
readAsText;
readAsDataURL
readAsBinaryString
readAsArrayBuffer
如下例子:
var files = document.getElementById("files");
files.onchange = function() {
var files = event.target.files,
info = "",
output = document.getElementById("output"),
type = "default",
reader = new FileReader();
if (/image/.test(files[0].type)) {
reader.readAsDataURL(files[0]);
type = "image";
} else {
reader.readAsText(files[0]);
type = "text";
}
reader.onerror = function () {
output.innerHTML = "Could not read, error: " + reader.error.code;
};
reader.onprogress = function () {
if (event.lengthComputable) {
output.innerHTML = event.loaded + "/" + event.total;
}
};
reader.onload = function () {
var html = "";
switch (type) {
case "image":
html = "<img src=" + reader.result + ">";
break;
case "text":
html = reader.result;
break;
}
output.innerHTML = html;
};
};
如果想中断则需要调用abort方法。
读取部分内容
Blob
的实例,slice()
方法
blob.slice(startByte, length)
对象URL
引用保存在File或Blob中数据的URL:
window.URL.createObjectURL()
方法
要释放内存则把对象URL传给:
window.URL.revokeObjectURL()
方法
拖放文件
var droptarget = document.getElementById("drop");
droptarget.addEventListener("dragenter",function () {
event.preventDefault();
});
droptarget.addEventListener("dragover",function () {
event.preventDefault();
});
droptarget.addEventListener("drop",function () {
event.preventDefault();
var file = event.dataTransfer.files[0];
console.log(file.name)
});
在drop事件中,可以通过event.dataTransfer.files
读取文件信息。
XHR方法上传文件
略
data = new FormData();
...
data.append("file" + i, files[i]);
...
xhr.send(data);
Web 计时
Web Timing API
-
window.performance
对象PerformanceNavigation.redirectCount
type
-
performance.timing
属性navigationStart
unloadEventStart
unloadEventEnd
redirectStart
redirectEnd
fetchStart
domainLookupStart
domainLookupEnd
connectStart
connectEnd
secureConnectionStart
requestStart
responseStart
responseEnd
domLoading
domInteractive
domContentLoadedEventStart
domContentLoadedEventEnd
domComplete
loadEventStart
loadEventEnd
toJSON
Web Workers
略
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。