基本的Ajax缓存问题
我有一个页面,我有时需要异步检查服务器,看看页面状态是否是最新的(基本上是Live或Offline)。 您将看到我有一个函数,其中var live在页面最初加载时设置。 然后,我向服务器执行ajax请求,以检索live的状态是true还是false。 我将初始实时变量与新返回的数据json对象进行比较。 如果它们是相同的我什么也不做,但如果有不同我应用一些CSS类。 我使用setTimeout以递归方式运行它(是否有更好的方法来递归执行此操作?)。
我的问题:data.live不会从它运行的初始时间改变,即使它在db中发生了变化。 我知道我的mysql正在工作,因为它在初始加载时重新调整了正确的值。 这似乎是一个缓存问题。
任何帮助是极大的赞赏。
function checkLive() { var live = ; $.ajax({ type: 'get', url: '/live/live.php', dataType: 'json', success: function(data) { console.log('checking for updates... current:' + data.live); if (data.live == live) { return; } else { var elems = $('div.player_meta, object, h3.offline_message'); if (data.live == '1') { elems.removeClass('offline').addClass('live'); } else { elems.addClass('live').addClass('offline'); } } } }); setTimeout(function() { checkLive() } ,15000); } checkLive();
使用$.ajax()
的cache
选项将缓存断路器附加到URL,如下所示:
$.ajax({ type: 'get', url: '/live/live.php', dataType: 'json', cache: false, //success, etc. });
如果这不解决它…看看firebug,看看是否正在发出请求(它应该在此之后肯定),如果它仍然是旧值,则问题是PHP,而不是JavaScript。
与此问题无关,只是一个侧面提示:如果您不需要参数,可以跳过匿名函数调用,这:
setTimeout(function() { checkLive() } ,15000);
可以只是:
setTimeout(checkLive, 15000);
您可以通过向url添加唯一ID来检查是否存在缓存问题:
将url: '/live/live.php',
更改为url: '/live/live.php',
url: '/live/live.php?'+new Date().getTime(),
干杯
G。
我认为Nick Craver有正确的回应。
对于问题的另一点是SetTimeout,您可以使用SetInterval()并避免递归调用。 但实际上我会使用setTimeout()并在15000时间添加一个因子。 将该因子设置为checklive的参数。 然后你会有一张支票,它会及时推迟。 这将避免他48小时后仍然在你的页面上的那个人的大量HTTp请求。
大多数情况下,用户可能会定期检查新页面,但是在网页上停留很长时间的人可能并不是真的存在。 这是我做过的一段代码。
function checkLive(settings) { (...) //HERE ajax STUFF setTimeout(function() { if ( (settings.reload <2000000000) && (settings.growingfactor > 1) ) { checkLive(settings); settings = jQuery.extend(settings,{reload:parseInt(settings.reload*settings.growingfactor,10)}); } },settings.reload); }