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

4 回答 4

113

你这里有几个问题。

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

(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(".");
}

希望能解决这个问题。

于 2009-09-30T02:57:15.173 回答
21
setInterval(function() {
    $('#board').append('.');
}, 1000);

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

于 2009-09-30T02:58:18.757 回答
8

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

于 2009-12-22T04:42:59.573 回答
0

这完成了同样的事情,但更简单:

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

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

于 2017-01-29T00:08:11.333 回答