JQuery,setTimeout不起作用

Bol*_*ead 50 javascript jquery settimeout

我还是JQuery的新手,在让我的ajax示例工作的过程中,我被setTimeout搞定了.我把它分解到应该添加的地方"." 每秒钟到div.

相关代码分为两个文件.

的index.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>
Run Code Online (Sandbox Code Playgroud)

myCode.js

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

   function update() { 
      $("#board").append(".");
      setTimeout('update()', 1000);     }
 })();
Run Code Online (Sandbox Code Playgroud)

myCode.js文件正常工作,"update()"第一次运行,但从未再次运行.

cle*_*tus 113

你在这里遇到了几个问题.

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

(function() {
  ...
)();
Run Code Online (Sandbox Code Playgroud)

做两件事.它定义了一个匿名函数并调用它.这样做的范围很广,但我不确定这是你真正想要的.

你正在传递一个代码块setTimeout().问题是这样update()执行时不在范围内.但是,如果你传入一个函数指针,那么这是有效的:

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

  function update() { 
    $("#board").append(".");
    setTimeout(update, 1000);     }
  }
)();
Run Code Online (Sandbox Code Playgroud)

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

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

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

function update() { 
  $("#board").append(".");
  setTimeout(update, 1000);     }
}
Run Code Online (Sandbox Code Playgroud)

要么

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

function update() { 
  $("#board").append(".");
  setTimeout('update()', 1000);     }
}
Run Code Online (Sandbox Code Playgroud)

这两项都有效.第二个工作原因是因为update()代码块内部现在在范围内.

我也更喜欢$(function() { ... }缩短的块形式,而不是setTimeout()update()你内部调用只能使用setInterval():

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

function update() {
  $("#board").append(".");
}
Run Code Online (Sandbox Code Playgroud)

希望能够解决这个问题.

  • w3schools在许多情况下并不正确,也没有推广Web标准的最佳实践.我建议使用MDC:https://developer.mozilla.org/En/Window.setTimeout (13认同)
  • 在这种情况下,w3schools是正确的.这个问题是一个范围问题. (3认同)

med*_*iev 20

setInterval(function() {
    $('#board').append('.');
}, 1000);
Run Code Online (Sandbox Code Playgroud)

如果要在某一点停止,可以使用clearInterval.

  • 传递像'update()'这样的代码块是有效的,但不是首选. (2认同)

Goy*_*sar 8

SetTimeout用于使您的代码集在指定的时间段后执行,因此对于您的要求,最好使用setInterval,因为这将在每次指定的时间间隔调用您的函数.

  • 我不同意,setTimout是更好的做法,在函数update()花费超过1秒运行的情况下,你可以同时运行同一个函数的多个实例.如果你使用setTimeout,函数update()必须在下一个时间循环发生之前完全完成,因此一次只能运行一个实例. (3认同)