Приостановить и возобновить подсчет значений из localalstorage - PullRequest
0 голосов
/ 28 сентября 2018

Я использую этот код для таймера обратного отсчета до теста викторины.Это работает отлично.В этом мне нужно добавить две кнопки: кнопка «Пауза» и кнопка «Возобновить».Когда я нажимаю кнопку «Пауза», это время остановки, а когда я нажимаю кнопку «Возобновить», оно начинается с того места, где я приостанавливаю время.

Я пробовал этот код.Это не работает.

HTML-код

<div class="div__time">
    <div style="display: none;" id="overall_time"></div>
    <div id="overall_times"></div>
    <div class="total_time"></div>
</div>
<input id="pauseButton" type="button" value="Pause">
<input id="resumeButton" type="button" value="Resume">

JS-код

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>
<script>
    var speaking_ms = "00:00:10";
    var speaking_ms_arr = speaking_ms.split(":");
    var speaking_time_min_sec = (+speaking_ms_arr[0]) * 60 * 60 + (+speaking_ms_arr[1]) * 60 + (+speaking_ms_arr[2]);
    var speaking_time_min_sec = parseInt(speaking_time_min_sec) + 1;

    var speaking_value;

    if (localStorage.getItem("speaking_counter")) {
        if (localStorage.getItem("speaking_counter") <= 0) {
            speaking_value = speaking_time_min_sec;
        } else {
            speaking_value = localStorage.getItem("speaking_counter");
        }
    } else {
        speaking_value = speaking_time_min_sec;
    }

    document.getElementById('overall_time').innerHTML = speaking_value;

    var speaking_counter = function() {
        if (speaking_value <= 0) {
            localStorage.setItem("speaking_counter", speaking_time_min_sec);
        } else {
            speaking_value = parseInt(speaking_value) - 1;
            localStorage.setItem("speaking_counter", speaking_value);
        }
        document.getElementById('overall_time').innerHTML = speaking_value;
        if (speaking_value == 0) {
            localStorage.setItem("speaking_counter", speaking_value);
            setTimeout(function() {
                clearInterval(interval);
            }, 1000);
        }

        var hours = Math.floor(speaking_value / 3600);
        var minutes = Math.floor(speaking_value % 3600 / 60);
        var seconds = Math.floor(speaking_value % 3600 % 60);
        var red_time = hours + ' : ' + minutes + ' : ' + seconds;
        document.getElementById('overall_times').innerHTML = red_time;
    };

    var interval = setInterval(function() {
        speaking_counter();
    }, 1000);

    var Clock = {
        pause: function() {
                clearInterval(this.interval);
                delete this.interval;
            },

            resume: function() {
                if (!this.interval) this.start();
            }
    };

    $('#pauseButton').click(function() { Clock.pause(); });
    $('#resumeButton').click(function() { Clock.resume(); });
</script>

Fiddle Link

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

Вы уже получили довольно много ответов, я хотел бы привести еще один пример, чтобы у вас была альтернативная архитектура для рассмотрения.Обязательно прочитайте scopes и closures и используйте this.Кроме того, вам не нужен jQuery для этой функции.Импортируйте большую библиотеку, такую ​​как jQuery, только тогда, когда вам это нужно.В этом случае document.getElementById хорошо, как и addEventListener.

. Есть еще более интересные способы обработки обратного отсчета (включая использование рекурсии), но ниже приведен пример представления ваших часов какодин объект.Это дает вам больший контроль над часами и делает его многократно используемым.

Вы можете определять функции на часах, которые управляют интервалом, уменьшают обратный отсчет, приостанавливают, возобновляют, запускают и сбрасывают часы.Я добавил кнопки для каждой, чтобы вы могли видеть, как это будет работать.Также обратите внимание, что я закомментировал localStorage, чтобы показать, что он работает без хранилища, но в основном потому, что фрагментам в StackOverflow не разрешено использовать localStorage, поэтому он может аварийно завершить работу, но вы можете запустить этот код здесь как есть.

