javascript - 在请求之间使秒表保持事件状态

标签 javascript ractivejs

我是 Ractive.js 的新手。我需要实现一个秒表,即使我点击另一个页面,它也会运行。我的秒表正在运行,但当我单击另一个页面然后返回当前页面时,秒表消失了。谁能帮我解决这个问题?以下是我的尝试:

在我看来>>>

<div class="modal-footer">
        <div class="form-group">
            <div class="pull-left">
                Stopwatch: {{#stopWatch}} {{hours}} h: {{minutes}} m: {{seconds}} s{{/stopWatch}}
            </div>
            <button id="btnStart" class="btn btn-primary" type="button" on-click="startStopWatch">Start</button>
            <button id="btnReset" class="btn btn-secondary" type="button" on-click="startStopWatch">Reset</button>
        </div>
        <label class="pull-left stopWatch">  Time Spent:</label>
    </div>

我的 startStopWatch 函数 >>>

function startStopWatch(ev, cfg) {
    var rjs = this || cfg.rjs;
    var $btn = $(ev.node);
    var btnText = $btn.text();
    var sg;

    if (btnText === 'Start') {
        $btn.html('Stop');
        sg = new cmnDt.stopWatch();
        sg.start(rjs, sg);
    } else if (btnText === 'Stop'){
        $btn.html('Start');
        sg = ev.context.sw;
        sg.stop(rjs, sg);
    }

    if (btnText === 'Reset' && ev.context.sw) {
        sg = ev.context.sw;
        sg.reset(rjs, sg);
        $('#btnStart').html('Start');
    }
}

我的秒表功能>>>

function stopWatch() {

        var currentSeconds = 0;
        var currentMinutes = 0;
        var currentHours = 0;
        var timer;

        function start(rjs, sw) {
            printTime(rjs, sw);
            timer = setInterval(function () {
                getTime();
                printTime(rjs, sw);
            }, 1000);
        }

        function getTime(rjs) {
            currentSeconds = currentSeconds + 1;
            if (currentSeconds === 60) {
                currentMinutes += Math.round((currentSeconds) / 60);
                currentSeconds = 0;
            } else if (currentSeconds === 60 && currentMinutes === 60) {
                currentMinutes = 0;
                currentSeconds = 0;
                currentHours += 1;
            }
        }

        function printTime(rjs, sw) { 
            rjs.set({'sw': sw, 'stopWatch.seconds': currentSeconds, 
                    'stopWatch.minutes': currentMinutes, 'stopWatch.hours': currentHours});
        }

        function stop(rjs, sw) {
            clearInterval(timer);
            printTime(rjs, sw);
            $('.stopWatch').text(' Time Spent: ' + currentMinutes + ' m : ' + currentSeconds + ' s.');
        }

        function reset(rjs, sw) {
            clearInterval(timer);
            currentSeconds = 0;
            currentMinutes = 0;
            currentHours = 0;
            printTime(rjs, sw);
        }

        return {
            start: start,
            stop: stop,
            reset: reset
        };
    }

最佳答案

如果您更改站点并返回,您的整个脚本将从头开始初始化。您需要永久存储秒表的当前值和当前值的时间戳。

为此有两个选项:local storagecookies .

在 ractive 中,这里是一个如何使用本地存储的例子:http://examples.ractivejs.org/todos

如果您实现了一个函数 saveToStorage() 和一个 initFromStorage(),那么如果您返回该站点,您的秒表可能会显示真实时间。但请注意,秒表并非“在某些背景下运行”。它只是从存储的最后一刻开始初始化。这很重要,因为例如当您在另一个站点时,您的秒表无法触发事件。


编辑 15.3.16

在这里找到 fiddle 中的工作秒表:

https://jsfiddle.net/cw67L17e/2/

我开始修改你的代码,但我认为最好从头开始设计。没时间深究ractivejs的特长。但我确实希望你能通过研究它学到一些新的和有用的想法。右侧的 fiddle 中有简短的使用提示。

备注:

  • 仅仅为了测量时间,您不需要狭义的“秒表”。正如您将看到的,存储时间戳就足够了。实际上,您只需要 prepareToLeave()resume() 方法。
  • 我建议不要将秒、分和小时作为组合类型处理。只需处理时间戳并在必要时转换它们,如 millisToHMS() 所示。因为处理 millis 是一种通用的方法,也将允许许多其他任务。
  • 考虑 localStorage.setItem()localStorage.getItem()
  • 如果您想自动化,您可以在文档准备好或加载 (document.ondomcontentready) 时立即调用 resume()。在那里你必须找到你的 ractivejs 方式。

关于javascript - 在请求之间使秒表保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35980332/

相关文章:

javascript - D3.js 是否支持 native 移动应用程序?

javascript - 如何通过 ms chakracore JavaScript 引擎调用 C++ 函数或方法?

javascript - 如何在单击元素后保持悬停样式? (jQuery)

javascript - 三 mustache 上的 Ractive JS 事件

javascript - 使用加载器时扩展 Ractive 组件

javascript - Reset() 后 Ractive 表达式不起作用

javascript - AngularJS 项目配置

javascript - Node.js:如何用 C++ 创建 ES6 模块

javascript - Ractive.js 将对象设置为 radio 输入值

ractivejs - 活跃 : How to access a variable integer index keypath of an array in a Ractive view