ClearInterval не останавливается

Я пытаюсь использовать setInterval для проверки изменения хеш-значения, когда человек нажимает кнопку отправки. При нажатии кнопки отправки страница не изменится вообще. Меняется только значение хеша. Я хочу использовать setInterval для многократного поиска хеш-значения, пока оно не перейдет на страницу 2 (в случае, если введенные значения формы неверны). Как только страница2 будет обнаружена, setInterval очистится, но эта часть не работает.

var chkHash;
var hashval = window.location.hash;

var sb = document.getElementById("submitButton").onclick = function() {
    startHash();
}

function checkHash() {
   hv = window.location.hash;
   if (hashval !== hv ) { hashval = hv; }

   if(/page2/i.test(hv)) {
      clearHash();
   }
}

function startHash() {
   chkHash = setInterval('checkHash()', 5000);
}

function clearHash() {
   clearInterval(chkHash);
}

person jeezyfreezy    schedule 04.10.2011    source источник
comment
Если это ваш фактический код, вам не хватает правых скобок во втором условном выражении.   -  person Darth Egregious    schedule 04.10.2011
comment
Благодарность! В этом была опечатка :)   -  person jeezyfreezy    schedule 04.10.2011
comment
Вам нужно проверить, что в startHash нет интервала, потому что, если вы уже установили его, идентификатор будет потерян, и он будет продолжаться вечно. Поэтому, если вы дважды щелкнете, ваш код не будет работать в его нынешнем виде. Кстати, я предлагаю вам поискать window.onhashchange и плагины, которые сделают это за вас. jquery связывает это и подгоняет для совместимости.   -  person davin    schedule 04.10.2011
comment
@davin, я думаю, это то, что происходит с кодом. Я замечаю, что он продолжает работать снова и снова. Любые предложения, чтобы исправить это? Я просмотрел window.onhaschange, но я читал, что это поддерживают только новые браузеры. Спасибо!   -  person jeezyfreezy    schedule 04.10.2011
comment
@ jsmoove88, jquery использует аналогичный метод, чтобы событие работало в старых браузерах. Я предлагаю вам использовать это.   -  person davin    schedule 04.10.2011
comment
@davin, спасибо. В данный момент я не могу использовать jquery, потому что вместе с этим фрагментом есть и другие коды, и мне нужно учиться с нуля. Спасибо!   -  person jeezyfreezy    schedule 04.10.2011


Ответы (1)


Некоторые улучшения:

//Inside startHash, change:
chkHash = setInterval('checkHash()', 5000);

//to
clearInterval(chkHash); //Don't create multiple timers
chkHash = setInterval(checkHash, 5000);

Я также рекомендую добавить var перед hv = window.location.hash внутри функции checkHash, чтобы переменная не просачивалась в глобальную область видимости.

person Rob W    schedule 04.10.2011