JavaScrip-->定時器

定時器

JavaScript提供定時執(zhí)行代碼的功能,叫做定時器(timer),主要由setTimeout()和setInterval()這兩個函數(shù)來完成。

setTimeout()

setTimeout函數(shù)用來指定某個函數(shù)或某段代碼,在多少毫秒之后執(zhí)行。它返回一個整數(shù),表示定時器的編號,以后可以用來取消這個定時器。

var timerId = setTimeout(func|code, delay)

上面代碼中,setTimeout函數(shù)接受兩個參數(shù),第一個參數(shù)func|code是將要推遲執(zhí)行的函數(shù)名或者一段代碼,第二個參數(shù)delay是推遲執(zhí)行的毫秒數(shù)。

console.log(1);
setTimeout('console.log(2)',1000);
console.log(3);
上面代碼的輸出結(jié)果就是1,3,2,因為setTimeout指定第二行語句推遲1000毫秒再執(zhí)行。

通常情況下我們都使用函數(shù)的形式

function f(){
  console.log(2);
}

setTimeout(f,1000);

// 或者

setTimeout(function (){console.log(2)},1000);

setInterval()

setInterval函數(shù)的用法與setTimeout完全一致,區(qū)別僅僅在于setInterval指定某個任務(wù)每隔一段時間就執(zhí)行一次,也就是無限次的定時執(zhí)行。

<input type="button" onclick="clearInterval(timer)" value="stop">

<script>
  var i = 1
  var timer = setInterval(function() {
    console.log(2);
  }, 1000);
</script>

上面代碼表示每隔1000毫秒就輸出一個2,直到用戶點擊了停止按鈕。

clearTimeout(),clearInterval()

setTimeout和setInterval函數(shù),都返回一個表示計數(shù)器編號的整數(shù)值,將該整數(shù)傳入clearTimeout和clearInterval函數(shù),就可以取消對應(yīng)的定時器。

var id1 = setTimeout(f,1000);
var id2 = setInterval(f,1000);

clearTimeout(id1);
clearInterval(id2);

運行機(jī)制

setTimeout和setInterval的運行機(jī)制是,將指定的代碼移出本次執(zhí)行,等到下一輪Event Loop時,再檢查是否到了指定時間。如果到了,就執(zhí)行對應(yīng)的代碼;如果不到,就等到再下一輪Event Loop時重新判斷。這意味著,setTimeout指定的代碼,必須等到本次執(zhí)行的所有代碼都執(zhí)行完,才會執(zhí)行。

setTimeout的作用是將代碼推遲到指定時間執(zhí)行,如果指定時間為0,即setTimeout(f,0),那么不會立刻執(zhí)行

setTimeout(f,0)將第二個參數(shù)設(shè)為0,作用是讓f在現(xiàn)有的任務(wù)(腳本的同步任務(wù)和“任務(wù)隊列”中已有的事件)一結(jié)束就立刻執(zhí)行。也就是說,setTimeout(f,0)的作用是,盡可能早地執(zhí)行指定的任務(wù)。

setTimeout(function (){
  console.log("你好!");
}, 0);

setTimeout(function() {
  console.log("Timeout");
}, 0);

function a(x) {
    console.log("a() 開始運行");
    b(x);
    console.log("a() 結(jié)束運行");
}

function b(y) {
    console.log("b() 開始運行");
    console.log("傳入的值為" + y);
    console.log("b() 結(jié)束運行");
}

console.log("當(dāng)前任務(wù)開始");
a(42);
console.log("當(dāng)前任務(wù)結(jié)束");

插入兩個CSS操作的介紹

window.getComputedStyle()

getComputedStyle方法接受一個DOM節(jié)點對象作為參數(shù),返回一個包含該節(jié)點最終樣式信息的對象。所謂“最終樣式信息”,指的是各種CSS規(guī)則疊加后的結(jié)果。

var div = document.getElementsByTagName('div')[0];
window.getComputedStyle(div).backgroundColor;

我們以前使用div.style也可以取到css的樣式

但是只能取到行內(nèi)css樣式, 也就是我們定義在style屬性里的

<div style="width: 300px;"></div>
<script>
var div = document.getElementsByTagName('div')[0];
console.log(div.style.width);//300px
console.log(div.style.height);//''
</script>

getComputedStyle()獲得的是計算之后的樣式

元素上currentStyle屬性

這個屬性跟window.getComputedStyle(div)一樣, 是一個包含該節(jié)點最終樣式信息的對象

var div = document.getElementsByTagName('div')[0];
div.currentStyle.width;

跟window.getComputedStyle區(qū)別:

  • window.getComputedStyle: IE6 7 8 不兼容
  • currentStyle: 標(biāo)準(zhǔn)瀏覽器不兼容

兼容性寫法:

var div = document.getElementsByTagName('div')[0];

function getStyle(obj, attr){
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }
    else{
        var currentStyle = getComputedStyle(obj);
        return currentStyle[attr];
    }
}

alert(getStyle(div, 'height'));

注意事項:

  • 復(fù)合樣式(不要獲?。?/li>
//IE
alert( getStyle(div, 'background') ); //undefined

//chrome
alert( getStyle(div, 'background') );//rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box


//firefox
alert( getStyle(div, 'background') );//''
  • 屬性值為駝峰命名

  • 不要使用獲取的顏色作比較

//IE
alert( getStyle(div, 'backgroundColor') ); //red

//chrome
alert( getStyle(div, 'backgroundColor') );//rgb()


//firefox
alert( getStyle(div, 'backgroundColor') );//red
  • 不要獲取未設(shè)置樣式的值
//IE
alert( getStyle(div, 'marginTop') ); //auto

//chrome
alert( getStyle(div, 'marginTop') );//0px


//firefox
alert( getStyle(div, 'marginTop') );//0px

因為每個瀏覽器的默認(rèn)樣式不一樣

還有什么東西不能拿來做判斷

  1. 所有相對路徑

img src; href等等

<img src="./img/1.png" alt="">
<script>
var img = document.getElementsByTagName('img')[0];
img.src == './img/1.png';//false


//它返回的是一個覺得路徑
console.log(img.src);//file:///C:/Users/Administrator/Desktop/img/1.png
</script>
  1. 顏色值

兼容性問題 不同的瀏覽器可能返回顏色關(guān)鍵字(red), rgb, 或者#111

  1. innerHTML的值

因為空格換行什么的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JavaScript提供定時執(zhí)行代碼的功能,叫做定時器(timer),主要由setTimeout()和setInt...
    風(fēng)隨風(fēng)去閱讀 215評論 0 0
  • 前言:在引用開發(fā)中,我們經(jīng)常需要在頁面中執(zhí)行一些周期性的操作,比如每隔一段時間就執(zhí)行某一固定的操作。而對于這樣的操...
    帥帥噠小白閱讀 5,418評論 1 3
  • 高級定時器 關(guān)于定時器要記住的最重要的事情是:指定的時間間隔表示何時將定時器的代碼添加到隊列,而不是何時實際執(zhí)行代...
    源境閱讀 591評論 0 1
  • 在javascript中,定時器有兩種,一種是setTimeout(),還有一種的setTimeout() set...
    Alkaidx閱讀 607評論 0 0
  • 作者:Simple said 承諾是三歲小孩子都會做的事,而懂得要共同承擔(dān),共同實現(xiàn)。是一個人成熟的表現(xiàn)。 相信承...
    嵐浠閱讀 350評論 0 3

友情鏈接更多精彩內(nèi)容