JQuery,setTimeout 不起作用

IT技术 javascript jquery settimeout
2021-03-01 16:03:51

我还是 JQuery 的新手,在让我的 ajax 示例工作的过程中,我遇到了 setTimeout 的问题。我已将其分解为应该添加“。”的位置。每秒到 div。

相关代码在两个文件中。

索引.html

<html><head>
<script type='text/javascript' src='jquery.js'></script>
<script type='text/javascript' src='myCode.js'></script>
</head>
<body>
<div id='board'>Text</div>
</body>
</html>

myCode.js

(function(){
   $(document).ready(function() {update();});

   function update() { 
      $("#board").append(".");
      setTimeout('update()', 1000);     }
 })();

myCode.js 文件工作正常,“update()”第一次运行但再也不会运行。

4个回答

你在这里有几个问题。

首先,您在匿名函数中定义您的代码这个构造:

(function() {
  ...
)();

做两件事。它定义了一个匿名函数并调用它。这样做有一定的范围原因,但我不确定这是您真正想要的。

您正在将代码块传递给setTimeout(). 问题是这样update()执行时不在范围内。但是,如果您传入一个函数指针,则此方法有效:

(function() {
  $(document).ready(function() {update();});

  function update() { 
    $("#board").append(".");
    setTimeout(update, 1000);     }
  }
)();

因为函数指针update在该块的范围内。

但就像我说的,不需要匿名函数,所以你可以像这样重写它:

$(document).ready(function() {update();});

function update() { 
  $("#board").append(".");
  setTimeout(update, 1000);     }
}

或者

$(document).ready(function() {update();});

function update() { 
  $("#board").append(".");
  setTimeout('update()', 1000);     }
}

和这两个工作。第二个有效,因为update()代码块内的现在在范围内。

我也更喜欢$(function() { ... }缩短的块形式,而不是setTimeout()在内部调用update()您可以setInterval()改为使用

$(function() {
  setInterval(update, 1000);
});

function update() {
  $("#board").append(".");
}

希望能解决这个问题。

w3schools 在许多情况下是不正确的,并且没有推广网络标准中的最佳实践。我建议 MDC:developer.mozilla.org/En/Window.setTimeout
2021-04-29 16:03:51
w3schools 在这种情况下是正确的。这个问题是一个范围问题。
2021-05-07 16:03:51
w3schools 真的是参考这个的最佳资源吗?如果他以那个页面为例,他也会犯同样的错误。
2021-05-14 16:03:51
只是为了您的信息api.jquery.com/delay ... 我正在搜索相同的内容并最终在这里和上面的链接。我将此添加到我的最爱,以便我可以参考此评论...
2021-05-16 16:03:51
谢谢,它奏效了。谁能解释为什么它不能像以前那样工作?我看过的每个例子都与我使用的格式更相似。
2021-05-19 16:03:51
setInterval(function() {
    $('#board').append('.');
}, 1000);

如果您想在某一时刻停止它,您可以使用 clearInterval。

我以前没有使用过 setInverval,但它似乎是实现我的目标的更直接的途径。谢谢
2021-04-26 16:03:51
cletus 似乎已将其添加到他的解决方案中;要学习的重要一点是,您应该向 setInterval/setTimeout 提供一个真正的函数,而不是将要评估的字符串,例如“update()”
2021-04-28 16:03:51
这个按预期工作,浪费时间使用 setTimeout
2021-04-30 16:03:51
传递像“update()”这样的代码块是有效的,但不是首选。
2021-05-14 16:03:51
为所有用户信息。api.jquery.com/delay - 如果您打算只使用 jquery,这是一个非常好的选择。
2021-05-21 16:03:51

SetTimeout 用于使您的代码集在指定的时间段后执行,因此根据您的要求,最好使用 setInterval,因为它每次都会在指定的时间间隔内调用您的函数。

我不同意, setTimout 是更好的做法,在函数 update() 运行时间超过 1 秒的情况下,您可以同时运行同一函数的多个实例。如果您使用 setTimeout 函数 update() 必须在下一个时间循环发生之前完全完成,因此一次只会运行 1 个实例。
2021-05-17 16:03:51

这完成了同样的事情,但要简单得多:

$(document).ready(function() {  
   $("#board").delay(1000).append(".");
});

您可以在几乎任何 jQuery 方法之前链接延迟。