我正在尝试按照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>
它不是每秒运行一次,而是无限运行。我哪里出错?
答案 0 :(得分:2)
setTimeout()
需要在超时和调用getUpdate()
之前等待的毫秒数,因此等待一秒钟然后发送另一个load
请求。最重要的是,你正在加载页面,然后,当页面加载时,告诉它再次加载,并重复这样做。
尝试将$(getUpdate);
移动到<script>
标记中的HTML底部,或者在页面加载完成后触发的页面事件处理程序内。
编辑:
我希望它每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>
答案 1 :(得分:2)
我希望它每1秒加载一次。
<head>
或<body>
末尾的以下作品并不重要。
<script>
function reload() {
$("body").load("/");
}
setTimeout(reload, 1000);
</script>
由the Tin Man完成的分析是正确的,但解决方案是错误的......考虑这个函数:
function reload() {
setTimeout(reload, 1000);
$("body").load("/");
}
当它运行时,setTimeout
调用将函数设置为稍后再次调用 ,但它会立即返回,以便立即重新加载。通过将setTimeout
放在函数之外,我们确保仅在一秒钟之后重新加载。因为页面重新加载,代码再次执行,并且它可以工作!