摘要:事件,當(dāng)文檔從可見變?yōu)椴豢梢娀驈牟豢梢娮優(yōu)榭梢姇r(shí),觸發(fā)該事件要為兩個(gè)事件都指定事件處理程序?qū)ο蟀瑐€(gè)方法,接收個(gè)參數(shù)成功回調(diào)函數(shù)可選的失敗回調(diào)函數(shù)可選的選項(xiàng)對(duì)象。,事件已經(jīng)發(fā)生且執(zhí)行完所有事件處理程序的時(shí)間。
新興的API requestAnimationFrame() 早期動(dòng)畫循環(huán)
基本動(dòng)畫循環(huán)
(function(){ function updateAnimations(){ doAnimation1(); doAnimation2(); //其他動(dòng)畫 } setInterval(updateAnimations, 100); })();循環(huán)間隔問題
幾個(gè)瀏覽器的計(jì)時(shí)器精度
IE8 及更早版本的計(jì)時(shí)器精度為 15.625ms。
IE9 及更晚版本的計(jì)時(shí)器精度為 4ms。
Firefox 和 Safari 的計(jì)時(shí)器精度大約為 10ms。
Chrome 的計(jì)時(shí)器精度為 4ms。
mozRequestAnimationFrame()
mozRequestAnimationFrame() 方法接收一個(gè)參數(shù),即在重繪屏幕前調(diào)用的一個(gè)函數(shù)。這個(gè)函數(shù)負(fù)責(zé)改變下一次重繪時(shí)的 DOM樣式。為了創(chuàng)建動(dòng)畫循環(huán),可以像以前使用 setTimeout() 一樣,把多個(gè)對(duì)mozRequestAnimationFrame() 的調(diào)用連綴起來
function updateProgress(){ var div = document.getElementById("status"); div.style.width = (parseInt(div.style.width, 10) + 5) + "%"; if (div.style.left != "100%"){ mozRequestAnimationFrame(updateProgress); } } mozRequestAnimationFrame(updateProgress);webkitRequestAnimationFrame()與msRequestAnimationFrame()
(function(){ function draw(timestamp){ //計(jì)算兩次重繪的時(shí)間間隔 var drawStart = (timestamp || Date.now()), diff = drawStart - startTime; //使用 diff 確定下一步的繪制時(shí)間 //把 startTime 重寫為這一次的繪制時(shí)間 startTime = drawStart; //重繪 UI requestAnimationFrame(draw); } var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame, startTime = window.mozAnimationStartTime || Date.now(); requestAnimationFrame(draw); })();Page Visibility API
三部分組成
document.hidden,表示頁面是否隱藏的布爾值。頁面隱藏包括頁面在后臺(tái)標(biāo)簽頁中或者瀏覽器最小化。
document.visibilityState,表示下列 4 個(gè)可能狀態(tài)的值。
頁面在后臺(tái)標(biāo)簽頁中或?yàn)g覽器最小化。
頁面在前臺(tái)標(biāo)簽頁中。
實(shí)際的頁面已經(jīng)隱藏,但用戶可以看到頁面的預(yù)覽(就像在 Windows 7 中,用戶把鼠標(biāo)移動(dòng)到任務(wù)欄的圖標(biāo)上,就可以顯示瀏覽器中當(dāng)前頁面的預(yù)覽)。
頁面在屏幕外執(zhí)行預(yù)渲染處理。
visibilitychange 事件,當(dāng)文檔從可見變?yōu)椴豢梢娀驈牟豢梢娮優(yōu)榭梢姇r(shí),觸發(fā)該事件
function handleVisibilityChange(){ var output = document.getElementById("output"), msg; if (document.hidden || document.msHidden || document.webkitHidden){ msg = "Page is now hidden. " + (new Date()) + "Geolocation API
"; } else { msg = "Page is now visible. " + (new Date()) + "
"; } output.innerHTML += msg; } //要為兩個(gè)事件都指定事件處理程序 EventUtil.addHandler(document, "msvisibilitychange", handleVisibilityChange); EventUtil.addHandler(document, "webkitvisibilitychange", handleVisibilityChange);
navigator.geolocation對(duì)象包含3個(gè)方法
getCurrentPosition(),接收3個(gè)參數(shù):成功回調(diào)函數(shù)、可選的失敗回調(diào)函數(shù)、可選的選項(xiàng)對(duì)象。
成功回調(diào)函數(shù),有兩個(gè)屬性:coords和timestamp。其中coords包含相關(guān)信息
latitude,以十進(jìn)制度數(shù)表示的緯度。
longitude,以十進(jìn)制度數(shù)表示的經(jīng)度。
accuracy,經(jīng)、緯度坐標(biāo)的精度,以米為單位。
altitude,以米為單位的海拔高度,如果沒有相關(guān)數(shù)據(jù)則值為 null 。
altitudeAccuracy,海拔高度的精度,以米為單位,數(shù)值越大越不精確。
heading,指南針的方向,0°表示正北,值為 NaN 表示沒有檢測(cè)到數(shù)據(jù)。
speed,速度,即每秒移動(dòng)多少米,如果沒有相關(guān)數(shù)據(jù)則值為 null
失敗回調(diào)函數(shù),在被調(diào)用的時(shí)候接收一個(gè)參數(shù),這個(gè)參數(shù)是一個(gè)對(duì)象,包含兩個(gè)屬性:message和code。其中message屬性中包含文本信息,解釋為什么會(huì)出錯(cuò),code中保存著一個(gè)值,表示錯(cuò)誤的類型:用戶拒絕共享1、位置無效2、超時(shí)3
navigator.geolocation.getCurrentPosition(function(position){ drawMapCenteredAt(position.coords.latitude, positions.coords.longitude); }, function(error){ console.log("Error code: " + error.code); console.log("Error message: " + error.message); })
選項(xiàng)對(duì)象,用于設(shè)定信息的類型??梢栽O(shè)置的選項(xiàng)有三個(gè):enableHightAccurancy是一個(gè)布爾值,表示必須盡可能使用最準(zhǔn)確的位置信息;timeout是以毫秒數(shù)表示的等待位置信息的最長時(shí)間;maximumAge表示上一次取得坐標(biāo)信息的有效時(shí)間,毫秒表示
navigator.geolocation.getCurrentPosition(function(position){ drawMapCenteredAt(position.coords.latitude, positions.coords.longitude); }, function(error){ console.log("Error code: " + error.code); console.log("Error message: " + error.message); }, { enableHighAccuracy: true, timeout: 5000, maximumAge: 25000 })
另一個(gè)方法是watchPosition()這個(gè)方法接收的參數(shù)與上一個(gè)方法一樣
File API
每個(gè)File對(duì)象都有下列只讀屬性
name,本地文件系統(tǒng)中的文件名。
size,文件的字節(jié)大小。
type,字符串,文件的 MIME 類型。
lastModifiedDate,字符串,文件上一次被修改的時(shí)間
FileReader類型
為了讀取文件中的數(shù)據(jù),F(xiàn)ileReader提供的方法
readAsText(file,encoding),以純文本形式讀取文件,將讀取到的文本保存在 result 屬性中。第二個(gè)參數(shù)用于指定編碼類型,是可選的。
readAsDataURL(file),讀取文件并將文件以數(shù)據(jù) URI 的形式保存在 result 屬性中。
readAsBinaryString(file),讀取文件并將一個(gè)字符串保存在 result 屬性中,字符串中的每個(gè)字符表示一字節(jié)。
readAsArrayBuffer(file),讀取文件并將一個(gè)包含文件內(nèi)容的 ArrayBuffer 保存在result 屬性中
var filesList = document.getElementById("files-list"); EventUtil.addHandler(filesList, "change", function(event){ var info = "", output = document.getElementById("output"), progress = document.getElementById("progress"), files = EventUtil.getTarget(event).files, 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 file, error code is " + reader.error.code; }; reader.onprogress = function(event){ if (event.lengthComputable){ progress.innerHTML = event.loaded + "/" + event.total; } }; reader.onload = function(){ var html = ""; switch(type){ case "image": html = "讀取部分內(nèi)容"; break; case "text": html = reader.result; break; } output.innerHTML = html; }; });
File對(duì)象還支持slice()方法,這個(gè)方法接收兩個(gè)參數(shù):起始的字節(jié)及要讀取的字節(jié)數(shù)
function blobSlice(blob, startByte, length){ if (blob.slice){ return blob.slice(startByte, length); } else if (blob.webkitSlice){ return blob.webkitSlice(startByte, length); } else if (blob.mozSlice){ return blob.mozSlice(startByte, length); } else { return null; } }
Blob類型有一個(gè)size屬性和一個(gè)type屬性,支持slice()方法,以便進(jìn)一步切割數(shù)據(jù)
var filesList = document.getElementById("files-list"); EventUtil.addHandler(filesList, "change", function(event){ var info = "", output = document.getElementById("output"), progress = document.getElementById("progress"), files = EventUtil.getTarget(event).files, reader = new FileReader(), blob = blobSlice(files[0], 0, 32); if (blob){ reader.readAsText(blob); reader.onerror = function(){ output.innerHTML = "Could not read file, error code is " + reader.error.code; }; reader.onload = function(){ output.innerHTML = reader.result; }; } else { alert("Your browser doesn" t support slice()."); } });對(duì)象URL
使用對(duì)象URL的好處是可以不必把文件內(nèi)容讀取到JavaScript中而直接使用文件內(nèi)容,為此只要在需要文件內(nèi)容的地方提供對(duì)象URL即可,要?jiǎng)?chuàng)建對(duì)象URL,可以使用window.URL.createObjectURL()方法,并傳入File或Blob對(duì)象
var filesList = document.getElementById("files-list"); EventUtil.addHandler(filesList, "change", function(event){ var info = "", output = document.getElementById("output"), progress = document.getElementById("progress"), files = EventUtil.getTarget(event).files, reader = new FileReader(), url = createObjectURL(files[0]); if (url){ if (/image/.test(files[0].type)){ output.innerHTML = "讀取拖放的文件"; } else { output.innerHTML = "Not an image."; } } else { output.innerHTML = "Your browser doesn"t support object URLs."; } });
var droptarget = document.getElementById( "droptarget"); function handleEvent(event){ var info = "", output = document.getElementById("output"), files, i, len; EventUtil.preventDefault(event); if (event.type == "drop"){ files = event.dataTransfer.files; i = 0; len = files.length; while (i < len){ info += files[i].name + " (" + files[i].type + ", " + files[i].size + " bytes)使用XHR上傳文件
"; i++; } output.innerHTML = info; } } EventUtil.addHandler(droptarget, "dragenter", handleEvent); EventUtil.addHandler(droptarget, "dragover", handleEvent); EventUtil.addHandler(droptarget, "drop", handleEvent);
var droptarget = document.getElementById("droptarget"); function handleEvent(event){ var info = "", output = document.getElementById("output"), data, xhr, files, i, len; EventUtil.preventDefault(event); if (event.type == "drop"){ data = new FormData(); files = event.dataTransfer.files; i = 0; len = files.length; while (i < len){ data.append("file" + i, files[i]); i++; } xhr = new XMLHttpRequest(); xhr.open("post", "FileAPIExample06Upload.php", true); xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ alert(xhr.responseText); } }; xhr.send(data); } } EventUtil.addHandler(droptarget, "dragenter", handleEvent); EventUtil.addHandler(droptarget, "dragover", handleEvent); EventUtil.addHandler(droptarget, "drop", handleEvent);Web計(jì)時(shí)
navigationStart,開始導(dǎo)航到當(dāng)前頁面的時(shí)間。
unloadEventStart,前一個(gè)頁面的 unload 事件開始的時(shí)間。但只有在前一個(gè)頁面與當(dāng)前頁面來自同一個(gè)域時(shí)這個(gè)屬性才會(huì)有值;否則,值為 0。
unloadEventEnd,前一個(gè)頁面的 unload 事件結(jié)束的時(shí)間。但只有在前一個(gè)頁面與當(dāng)前頁面來自同一個(gè)域時(shí)這個(gè)屬性才會(huì)有值;否則,值為 0。
redirectStart,到當(dāng)前頁面的重定向開始的時(shí)間。但只有在重定向的頁面來自同一個(gè)域時(shí)這個(gè)屬性才會(huì)有值;否則,值為 0。
redirectEnd,到當(dāng)前頁面的重定向結(jié)束的時(shí)間。但只有在重定向的頁面來自同一個(gè)域時(shí)這個(gè)屬性才會(huì)有值;否則,值為 0。
fetchStart,開始通過 HTTP GET 取得頁面的時(shí)間。
domainLookupStart,開始查詢當(dāng)前頁面 DNS 的時(shí)間。
domainLookupEnd,查詢當(dāng)前頁面 DNS 結(jié)束的時(shí)間。
connectStart,瀏覽器嘗試連接服務(wù)器的時(shí)間。
connectEnd,瀏覽器成功連接到服務(wù)器的時(shí)間。
secureConnectionStart,瀏覽器嘗試以 SSL 方式連接服務(wù)器的時(shí)間。不使用 SSL 方式連接時(shí),這個(gè)屬性的值為 0。
requestStart,瀏覽器開始請(qǐng)求頁面的時(shí)間。
responseStart,瀏覽器接收到頁面第一字節(jié)的時(shí)間。
responseEnd,瀏覽器接收到頁面所有內(nèi)容的時(shí)間。
domLoading,document.readyState 變?yōu)?"loading" 的時(shí)間。
domInteractive,document.readyState 變?yōu)?"interactive" 的時(shí)間。
domContentLoadedEventStart,發(fā)生 DOMContentLoaded 事件的時(shí)間。
domContentLoadedEventEnd,DOMContentLoaded 事件已經(jīng)發(fā)生且執(zhí)行完所有事件處理程序的時(shí)間。
domComplete,document.readyState 變?yōu)?"complete" 的時(shí)間。
loadEventStart,發(fā)生 load 事件的時(shí)間。
loadEventEnd,load 事件已經(jīng)發(fā)生且執(zhí)行完所有事件處理程序的時(shí)間。
Web Workers 使用Worker
只有Worker接收到消息才會(huì)實(shí)際執(zhí)行文件匯總的代碼。要給Worker傳遞消息,可以使用postMessage()方法,消息內(nèi)容可以是任何能夠被序列化的值
worker.postMessage(“start! ");Worker全局作用域
Worker執(zhí)行的JavaScript代碼完全在另一個(gè)作用域中,與當(dāng)前網(wǎng)頁中的代碼不共享作用域
Web Worker本身也是一個(gè)最小化的運(yùn)行環(huán)境
最小化的 navigator 對(duì)象,包括 onLine 、 appName 、 appVersion 、 userAgent 和 platform屬性;
只讀的 location 對(duì)象;
setTimeout() 、 setInterval() 、 clearTimeout() 和 clearInterval() 方法;
XMLHttpRequest 構(gòu)造函數(shù)。
包含其他腳本
Worker的全局作用域提供這個(gè)功能,可以調(diào)用importScripts()方法,這個(gè)方法接收一個(gè)或多個(gè)指向JavaScript文件的URL,每個(gè)加載過程都是異步進(jìn)行的。因此所有腳本加載之后,importScripts()才會(huì)執(zhí)行
//Web Worker 內(nèi)部的代碼 importScripts("file1.js", "file2.js");
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98252.html
摘要:基本概念語法區(qū)分大小寫,中的一切變量函數(shù)名和操作符都區(qū)分大小寫。要將一個(gè)值轉(zhuǎn)換成對(duì)應(yīng)的值,可以調(diào)用類型包括整數(shù)和浮點(diǎn)數(shù)值,基本數(shù)值字面量格式是十進(jìn)制整數(shù),除了十進(jìn)制外還有八進(jìn)制十六進(jìn)制。八進(jìn)制第一位必須是,十六進(jìn)制第一位必須是。 基本概念 語法 區(qū)分大小寫,ECMAScript中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。函數(shù)名不能使用typeof,因?yàn)樗且粋€(gè)關(guān)鍵字,但typeOf...
摘要:操作類名時(shí)可以通過屬性添加刪除和替換類名。如果將可選的參數(shù)設(shè)置為,則表示盡量將元素顯示在視口中部垂直方向。將元素的內(nèi)容滾動(dòng)指定的頁面高度,具體高度由元素的高度決定。 DOM擴(kuò)展 選擇符API querySelector()方法 querySelector()方法接收一個(gè)CSS選擇符,返回與該模式匹配的第一個(gè)元素,如果沒有找到匹配的元素,返回null //取得body元素 var b...
摘要:對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。類型類型來自使用操作符和構(gòu)造函數(shù)同樣返回表示日期的毫秒數(shù),但它與在構(gòu)建時(shí)使用不同的信息。類型類型,與布爾值對(duì)應(yīng)的引用類型。 引用類型 Object類型 兩種創(chuàng)建Object實(shí)例的對(duì)象 使用new操作符后跟Object構(gòu)造函數(shù) var person=new Object(); person.name=Nicholas;...
摘要:腳本編程跨文檔消息傳遞跨文檔消息傳送,簡稱為,指的是來自不同域的頁面間傳遞消息的核心是方法,在規(guī)范中,除了部分之外的其他部分也會(huì)提到這個(gè)方法名,但都是為了同一個(gè)目的,向另一個(gè)地方傳遞參數(shù)。第一個(gè)頁面加載時(shí)為空 HTML5腳本編程 跨文檔消息傳遞 跨文檔消息傳送,簡稱為XMD,指的是來自不同域的頁面間傳遞消息 XMD的核心是postMessage()方法,在HTML5規(guī)范中,除了XDM...
摘要:對(duì)象的核心對(duì)象是,它表示瀏覽器的一個(gè)實(shí)例。而和則表示該容器中頁面視圖區(qū)的大小。在中,與返回相同的值,即視口大小而非瀏覽器窗口大小。第三個(gè)參數(shù)是一個(gè)逗號(hào)分隔的設(shè)置字符串,表示在新窗口中都顯示哪些特性。這應(yīng)該是用戶打開窗口后的第一個(gè)頁面 BOM window對(duì)象 BOM的核心對(duì)象是window,它表示瀏覽器的一個(gè)實(shí)例。在瀏覽器中,window對(duì)象有雙重角色,它既是通過JavaScript訪...
閱讀 1098·2021-11-23 09:51
閱讀 2443·2021-10-08 10:22
閱讀 2740·2021-09-29 09:35
閱讀 927·2021-09-22 15:20
閱讀 2916·2019-08-30 15:53
閱讀 2479·2019-08-30 13:55
閱讀 1156·2019-08-29 17:27
閱讀 2947·2019-08-29 17:26