web-dev-qa-db-ja.com

JQuery、setTimeoutが機能しない

私はまだ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()」は初めて実行されますが、再び実行されることはありません。

50
Bolt_Head

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

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

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

それがそれをクリアすることを願っています。

113
cletus
setInterval(function() {
    $('#board').append('.');
}, 1000);

ある時点で停止したい場合は、clearIntervalを使用できます。

20
meder omuraliev

SetTimeoutは、指定された期間後にコードセットを実行するために使用されます。したがって、指定された時間間隔で毎回関数を呼び出すため、要件ではsetIntervalを使用することをお勧めします。

8
Goysar

これは同じことを達成しますが、はるかに簡単です:

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

ほとんどすべてのjQueryメソッドの前に遅延をチェーンできます。

0
Victor Stoddard