51

私はまだJQueryに慣れていません.ajaxの例を機能させる途中で、setTimeoutで行き詰まりました。「。」を追加する必要がある場所に分解しました。毎秒divに。

関連するコードは 2 つのファイルにあります。

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>

およびmyCode.js

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

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

myCode.js ファイルは問題なく動作し、「update()」は最初は実行されますが、2 回目は実行されません。

4

4 に答える 4

113

ここにはいくつかの問題があります。

まず、無名関数内でコードを定義しています。この構造:

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

は 2 つのことを行います。無名関数を定義して呼び出します。これを行うには範囲の理由がありますが、それが実際に必要なものかどうかはわかりません。

にコード ブロックを渡しています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);     }
}

そして、これらの両方が機能します。2 番目は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 に答える