当通过带有间隔的ajax加载json数据时,我遇到了一些奇怪的行为。 数据加载正常,只有在几个时间间隔后数据才会加密并在间隔之间保持运行。这甚至会导致浏览器崩溃
html页面
<script id="source" language="javascript" type="text/javascript">
$(function ahitRate()
{
$.ajax({
cache: false,
url: 'average.php',
data: 'jsonData',
dataType: 'json',
processData: false,
success: function(data)
{
var ahr = data[0]; //get id
var hitRate = data[1]; //get name
$('#output').html("<b>id: </b>"+ahr+"<b> name: </b>"+hitRate);
setInterval(ahitRate, 5000);
}
});
});
</script>
<script id="source" language="javascript" type="text/javascript">
$(function ahitRate()
{
$.ajax({
cache: false,
url: 'average.php',
data: 'jsonData',
dataType: 'json',
processData: false,
success: function(data)
{
var ahr = data[0]; //get id
var hitRate = data[1]; //get name
$('#output').html("<b>id: </b>"+ahr+"<b> name: </b>"+hitRate);
setInterval(ahitRate, 5000);
}
});
});
</script>
生成随机数据的json php代码
// Session
session_start();
// Set the JSON header
header("Content-type: text/json");
header('Cache-Control: no-cache, must-revalidate');
$y = rand(0, 100);
// Create a PHP array and echo it as JSON
$ret = array("Average", $y);
echo json_encode($ret);
?>
// Session
session_start();
// Set the JSON header
header("Content-type: text/json");
header('Cache-Control: no-cache, must-revalidate');
$y = rand(0, 100);
// Create a PHP array and echo it as JSON
$ret = array("Average", $y);
echo json_encode($ret);
?>
有任何建议如何解决这个问题?
答案 0 :(得分:2)
OMG!
你是在递归地调用它!
setInterval(ahitRate, 5000);
编辑:只需将setInterval(...)更改为setTimeout(ahitRate,5000);
每次执行时,旧的都会继续运行并添加一个新的,所以它将使用越来越多的内存!
$(function() {
function ahitRate()
{
$.ajax({
cache: false,
url: 'average.php',
data: 'jsonData',
dataType: 'json',
processData: false,
success: function(data)
{
var ahr = data[0]; //get id
var hitRate = data[1]; //get name
$('#output').html("<b>id: </b>"+ahr+"<b> name: </b>"+hitRate);
}
});
}
setInterval(ahitRate, 5000);
});
唯一不同的是我:
这将导致您的“ahitRate()”函数每5秒调用一次。
答案 1 :(得分:1)
setInterval保持触发 - 每次获得新响应时,都会启动一个新计时器。所以在五秒钟后,第一个计时器启动并启动另一个计时器。然后十秒钟后,两个计时器开火,再开始两个。
我想你可以看到它的发展方向。
我认为您正在寻找setTimeout()方法,或者只是在成功函数之外启动间隔计时器,因此永远不会再次调用它。