【问题标题】:How to refresh DIV with AJAX when image is replaced?替换图像时如何使用 AJAX 刷新 DIV?
【发布时间】:2020-03-19 05:17:08
【问题描述】:

我有一个在线广播电台,我想为每首歌曲显示一张专辑图片。因为我能够通过 ftp 自动将当前播放歌曲 (artwork.png) 的图片上传到网络服务器,所以我做了在 html 页面上显示图像的脚本..

我的代码:

<div id="auto">
  <img id="artwork" src="artwork.png"></img>
</div>
function refresh() {
  setTimeout (function() {
    var timestamp = new Date().getTime();
    $('#auto').html('<img src="artwork.png?timestamp='+ timestamp +'"></img>');

    refresh();
  }, 1000);
}

$('#artwork').attr('src', 'artwork.png?timestamp=' + new Date().getTime());

除了自动刷新,一切都很好,所以我必须手动刷新页面才能加载新的替换图像。但我希望每当上传新图像时对 div 进行一次刷新,仅此而已。 refresh();的问题出在哪里

【问题讨论】:

    标签: javascript jquery html ajax timestamp


    【解决方案1】:

    首先,方法 refresh() 没有在您的 sn-p 中的任何地方调用,因此您需要先调用它。

    其次,最好使用setInterval 而不是setTimeout

    没有必要在 setTimeout 中调用refresh() 方法,因为它会在每次调用它自己时重新附加 setTimeout 方法,虽然它不会伤害你的程序员但是如果你想每秒调用一个程序那你应该去setInterval

    我还简化了您的代码。

    function refresh() {
      setInterval(function() {
        var timestamp = new Date().getTime();
        var newImage = 'https://picsum.photos/200?timestamp=' + new Date().getTime();
        $('#artwork').attr('src', newImage);
      }, 2000);
    }
    refresh();
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div id="auto">
      <img id="artwork" src="https://picsum.photos/200">
    </div>

    【讨论】:

    • 所以 OP 将在 5 秒后有 2 个间隔,在 10 秒后有 4 个间隔,在 15 秒后有 8 个间隔,在 20 秒后有 16 个间隔,...... - 为什么这会有用?
    • @Andreas 是的,谢谢,我已经在编辑我的答案了
    • setInterval 仍然没有真正的理由。 refresh() 使用 setTimeout 调用自身与您的 setInterval 版本相同。
    • 我知道,问题在于未调用的函数,但是正如您所说多次调用相同的方法绑定 setTimeout,所以更好的做法是使用间隔,这就是间隔的目的,对吧?
    • “这是最佳实践...” - 不,因为它完全取决于用例:setTimeout or setInterval?
    【解决方案2】:

    在现有代码中再添加一行代码

    function refresh() {
      setTimeout (function() {
        var timestamp = new Date().getTime();
        $('#auto').html('<img src="artwork.png?timestamp='+ timestamp +'"></img>');
        refresh();
      }, 1000);
    }
    refresh(); // new added line
    $('#artwork').attr('src', 'artwork.png?timestamp=' + new Date().getTime());
    

    【讨论】:

      【解决方案3】:

      您的代码存在问题,您创建了 refresh(),当调用它时应该调用一个函数来每秒刷新一次图像,因此您应该使用 setInterval() 代替。另外,您从未调用过 refresh()。所以,它不起作用,试试这个:-

      <script>
          function refresh() {
              setInterval(function() {
                  var timestamp = new Date().getTime();
                  $('#auto').html('<img src="artwork.png?timestamp='+ timestamp +'"></img>');
              }, 1000);
          }
          window.addEventListener('load', refresh);
      </script>
      

      因此,refresh() 被定义,并在页面加载时调用。 refresh() 然后执行 setInterval() ,它每秒执行一次匿名函数来更新图像。还有其他可能的优化,例如清除页面卸载间隔等,但这将完成工作。希望对你有帮助!!!

      【讨论】:

      • refresh(),开始间隔,调用自身。也许你应该重新考虑你的答案
      • 抱歉,忘记从初始代码 sn-p 中删除 refresh() 调用
      猜你喜欢
      • 2014-04-23
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多