javascript - MomentJS 重置/重用 DOM 元素来显示新时间

标签 javascript jquery momentjs

我现在已经在 3 个项目中遇到了这个问题,并且每次都完全放弃了这个概念。我想要一个名为 general_current-time 的 DOM 元素,它可以动态更改以匹配事件位置的当前时间。

当前发生的情况是第一次运行将按预期执行,但任何替换它的尝试仍将继续迭代第一个请求的时间。

我尝试在开始新的时间间隔之前清除该字段或替换文本。

有没有办法停止间隔并创建一个新的间隔?

下面的示例(已更新):

    function getTime(timezone) {
        stopTime(currTime);
        switch (timezone) {
            case 'Eastern':
                var b = "America/New_York"
                break;
            case 'Central':
                var b = "America/Mexico_City"
                break;
            case 'Mountain':
                var b = "America/Denver"
                break;
            case 'Pacific':
                var b = "America/Los_Angeles"
                break;
            case 'Arizona':
                var b = "America/Phoenix"
                break;
        }
        var currTime = setInterval(function () {
            var a = new moment().tz(b).format('hh:mm:ss a');
            $('#general_current-time').text(a);
        }, 1000)
    }

    function stopTime(currTime) {
        $('#general_current-time').text('Resetting..');
        clearInterval(currTime);
    }

最佳答案

如果您想清除它,则必须存储对 setInterval 的引用。

var timer = setInterval(...)

我还建议将其逻辑放入一个单独的函数中,以便在需要时调用,并缓存您的 jQuery 选择器。在计时器的每次迭代中检查时区是额外的工作(我怀疑客户端是否经常更改时区,如果有的话),并增加延迟以匹配显示的精度(在这种情况下,您显示的精度为秒,但您调用每秒间隔 10 次;这意味着 10 次调用中有 9 次是多余的)

// cache timezone 
var zone = {
  'Eastern': 'America/New York',
  'Central': 'America/Mexico_City',
  'Mountain': 'America/Denver',
  'Pacific': 'America/Los_Angeles',
  'Arizona': 'America/Phoenix'
}[data.Timezone];

// cache DOM element to update
var $time = $('#general_current-time');

function updateTime() {
  $time.text(moment().tz(zone).format('hh:mm:ss a'));
}

// store a reference to the timer. Also, since the format precision is
// seconds, only run this every ~1000ms
var interval = setInterval(updateTime, 1000);

请注意,updateTime 是不纯的,因为它使用其父范围中的 zone$time,因此肯定有一些改进可以实现该功能。

这将允许您停止计时器并开始新的计时器:

// stop the interval using the timer reference
clearInterval(interval);

var newInterval = setInterval(updateTime, 1000);
<小时/>

完整程序(来自codepen)

$(document).ready(function() {
  let interval;

  $("#la").click(function() {
    clear(interval);

    interval = setInterval(function() {
      $("#time").text(
        moment()
        .tz("America/Los_Angeles")
        .format("hh:mm:ss a")
      );
    });
  });

  $('#east').click(function() {
    clear(interval);

    interval = setInterval(function() {
      $('#time').text(moment().tz('America/New_York').format('hh:mm:ss a'));
    });
  });

  $('#clear').click(function() {
    clearInterval(interval);
  });
});

function clear(interval) {
  clearInterval(interval);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.min.js" type="text/javascript"></script>

<p id="time">00:00</p>
<button id="la">Arizona</button>
<button id="east">East</button>
<button id="clear">Clear</button>

关于javascript - MomentJS 重置/重用 DOM 元素来显示新时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325064/

相关文章:

Javascript 简单脚本不执行

jquery - 为什么类样式未应用于按钮

javascript - 使用 Jquery/JavaScript 构建翻译功能?

jquery - Bootstrap 日期范围选择器移动设备在更改日期时突出显示之前的日期

javascript - Momentjs 开始一天休息 4 分钟?

javascript - 在日期时间选择器 Bootstrap 中设置一天的时间范围

javascript - 使用 moment 来操作日期和时间

javascript - 有没有办法通过 Javascript 操作 Processing.js 生成的代码?

javascript - 如何在 HTML5 Canvas 中进行碰撞?

javascript - 从不同域访问 Json - 澄清吗?