0

我正在尝试按照screencast.org截屏视频的方式编写一个小型 sinatra 应用程序。我想将 jQuery 与 sinatra 一起用于 ajax。

我一开始,我的应用程序就会向服务器发出大量请求。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>

它不是每秒运行一次,而是无限运行。我哪里出错了?

4

2 回答 2

2

setTimeout()在超时和调用之前需要等待的毫秒数getUpdate(),所以它等待一秒钟然后发送另一个load请求。最重要的是,您正在加载页面,然后在页面加载时,告诉它再次加载,并重复执行此操作。

尝试将您$(getUpdate);的标签移到 HTML 的底部<script>,或者在页面完成加载时触发的页面事件处理程序中。


编辑:

我希望它每 1 秒加载一次。

不幸的是,这不是你告诉它要做的事情:

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

这段代码告诉浏览器在解析 JavaScriptgetUpdate时立即运行,它确实如此。$(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>

Tin Man所做的分析是正确的,但分辨率是错误的......考虑这个函数:

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

当它运行时,setTimeout调用将函数设置为在一秒钟后再次调用,但它会立即返回,因此重新加载会立即发生。通过放置setTimeout函数,我们确保重新加载仅在一秒钟后发生。因为页面重新加载,代码再次执行,它工作了!

于 2012-09-06T05:29:13.553 回答