亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在JavaScript中設置時間延遲

如何在JavaScript中設置時間延遲

MYYA 2019-10-16 14:40:05
我的網站上有這片js可以切換圖像,但是第二次單擊圖像時需要延遲。延遲應為1000ms。因此,您將單擊img.jpg,然后將出現img_onclick.jpg。然后,您將單擊img_onclick.jpg圖像,然后應該有1000ms的延遲,然后才能再次顯示img.jpg。這是代碼:jQuery(document).ready(function($) {    $(".toggle-container").hide();    $(".trigger").toggle(function () {        $(this).addClass("active");        $(".trigger").find('img').prop('src', 'http://localhost:8888/images/img_onclick.jpg');    }, function () {        $(this).removeClass("active");        $(".trigger").find('img').prop('src', 'http://localhost:8888/images/img.jpg');    });    $(".trigger").click(function () {        $(this).next(".toggle-container").slideToggle();    });});
查看完整描述

3 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

用途setTimeout():


var delayInMilliseconds = 1000; //1 second


setTimeout(function() {

  //your code to be executed after 1 second

}, delayInMilliseconds);


查看完整回答
反對 回復 2019-10-16
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

javascript setTimeout和setInterval(other)中有兩種(最常用的)計時器函數類型


這兩種方法都具有相同的簽名。他們以回調函數和延遲時間為參數。


setTimeout在延遲之后僅執行一次,而setInterval在每個延遲毫秒后繼續調用回調函數。


這兩種方法都返回一個整數標識符,可用于在計時器到期之前清除它們。


clearTimeout和clearInterval這兩種方法采取從上面函數返回一個整數標識符setTimeout和setInterval


例:


setTimeout


alert("before setTimeout");


setTimeout(function(){

        alert("I am setTimeout");

   },1000); //delay is in milliseconds 


  alert("after setTimeout");

如果運行上面的代碼,您將看到它發出警報before setTimeout,然后after setTimeout最終I am setTimeout在1秒(1000毫秒)后發出警報


您可以從示例中注意到,setTimeout(...)異步是異步的,這意味著在等待下一個語句之前,它不會等待計時器過去alert("after setTimeout");


例:


setInterval


alert("before setInterval"); //called first


 var tid = setInterval(function(){

        //called 5 times each time after one second  

      //before getting cleared by below timeout. 

        alert("I am setInterval");

   },1000); //delay is in milliseconds 


  alert("after setInterval"); //called second


setTimeout(function(){

     clearInterval(tid); //clear above interval after 5 seconds

},5000);

如果運行上面的代碼,您將看到它發出警報before setInterval,然后after setInterval最終I am setInterval 在1秒(1000毫秒)后發出5次警報,因為setTimeout在5秒鐘后清除了計時器,否則每1秒鐘您將收到I am setInterval無限次警報。


瀏覽器內部如何運作?


我將簡要解釋。


要了解您必須了解JavaScript中的事件隊列。在瀏覽器中實現了一個事件隊列。每當js中觸發一個事件時,所有這些事件(例如click等)都會添加到此隊列中。當您的瀏覽器沒有什么要執行時,它將從隊列中獲取一個事件并逐一執行它們。


現在,當您調用setTimeout或setInterval您的回調在瀏覽器中注冊一個計時器,并在給定時間到期后將其添加到事件隊列中,并最終javascript從隊列中獲取事件并執行該事件。


發生這種情況是因為javascript引擎是單線程的,并且它們一次只能執行一件事。因此,他們無法執行其他javascript并跟蹤您的計時器。這就是為什么這些計時器是在瀏覽器中注冊的(瀏覽器不是單線程的),并且它可以跟蹤計時器并在計時器到期后在隊列中添加事件。


setInterval僅在這種情況下,會發生同樣的情況,即在指定的時間間隔后將事件一次又一次地添加到隊列中,直到事件被清除或刷新瀏覽器頁面。


注意


傳遞給這些函數的delay參數是執行回調的最短延遲時間。這是因為在計時器到期后,瀏覽器將事件添加到要由JavaScript引擎執行的隊列中,但是回調的執行取決于您事件在隊列中的位置,并且由于引擎是單線程的,因此它將在其中執行所有事件。隊列一個接一個。


因此,當您的其他代碼阻塞線程并且沒有給它時間來處理隊列中的內容時,回調可能需要比指定的延遲時間更多的時間來專門調用。


正如我提到的,javascript是單線程。因此,如果您長時間阻塞線程。


像這樣的代碼


while(true) { //infinite loop 

}

您的用戶可能會收到一條消息,指出頁面沒有響應。


查看完整回答
反對 回復 2019-10-16
  • 3 回答
  • 0 關注
  • 1245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號