var Clock = {
  speaking_value: 10,
  interval: -1,
  countdown: function() {
    speaking_value = this.speaking_value;
    if (speaking_value <= 0) {
      //localStorage.setItem("speaking_counter", 0);
    } else {
      speaking_value = parseInt(speaking_value) - 1;
      //localStorage.setItem("speaking_counter", speaking_value);
    }
    document.getElementById('overall_time').innerHTML = speaking_value;
    if (speaking_value == 0) {
    //localStorage.setItem("speaking_counter", speaking_value);
      var self = this;
      setTimeout(function() {
        clearInterval(self.interval);
      }, 1000);
    }
    this.speaking_value = speaking_value;
    this.updateClock();
  }, 
  paused: false,
  pause: function() {
    clearInterval(this.interval);
    this.paused = true;
  },
  resume: function() {
    if (this.paused) { 
      this.paused = false;
      this.tick();    
    }
  },
  updateClock: function() {
    speaking_value = this.speaking_value;
    var hours = Math.floor(speaking_value / 3600);
    var minutes = Math.floor(speaking_value % 3600 / 60);
    var seconds = Math.floor(speaking_value % 3600 % 60);
    var red_time = hours + ' : ' + minutes + ' : ' + seconds;
    document.getElementById('overall_times').innerHTML = red_time;
  },
  tick: function() {
    var self = this;
    this.interval = setInterval(function() {
      self.countdown()
    }, 1000)
  },
  start: function() {
    this.updateClock();
    this.tick();
  },
  reset: function(){
    clearInterval(this.interval);
    this.speaking_value = 10;
    this.updateClock();
  }
};

Clock.updateClock();

document.getElementById('startButton').addEventListener('click', function() { Clock.start(); });

document.getElementById('pauseButton').addEventListener('click', function() { Clock.pause(); });

document.getElementById('resumeButton').addEventListener('click', function() { Clock.resume(); });

document.getElementById('resetButton').addEventListener('click', function() { Clock.reset(); });
<div class="div__time">
    <div style="display: none;" id="overall_time"></div>
    <div id="overall_times"></div>
    <div class="total_time"></div>
</div>
<input id="startButton" type="button" value="Start">
<input id="pauseButton" type="button" value="Pause">
<input id="resumeButton" type="button" value="Resume">
<input id="resetButton" type="button" value="Reset">
0 голосов
/ 28 сентября 2018

Ниже приведены ваши ошибки.( Fiddle link )

var Clock = {
    pause: function() {
            clearInterval(this.interval);//(this.interval is undefined, replace it with interval)
                          ^^^^
            delete this.interval;//(this.interval is undefined, replace it with interval)
                   ^^^^
        },

        resume: function() {
            if (!this.interval) this.start();//(this.interval is undefined, replace it typeof interval === undefined to check whether interval exists or not)
                 ^^^^
                                ^^^^^^^^^^^ //(this.start() is also not defined, replace it with start() and move `var interval = setInterval(fun.....` into new start function)
        }
};

посмотрите на следующий код.

var speaking_ms = "00:00:10";
var speaking_ms_arr = speaking_ms.split(":");
var speaking_time_min_sec = (+speaking_ms_arr[0]) * 60 * 60 + (+speaking_ms_arr[1]) * 60 + (+speaking_ms_arr[2]);
var speaking_time_min_sec = parseInt(speaking_time_min_sec) + 1;

var speaking_value;

if (localStorage.getItem("speaking_counter")) {
    if (localStorage.getItem("speaking_counter") <= 0) {
        speaking_value = speaking_time_min_sec;
    } else {
        speaking_value = localStorage.getItem("speaking_counter");
    }
} else {
    speaking_value = speaking_time_min_sec;
}

document.getElementById('overall_time').innerHTML = speaking_value;

var speaking_counter = function() {
    if (speaking_value <= 0) {
        localStorage.setItem("speaking_counter", speaking_time_min_sec);
    } else {
        speaking_value = parseInt(speaking_value) - 1;
        localStorage.setItem("speaking_counter", speaking_value);
    }
    document.getElementById('overall_time').innerHTML = speaking_value;
    if (speaking_value == 0) {
        localStorage.setItem("speaking_counter", speaking_value);
        setTimeout(function() {
            clearInterval(interval);
        }, 1000);
    }

    var hours = Math.floor(speaking_value / 3600);
    var minutes = Math.floor(speaking_value % 3600 / 60);
    var seconds = Math.floor(speaking_value % 3600 % 60);
    var red_time = hours + ' : ' + minutes + ' : ' + seconds;
    document.getElementById('overall_times').innerHTML = red_time;
};

