JavaScript: clearInterval (); не работает

Обновление: за последние несколько лет пейзаж резко изменился. Теперь вы можете надежно использовать querySelector и querySelectorAll, см. ответ Wojtek , как это сделать.

Теперь нет необходимости в зависимости от jQuery. Если вы используете jQuery, отлично ... если вы этого не сделаете, вам не нужно полагаться только на выбор элементов по атрибутам.


Существует не очень короткий способ сделать это в ванильном javascript, но есть некоторые доступные решения.

Вы делаете что-то вроде этого, перебираете элементы и проверяете атрибут

Если библиотека, подобная jQuery - это вариант, вы можете сделать это немного проще, например:

$("[myAttribute=value]")

Если значение не является допустимым идентификатором CSS ( в нем есть пробелы или знаки препинания и т. д.), вам нужны кавычки вокруг значения (они могут быть одиночными или двойными):

$("[myAttribute='my value']")

Вы также можете делать start-with, ends-with, contains и т. д. существует несколько опций для селектора атрибутов .

0
задан Huangism 13 July 2018 в 14:01
поделиться

1 ответ

Там две потенциальные проблемы, setInterval( ... ,1000) попытается вызвать функцию обратного вызова каждые 1000 миллисекунды, но это может быть больше, поэтому вы можете пропустить секунду.

t объясните свой комментарий:

Когда я запускаю проблему, как только это время будет достигнуто, я смогу увидеть «Мы добрались туда», и теоретически она должна прекратиться (т.е. не больше подсчет). Но подсчет продолжается. Не могли бы вы запустить код?

Это может произойти только в том случае, если вы дважды щелкните Submit с разными значениями для полей ввода. Поскольку, если вы нажмете Submit, тогда будет создан дополнительный интервал, но текущий текущий не будет очищен, потому что add находится в области incrementCount.

Итак, если вы нажмете Submit ad понять, что время до пути либо в прошлом, либо недействительно, и вы обновили значения для ввода и снова щелкнули Submit, тогда у вас есть хотя бы один интервал, который больше не перестанет считать.

Чтобы решить проблему, вам нужно переместить add из области действия incrementCount и вызвать clearInterval(add) перед созданием нового интервала. Я перемещаю код в IIFE, чтобы add не загрязнял глобальную область и не использовал addEventListener.

(function() {
  var add

  document.getElementById('submit').addEventListener('click', function() {
    incrementCount()
  }, false)

  function incrementCount() {
    // clear old interval
    clearInterval(add)

    var time = document.getElementById("time").value;
    var date = document.getElementById("date").value;
    document.getElementById("target").innerText = "Target " + date.toString() + "  " + time.toString();
    var time = time.split(":");
    var date = date.split("-");
    var sec_t = time[2];
    var min_t = time[1];
    var hour_t = time[0];
    var day_t = date[2];
    var month_t = date[1];
    var year_t = date[0];
    add = setInterval(
      function() {
        var today = new Date();
        var sec_c = today.getSeconds();
        var min_c = today.getMinutes();
        var hour_c = today.getHours();
        var day_c = today.getDate();
        var month_c = today.getMonth() + 1;
        var year_c = today.getFullYear();

        var display_str = "";

        //if(parseInt(year)==parseInt(year_t) && parseInt(month)==parseInt(month_t) && parseInt(day)==parseInt(day_t) && parseInt(hour) == parseInt(hour_t) && parseInt(min_t) == parseInt(time[1]) && parseInt(sec_t) == parseInt(time[2]))
        if (parseInt(year_t) == parseInt(year_c) &&
          parseInt(month_t) == parseInt(month_c) &&
          parseInt(day_t) == parseInt(day_c) &&
          parseInt(hour_t) == parseInt(hour_c) &&
          parseInt(min_t) == parseInt(min_c) &&
          parseInt(sec_t) == parseInt(sec_c)) {
          document.getElementById("current").innerText = "We Reached There";
          clearInterval(add);

        } else {
          display_str = year_c.toString() + "-" + month_c.toString() + "-" + day_c.toString() + " " + hour_c.toString() + ":" + min_c.toString() + ":" + sec_c.toString();
          document.getElementById("current").innerText = "Current " + display_str
        }

      }, 1000);
  }
})()
<img src="https://media.giphy.com/media/2vq8w7WI0oMBuDQULT/giphy.gif">
<br><br>
<form>
  <label>Date</label>
  <input type="Date" id="date">
  <br><br>
  <label>Time</label>
  <input type="time" id="time" value="16:50:30">
</form>
<br><br>
<input type="Submit" id="submit">
<br><br>
<span id="target">Please select time</span>
<br><br>
<span id="current"></span>

1
ответ дан t.niese 17 August 2018 в 12:41
поделиться
  • 1
    Спасибо, ваше право, проблема вызвана несколькими нажатиями Отправить. Есть ли способ удалить предыдущий интервал перед обработкой нового? Один из способов, по моему мнению, проверить, выходит ли какой-либо интервал (как это сделать?) И, если есть, очистить. Не могли бы вы помочь мне с кодом для этого? – Vikas NS 13 July 2018 в 14:31
  • 2
    @vikasns я обновил ответ – t.niese 13 July 2018 в 14:33
  • 3
    setInterval возвращает значение. вы можете вызвать clearInterval на нем – Alexander Taran 13 July 2018 в 14:34
  • 4
    @AlexanderTaran OP уже знает это и использует это в коде. Здесь проблема обзора. add сохраняется в области incrementCount, поэтому он недоступен, когда кнопка нажата в другое время. – t.niese 13 July 2018 в 14:35
  • 5
    Я запустил ваш код. Но проблема все еще сохраняется. Несколько кликов предотвратят остановку программы.! или я делаю что-то неправильно? – Vikas NS 13 July 2018 в 17:20
Другие вопросы по тегам:

Похожие вопросы: