JavaScript 新興的API——「其餘新API」的注意要點

早期的動畫循環

在js中建立動畫的典型方式就是用setInterval方法控制全部動畫:html

(function() {
    function animations() {
        //animations...
    }
    setInterval(animations, 100);
})()

最平滑動畫的最佳循環間隔是100ms/60,約爲17ms;大多數電腦顯示器的刷新頻率是60Hz。git

可是若是UI線程繁忙,好比忙於處理用戶操做,那麼即便把代碼加入到列隊也不會當即執行。web

循環間隔的問題

CSS的動畫優點在於瀏覽器知道動畫何時開始,所以會計算出正確的循環間隔,在恰當的時候刷新UI,而對於JavaScript動畫,瀏覽器無從知曉何時開始。瀏覽器

目前,W3C已經着手起草requestAnimationFrame()API。app

Page Visibility API

該API包括如下三個部分:dom

  • document.hidden:是否隱藏函數

  • document.visibilityState:4個可能的狀態值fetch

    • 後臺標籤或最小化動畫

    • 前臺標籤線程

    • 實際頁面隱藏,但用戶看到頁面預覽

    • 屏幕外執行預渲染

  • 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

相關文章
相關標籤/搜索