如何在javascript中设置时间延迟

IT技术 javascript jquery
2021-01-11 05:10:07

我在我的网站中有一段 js 来切换图像,但是当您第二次单击图像时需要延迟。延迟应为 1000 毫秒。所以你会点击 img.jpg 然后 img_onclick.jpg 会出现。然后,您将单击 img_onclick.jpg 图像,在再次显示 img.jpg 之前应该有 1000 毫秒的延迟。

这是代码:

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();
    });
});
6个回答

使用setTimeout()

var delayInMilliseconds = 1000; //1 second

setTimeout(function() {
  //your code to be executed after 1 second
}, delayInMilliseconds);

如果您不想这样做setTimeout:请参阅此问题

如何同步进行?setTimeout 中的代码无法识别类属性。
2021-03-16 05:10:07
@ishandutta2007 请参阅下面的答案-> stackoverflow.com/a/49813472/3919057
2021-03-26 05:10:07
setTimeout(function(){


}, 500); 

将您的代码放在 { }

500 = 0.5 秒

2200 = 2.2 秒

等等。

ES-6 解决方案

下面是一个示例代码,它使用aync/await来实现实际延迟。

有很多限制,这可能没有用,但只是为了好玩而张贴在这里..

function delay(delayInms) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(2);
    }, delayInms);
  });
}

async function sample() {
  console.log('a');
  console.log('waiting...')
  let delayres = await delay(3000);
  console.log('b');
}
sample();

delay函数没有必要是异步的。当在异步函数的主体中等待由常规函数返回的 Promise 时,这种令人敬畏的延迟会起作用。
2021-03-15 05:10:07

在 javascriptsetTimeoutsetInterval其他)中有两种(主要使用)类型的计时器函数

这两种方法具有相同的签名。它们以回调函数和延迟时间为参数。

setTimeout在延迟后仅执行一次,而setInterval在每次延迟毫秒后继续调用回调函数。

这两种方法都返回一个整数标识符,可用于在计时器到期之前清除它们。

clearTimeout并且clearInterval这两种方法都采用从上述函数返回的整数标识符setTimeoutsetInterval

例子:

设置超时

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");

例子:

设置间隔

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 中触发事件时,所有这些事件(如单击等)都会添加到此队列中。当您的浏览器没有要执行的内容时,它会从队列中获取一个事件并一个一个地执行它们。

现在,当您调用setTimeoutsetInterval您的回调被注册到浏览器中的计时器时,它会在给定时间到期后添加到事件队列中,最终 javascript 从队列中获取事件并执行它。

之所以会这样,是因为 javascript 引擎是单线程的,一次只能执行一件事。因此,他们无法执行其他 javascript 并跟踪您的计时器。这就是为什么这些计时器在浏览器中注册的原因(浏览器不是单线程的)并且它可以跟踪计时器并在计时器到期后在队列中添加一个事件。

同样的情况setInterval在这种情况下,直到它被清除或浏览器页面刷新事件添加到队列中一次又一次的指定时间间隔后只。

笔记

您传递给这些函数的延迟参数是执行回调的最小延迟时间。这是因为在计时器到期后,浏览器会将事件添加到由 javascript 引擎执行的队列中,但回调的执行取决于您在队列中的事件位置,并且由于引擎是单线程的,它将执行中的所有事件一一排队。

因此,当您的其他代码阻塞线程并且没有时间处理队列中的内容时,您的回调有时可能需要超过指定的延迟时间才能被专门调用。

正如我所提到的,javascript 是单线程的。所以,如果你长时间阻塞线程。

喜欢这个代码

while(true) { //infinite loop 
}

您的用户可能会收到一条消息,说页面没有响应

setTimeout如果您不想要异步行为,则不要使用
2021-03-26 05:10:07
你能告诉我如何停止 setTimeout() 的异步行为吗?
2021-04-01 05:10:07

对于同步调用,您可以使用以下方法:

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}
调用 setTimeout,即使值为 0,也会将控制权移交给 javascript 事件循环中的下一项,因此您的代码将有效地暂停,直到它在 js 事件循环中再次出现
2021-03-18 05:10:07
出于某种原因, setTimeOut 的行为不像我期望的那样。谢谢!
2021-03-30 05:10:07