早期的动画循环

在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对象参数,该对象有两个属性:coordstimestamp

      • coords:对象包括latitudelongitude以及accuracy

    • 失败回调函数接收error对象

      • error对象有codemessage两个属性

    • 可选对象接收一个对象:对象内容有enableHighAccuracytimeout以及maximumAge

  • watchPosition:该方法接收的参数与上面的一致。配合clearWatch方法使用,类似setTimeout和clearTimeout

  • clearWatch

如:

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


JS菌
6.4k 声望2k 粉丝