0

screencast.orgのスクリーンキャストに沿って小さなsinatraアプリケーションを作成しようとしています。sinatraと一緒にajaxにjQueryを使用したいと思います。

起動するとすぐに、アプリがサーバーにリクエストを殺到します。Firebugは、リクエストが最大2MB/秒でマウントされることを示しています。

これらは私の内容ですlayout.erb

<!doctype html>
<html>
<head>
<title>Is it My Birthday</title>

<script src="jquery.js"></script>
<script>
function getUpdate()
{
  setTimeout(getUpdate, 1000);
  $("body").load("/");
}
</script>
</head>

<body>
<%= yield %>


<script>
$(getUpdate);
</script>
</body>
</html>

1秒に1回実行するのではなく、無限に実行します。どこが間違っているのですか?

4

2 に答える 2

2

setTimeout()タイムアウトして を呼び出す前に待機するのにミリ秒かかるため、getUpdate()1 秒待ってから別のload要求を送信します。その上で、ページをロードしていて、ページがロードされているときに、再度ロードするように指示し、それを繰り返します。

$(getUpdate);タグ内の HTML の一番下に移動する<script>か、ページの読み込みが完了したときに発生するページ イベント ハンドラー内に移動してみてください。


編集:

1秒ごとにロードしたい。

残念ながら、それはあなたがそうするように言っていることではありません:

$(getUpdate);
function getUpdate()
{
  $("body").load("/");

このスニペットは、ブラウザが JavaScript の解析getUpdate中に遭遇するとすぐに実行するようにブラウザに指示します。$(getUpdate);最初に実行するように指示されたのは$("body").load("/");、ページをリロードすることで、ブラウザが JavaScript を再解釈し、そこで認識$(getUpdate);してすぐにリロードします。

あなたsetTimeout(getUpdate, 1000);は決して処刑されません。

順序を変更します。

<script>
function getUpdate()
{
  setTimeout(getUpdate, 1000);
  $("body").load("/");
}
</script>

...
bunches of HTML
...

<script>
  $(getUpdate);
</script>
于 2012-09-05T18:55:37.717 に答える
2

1秒ごとにロードしたい。

次の作業は、 の途中<head>または最後で<body>、実際には問題ではありません。

<script>
function reload() {
  $("body").load("/");
}
setTimeout(reload, 1000);
</script>

ブリキ男が行った分析は正しいですが、解決策が間違っています...次の機能を検討してください。

function reload() {
  setTimeout(reload, 1000);
  $("body").load("/");
}

これが実行されると、setTimeout呼び出しにより関数が1 秒後に再度呼び出されるように設定されますが、すぐに返されるため、リロードは即座に行われます。関数の外に配置setTimeoutすることで、1 秒後にのみリロードが行われるようにします。ページがリロードされるため、コードが再度実行され、機能します。

于 2012-09-06T05:29:13.553 に答える