【问题标题】:AJAX jQuery - update content every full minuteAJAX jQuery - 每整分钟更新一次内容
【发布时间】:2014-03-13 16:43:00
【问题描述】:

如果用户计算机上的系统时钟看起来像这样,我正在考虑每整分钟刷新一次的时钟。 11:08:00、11:09:00等刷新。

我试过setInterval():

setInterval(function(){
    $.ajax({
        url: "../time.php",
        context: document.body,
        success: function(result){
            $('.time').html(result);
        }
    })
}, 60000);

但它会在页面加载后每分钟重新加载一次。

有什么解决办法吗?

【问题讨论】:

  • @Lorenzo 不,那是 6 秒。

标签: javascript jquery ajax time


【解决方案1】:

setInterval() 不会立即调用它的函数,在这种情况下函数第一次运行将是页面加载后 60 秒。您可以进行以下更改以获得所需的结果:

  • 将 AJAX 请求放入函数中
  • 页面加载后立即调用函数
  • .ajax() 的成功函数中使用setTimeout(),而不是围绕整个事情使用setInterval()。如果请求出现错误,setInterval() 将继续进行,但setTimeout() 将在请求成功之前不会再次进行。
  • 拆分结果,节省几秒钟的时间,如果结果与.time 中已有的不同,请更改它。这假设 result 是一个类似 11:08:00 的字符串
  • 如果您想确认服务器何时返回分钟已更改的时间,您需要每秒检查一次
function update(){
    $.ajax({
        url: "../time.php",
        context: document.body,
        success: function(result){
            var secondless = result.split(':'), $time = $('.time');
            secondless = secondless [0]+':'+secondless [1];
            $time.html(function(_,v){
                return secondless != v ? secondless : v
            }
            setTimeout(update, 1000);
        }
    })
}
update();

【讨论】:

  • 从页面加载开始仍然是每 60 秒一次,而不是每分钟更改一次。您还可能会在 AJAX 请求返回响应时引入错误。
  • 我完全误解了 - 奇怪的是我如何更好地理解你写的两行而不是实际问题中的整个描述。谢谢。
  • @AnthonyGrist 编辑完成。
【解决方案2】:

试试这个代码:

var interval    =   0;
function start(){
    setTimeout( function(){
        ajax_function();
        interval    =   60;
        setInterval( function(){
            ajax_function();
        }, interval * 1000);
    }, interval * 1000);    
}

function ajax_function(){
    $.ajax({
        url: "../time.php",
        context: document.body,
        success: function(result){
            $('.time').html(result);
        }
    }); 
}

$( window ).load(function(){
    var time    =   new Date();
    interval    =   60 - time.getSeconds();
    if(interval==60)
        interval    =   0;
    start();
});

【讨论】:

  • 这就是我一直在寻找的东西,伙计,你很棒
  • 很高兴我能帮上忙...:)
【解决方案3】:
var d = new Date();
var n = d.getSeconds(); 
while(n != 0){
    d = new Date();
    n = d.getSeconds(); 
    if(n == 0){
         setInterval(function(){
           $.ajax({
               url: "../time.php",
               context: document.body,
               success: function(result){
                    $('.time').html(result);
                }
             })
         }, 60000);
    }
} 

【讨论】:

  • 只有当系统得到一整分钟时才会调用 ajax。比如:当时间是 10:10:59 时它不会开始当时间是 10:11:00 时它会开始并且每整分钟都会被调用
  • setTimeout(update, 60000); 是什么?在哪里?或者这是由于从另一个答案复制而来的。
  • 我复制了错误的ajax rsrs,我想从问题中复制
  • 嗯,我只是展示了整分钟开始的逻辑,如果 setTimeout 有效,请使用 setTimeout。
  • @Jai setTimeout() 是错误的功能。它只执行一次,这意味着您必须自己再次初始化它。您可以这样做 1. 立即(使其毫无意义)或 2. 当 AJAX 请求返回时(使代码错误)。如果您希望在每分钟更改时发送请求,则需要 60 秒的间隔,您不希望 60 秒加上 AJAX 请求实际花费的额外时间。
【解决方案4】:

如果你想根据用户的系统时间精确​​地在分钟运行你的函数,那么你需要实例化 Date 时间对象并检查 getSeconds() 的当前状态,如果它等于 0,那么你就在分钟,如果不是,您需要从 60 中减去它的结果,然后将其传递给 setTimeout,它将在该分钟准确地调用 setInterval 函数。

粗略的例子;

var time = new Date();
var timeout = 0;

if ( time.getSeconds() != 0 ) {
   timeout = (60 - time.getSeconds());
}

setTimeout(function(){

    setInterval( function(){
    $.ajax({
      url: "../time.php",
      context: document.body,
      success: function(result){
        $('.time').html(result);
      }
    })}, 60000);

}, timeout);

代码高尔夫球手的替代示例;

setTimeout(function(){

    setInterval( function(){
    $.ajax({
      url: "../time.php",
      context: document.body,
      success: function(result){
        $('.time').html(result);
      }
    })}, 60000);

}, (60 - new Date().getSeconds()) );

【讨论】:

    【解决方案5】:

    user2703250 几乎是正确的,请参阅下面的编辑版本:

    var d = new Date();
    var n = d.getSeconds(); 
    while(n !== 0){
    d = new Date();
    n = d.getSeconds(); 
    if(n === 0){ dopage_update();}
    }
    
    function dopage_update(){
         $.ajax({
                url: "../time.php",
                context: document.body,
                success: function(result){
                      $('.time').html(result);
                      setTimeout(function(){dopage_update();}, 60000);
                }
              });
             }
    

    【讨论】:

      【解决方案6】:

      如果我没猜对你,你可以在第一次运行动作时检查时钟,并在时钟到达下一个hh:mm:00 时使用seTimeout 触发setInterval

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 2020-06-23
        • 2011-06-23
        • 2020-07-09
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        相关资源
        最近更新 更多