var start = function() {
  interval = setInterval(function() {
      speaking_counter();
  }, 1000);
}

var Clock = {
    pause: function() {
            clearInterval(interval);
            delete interval;
        },

        resume: function() {
            if (typeof interval === 'undefined') start();
        }
};

$('#pauseButton').click(function() { Clock.pause(); });
$('#resumeButton').click(function() { Clock.resume(); });
start();
0 голосов
/ 28 сентября 2018

Я исправил ваше решение и реализовал то, что вы пытались реализовать.Были небольшие проблемы с вашим решением, которые я исправил.1. Вы использовали это для доступа к переменной интервала, которая не была частью объекта часов, в котором вы обращались к переменной.2. Вы использовали функцию this.start () в функции возобновления объекта часов, который не был частью объекта часов.3. JQuery, используемый для определения событий, не был включен в скрипку.Хотя это включено в код, вставленный в вопрос.html:

<html>

<head>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>

</head>
<body>
<div class="div__time">
    <div style="display: none;" id="overall_time"></div>
    <div id="overall_times"></div>
    <div class="total_time"></div>
</div>
<input id="pauseButton" type="button" value="Pause">
<input id="resumeButton" type="button" value="Resume">
</body>

js:

 var speaking_ms = "00:00:10";
    var speaking_ms_arr = speaking_ms.split(":");
    var speaking_time_min_sec = (+speaking_ms_arr[0]) * 60 * 60 + (+speaking_ms_arr[1]) * 60 + (+speaking_ms_arr[2]);
    var speaking_time_min_sec = parseInt(speaking_time_min_sec) + 1;

    var speaking_value;

    if (localStorage.getItem("speaking_counter")) {
        if (localStorage.getItem("speaking_counter") <= 0) {
            speaking_value = speaking_time_min_sec;
        } else {
            speaking_value = localStorage.getItem("speaking_counter");
        }
    } else {
        speaking_value = speaking_time_min_sec;
    }

    document.getElementById('overall_time').innerHTML = speaking_value;

    var speaking_counter = function() {
        if (speaking_value <= 0) {
            localStorage.setItem("speaking_counter", speaking_time_min_sec);
        } else {
            speaking_value = parseInt(speaking_value) - 1;
            localStorage.setItem("speaking_counter", speaking_value);
        }
        document.getElementById('overall_time').innerHTML = speaking_value;
        if (speaking_value == 0) {
            localStorage.setItem("speaking_counter", speaking_value);
            setTimeout(function() {
                clearInterval(interval);
            }, 1000);
        }

        var hours = Math.floor(speaking_value / 3600);
        var minutes = Math.floor(speaking_value % 3600 / 60);
        var seconds = Math.floor(speaking_value % 3600 % 60);
        var red_time = hours + ' : ' + minutes + ' : ' + seconds;
        document.getElementById('overall_times').innerHTML = red_time;
    };

    var interval = setInterval(function() {
        speaking_counter();
    }, 1000);


    var Clock = {
        pause: function() {
                clearInterval(interval);
                delete interval;
            },

            resume: function() {

                    interval = setInterval(function() {
                        speaking_counter();
                    }, 1000);

            }
    };

    $('#pauseButton').click(function() { Clock.pause(); });
    $('#resumeButton').click(function() { Clock.resume(); });

Вот ссылка на скрипку: JS Fiddle

0 голосов
/ 28 сентября 2018

Я изменил конец кода в скрипте, и это сработало: https://jsfiddle.net/bohv0j9w/5/

    var Clock = {
        pause: function() {
                clearInterval(interval);
                interval = null;
            },

            resume: function() {
                if (!interval) interval = setInterval(speaking_counter, 1000);
            }
    };

document.querySelector('#pauseButton').addEventListener("click", Clock.pause);
document.querySelector('#resumeButton').addEventListener("click", Clock.resume);

В вашей версии this.internal не определено, вы можете узнать об этом и областях в js,А $ (...) - это синтаксис, который требует lib jquery (не включается в скрипту), эквивалент vanilla js - «document.querySelector», вы должны прочитать статью MDN об этой функции.Наконец, ваш синтаксис немного староват.Если вы используете localStorage, вы не ориентируетесь на очень старые браузеры, возможно, вам следует избегать jquery и использовать такие ключевые слова, как «const».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...