2013-03-07 75 views
1

我有这个JavaScript函数向外部PHP脚本提供AJAX请求,如果新检查与旧检查不同,我希望这会自动更新HTML <div>如果内容更改,自动刷新JS数组?

<script> 
window.setInterval(function() 
{ 
    $(function() 
    { 
    $.ajax({          
     url: 'api.php', data: "", dataType: 'json', success: function(rows)   
     { 
      for (var i in rows) 
      { 
       var row = rows[i];   
       var id = row[0]; 
       var vname = row[1]; 
       var Password = row[2] 
       $('#output').append("<hr />").append("<b>id: </b>"+id+"<b> name: </b>"+vname+" <b>Password: </b>"+Password); 
      } 
     } 
    });  
    }); 
}, 5000); 
    </script> 

目前这成功地返回,并与该数组中的内容更新DIV,问题是,因为加入window.setInterval(function()线,将服务器的连接,每5秒,并重复数据更新<div> ..当所有我想要的,它为它呼应了新的数据(如果有纽约州)

这是我其他的PHP脚本:

$STD = new mysqli ("localhost", "root", "hidden", "ajaxrequests"); 

     $array = array(); 
    $Query = $STD->prepare ("SELECT * FROM ajaxdata"); 
    $Query->execute(); 
    $Query->bind_result($ID, $Name, $Password); 

    while ($Query->fetch()) 
    { 
     $array[] = array ($ID, $Name, $Password); 
    } 

    echo json_encode($array); 
+0

为什么使用append而不是只写整个输出?另外,如果你想使用JSON字符串本身并假设JSON字符串不是太大,也许你只是将​​最近的字符串存储到一个变量中,将它与传入的字符串进行比较,如果匹配,则不做任何事情。如果它们不匹配,则用新数据覆盖整个DOM元素。 – 2013-03-07 20:46:31

+0

@MikeBrant你能提供一个例子吗? – user2146021 2013-03-07 20:49:06

+0

@MikeBrant此外,它已建立,它已经每隔5秒发送请求并存储响应。为什么不直接用每个请求来替换内容?无论如何(因为浏览器缓存非常高效),比较返回的内容和当前内容将花费比简单地更新DOM更长的时间。如果你的响应真的很大,那么你可能想要在服务器端对它进行哈希处理,并只比较哈希浏览器端来检查更新。 – 2013-03-07 20:52:15

回答

0

你的循环之前,只需添加到empty()通话。

<script> 
window.setInterval(function() 
{ 
    $(function() 
    { 
    $.ajax({          
     url: 'api.php', data: "", dataType: 'json', success: function(rows)   
     { 
      $('#output').empty(); 
      for (var i in rows) 
      { 
       var row = rows[i];   
       var id = row[0]; 
       var vname = row[1]; 
       var Password = row[2] 
       $('#output').append("<hr />").append("<b>id: </b>"+id+"<b> name: </b>"+vname+" <b>Password: </b>"+Password); 
      } 
     } 
    });  
    }); 
}, 5000); 
</script> 

当然,如果您的数据量很大,这不会是非常优化的。我实际上建议让PHP服务器发送一个时间戳值与它的响应。然后,您可以在后续的AJAX请求中将其传回,并让服务器确定自上次时间戳以来是否存在实际的更新。然后您可以让服务器只发送更新的记录,您可以添加/更新类似于您已经在做的事情。

+0

我会+1,但我没有15重新。但是当定时器启动时,我会接受这个答案。谢谢你的回应,我并不是要求一个例子......但是,我已经给予的方式,有没有更简单的方法来解决这个问题?只是一个简单的是或否的答案会冲浪 – user2146021 2013-03-07 20:55:35

+0

@ user2146021与编程世界中的所有内容一样,最好的方法通常针对您的用例。如果我正在处理大型数据集,我当然不希望每5秒传递完整的数据集,然后请客户端浏览器全面更新。我会考虑在服务器和客户端之间只传递增量数据更改的方法。您目前的方法很简单,可以在可预见的未来满足您的需求。只有你可以决定是否值得你实现的努力是更优化的方法。 – 2013-03-07 20:58:11

+0

非常感谢您的时间!谢谢! – user2146021 2013-03-07 21:01:45