在javascript中,定時器有兩種寸宏,一種是setTimeout()擂红,還有一種的setTimeout()
setTimeout()
setTimeout函數(shù)用來指定某個函數(shù)或某段代碼,在多少毫秒之后執(zhí)行咸作。它返回一個整數(shù),表示定時器的編號宵睦,以后可以用來取消這個定時器记罚。
var timerId = setTimeout(func|code, delay)
- 上面代碼中,setTimeout函數(shù)接受兩個參數(shù)壳嚎,第一個參數(shù)
func|code
是將要推遲執(zhí)行的函數(shù)名或者一段代碼桐智,第二個參數(shù)delay
是推遲執(zhí)行的毫秒數(shù)末早。 - 需要注意的是,推遲執(zhí)行的代碼必須以字符串的形式酵使,放入setTimeout荐吉,因為引擎內(nèi)部使用eval函數(shù),將字符串轉為代碼口渔。
如果推遲執(zhí)行的是函數(shù)样屠,則可以直接將函數(shù)名,放入setTimeout缺脉。一方面eval函數(shù)有安全顧慮痪欲,另一方面為了便于JavaScript引擎優(yōu)化代碼,setTimeout方法一般總是采用函數(shù)名的形式攻礼,就像下面這樣业踢。
function f(){
console.log(2);
}
setTimeout(f,1000);
// 或者
setTimeout(function (){console.log(2)},1000);
setInterval()
setInterval函數(shù)的用法與setTimeout完全一致,區(qū)別僅僅在于setInterval指定某個任務每隔一段時間就執(zhí)行一次礁扮,也就是無限次的定時執(zhí)行知举。
clearTimeout(),clearInterval()
setTimeout和setInterval函數(shù)太伊,都返回一個表示計數(shù)器編號的整數(shù)值雇锡,將該整數(shù)傳入clearTimeout和clearInterval函數(shù),就可以取消對應的定時器僚焦。
var id1 = setTimeout(f,1000);
var id2 = setInterval(f,1000);
clearTimeout(id1);
clearInterval(id2);
setTimeout和setInterval返回的整數(shù)值是連續(xù)的锰提,也就是說,第二個setTimeout方法返回的整數(shù)值芳悲,將比第一個的整數(shù)值大1立肘。利用這一點,可以寫一個函數(shù)名扛,取消當前所有的setTimeout谅年。
(function() {
var gid = setInterval(clearAllTimeouts, 0);
function clearAllTimeouts() {
var id = setTimeout(function() {}, 0);
while (id > 0) {
if (id !== gid) {
clearTimeout(id);
}
id--;
}
}
})();```
運行上面代碼后,實際上再設置任何setTimeout都無效了肮韧。
###運行機制
setTimeout和setInterval的運行機制是:
1. 將指定的代碼移出本次執(zhí)行踢故,等到下一輪Event Loop時,再檢查是否到了指定時間惹苗。
2. 如果到了殿较,就執(zhí)行對應的代碼;如果不到桩蓉,就等到再下一輪Event Loop時重新判斷淋纲。
這意味著,setTimeout指定的代碼院究,必須等到本次執(zhí)行的所有代碼都執(zhí)行完洽瞬,才會執(zhí)行本涕。
setTimeout的作用是將代碼推遲到指定時間執(zhí)行,如果指定時間為0伙窃,即setTimeout(f,0)菩颖,那么不會立刻執(zhí)行
setTimeout(f,0)將第二個參數(shù)設為0,作用是讓f在現(xiàn)有的任務(腳本的同步任務和“任務隊列”中已有的事件)一結束就立刻執(zhí)行为障。也就是說晦闰,setTimeout(f,0)的作用是,盡可能早地執(zhí)行指定的任務鳍怨。
#DOM
>之前呢基本上都是在講這個js的語法啊呻右,但是現(xiàn)在就把html 和js結合起來了。
文檔對象模型 (DOM) 是HTML和XML文檔的編程接口鞋喇。它給文檔(結構樹)提供了一個結構化的表述并且定義了一種方式—程序可以對結構樹進行訪問声滥,以改變文檔的結構,樣式和內(nèi)容侦香。
DOM 提供了一種表述形式將文檔作為一個結構化的節(jié)點組以及包含屬性和方法的對象落塑。從本質(zhì)上說,它將web 頁面和腳本或編程語言連接起來了罐韩。
![](http://upload-images.jianshu.io/upload_images/961879-30d442b188b865e3.gif?imageMogr2/auto-orient/strip)
要改變頁面的某個東西憾赁,JavaScript就需要獲得對HTML文檔中所有元素進行訪問的入口。這個入口伴逸,連同對 HTML 元素進行添加缠沈、移動膘壶、改變或移除的方法和屬性错蝴,都是通過DOM來獲得的
##document 對象
* 每個載入瀏覽器的HTML文檔都會成為document對象。document對象包含了文檔的基本信息颓芭,我們可以通過JavaScript對HTML頁面中的所有元素進行訪問顷锰、修改。
####document對象常用屬性
document對象有很多屬性來描述文檔信息亡问,介紹幾個常用的
* ####doctype
在書寫HTML文檔的時候第一句一般都是doctype聲明官紫,可以通過document對象獲取,沒有則返回null
`document.doctype; // <!DOCTYPE html>document.doctype.name; // "html"`
* ####head州藕、body
`document.head;`
`document.body;`
通過這兩個屬性何以分別獲取文檔的head束世,body節(jié)點
* ####activeElement
activeElement屬性返回當前文檔中獲得焦點的那個元素。
用戶通炒膊#可以使用tab鍵移動焦點毁涉,使用空格鍵激活焦點,比如如果焦點在一個鏈接上锈死,此時按一下空格鍵贫堰,就會跳轉到該鏈接
* ####documentURI穆壕、domain、lastModified
documentURI屬性返回當前文檔的網(wǎng)址
domain屬性返回文檔域名
lastModified返回當前文檔的最后修改時間
* location
location屬性返回一個只讀對象其屏,提供了當前文檔的URL信息
// 假定當前網(wǎng)址為
http://user:passwd@www.example.com:4097/path/a.html?x=111#part1
document.location.href // "http://user:passwd@www.example.com:4097/path/a.html?x=111#part1"
document.location.protocol // "http:"document.location.host // "www.example.com:4097"
document.location.hostname // "www.example.com"
document.location.port // "4097"
document.location.pathname // "/path/a.html"document.location.search // "?x=111"
document.location.hash // "#part1"
document.location.user // "user"
document.location.password // "passed"
// 跳轉到另一個網(wǎng)址
document.location.assign('http://www.google.com')
// 優(yōu)先從服務器重新加載
document.location.reload(true)
// 優(yōu)先從本地緩存重新加載(默認值)
document.location.reload(false)
// 跳轉到另一個網(wǎng)址喇勋,但當前文檔不保留在history對象中,
// 即無法用后退按鈕偎行,回到當前文檔
document.location.assign('http://www.google.com')// 將location對象轉為字符串川背,等價于document.location.href
document.location.toString()```
雖然location屬性返回的對象是只讀的,但是可以將URL賦值給這個屬性睦优,網(wǎng)頁就會自動跳轉到指定網(wǎng)址渗常。
document.location = 'http://www.example.com';// 等價于document.location.;
-
title、characterSet
title屬性返回當前文檔的標題汗盘,該屬性是可寫的
characterSet屬性返回渲染當前文檔的字符集
-
readyState
readyState屬性返回當前文檔的狀態(tài)皱碘,共有三種可能的值
loading:加載HTML代碼階段,尚未完成解析
interactive:加載外部資源階段
complete:全部加載完成
#######compatMode
compatMode屬性返回瀏覽器處理文檔的模式隐孽,可能的值為
BackCompat:向后兼容模式癌椿,也就是沒有添加DOCTYPE
CSS1Compat:嚴格模式,添加了DOCTYPE#######cookie
cookie是存儲在客戶端的文本菱阵,后續(xù)在客戶端存儲章節(jié)會介紹到-
innerText
innerText是一個可寫屬性踢俄,返回元素內(nèi)包含的文本內(nèi)容,在多層次的時候會按照元素由淺到深的順序拼接其內(nèi)容
<div> <p> 123 <span>456</span> </p></div>
外層div的innerText返回內(nèi)容是 "123456"
-
innerHTML晴及、outerHTML
innerHTML屬性作用和innerText類似都办,但是不是返回元素的文本內(nèi)容,而是返回元素的HTML結構虑稼,在寫入的時候也會自動構建DOM
<div> <p> 123 <span>456</span> </p></div>
外層div的innerHTML返回內(nèi)容是 "<p>123<span>456</span></p>"
outerHTML 返回內(nèi)容還包括本身
- #######document對象常用方法
- open()琳钉、close()
document.open方法用于新建一個文檔,供write方法寫入內(nèi)容蛛倦。它實際上等于清除當前文檔歌懒,重新寫入內(nèi)容
document.close方法用于關閉open方法所新建的文檔。一旦關閉溯壶,write方法就無法寫入內(nèi)容了及皂。 - write()
document.write方法用于向當前文檔寫入內(nèi)容。只要當前文檔還沒有用close方法關閉且改,它所寫入的內(nèi)容就會追加在已有內(nèi)容的后面验烧。
document.open();
document.write("hello");
document.write("world");
document.close();```
1. 如果頁面已經(jīng)渲染完成再調(diào)用write方法,它會先調(diào)用open方法又跛,擦除當前文檔所有內(nèi)容碍拆,然后再寫入。
2. 如果在頁面渲染過程中調(diào)用write方法,并不會調(diào)用open方法倔监。
需要注意的是直砂,雖然調(diào)用close方法之后,無法再用write方法寫入內(nèi)容浩习,但這時當前頁面的其他DOM節(jié)點還是會繼續(xù)加載静暂。
#####*除了某些特殊情況,應該盡量避免使用document.write這個方法谱秽。