Как остановить цикл setInterval в Javascript вне кода без обновления браузера?

Это может быть довольно наивный вопрос, но мне действительно нужна помощь.

До написания этого поста я программировал на JSBin. Оказывается, я не догадывался, что я запустил цикл setInterval, запрашивающий userInput, и он продолжал цикл, и я не мог никуда щелкнуть, чтобы изменить код для исправления цикла. Это продолжало повторяться и повторяться. Дело дошло до того, что мне пришлось обновить и потерять весь свой жесткий код (я не вошел в систему, поэтому мой код не был сохранен)! Я хочу избежать этого в следующий раз.

Итак, мой вопрос заключается в том, как мне остановить любой такой цикл setInterval, чтобы я мог получить доступ к своему коду, изменить его и повторно запустить. Ниже приведен код, который демонстрирует мою проблему, если вы попытаетесь запустить его на JSBin.com (очевидно, это не тот код, который я писал ранее). Как видите, я не могу нажать на свой код, чтобы изменить его (или сохранить) каким-либо образом, что означает, что я теряю весь свой код!

Это может показаться бесполезным вопросом, но я действительно хочу знать, как это исправить, и, возможно, исправление его с помощью инструментов разработчика поможет мне ознакомиться с подавляющим набором инструментов, которые у него есть:P. Поэтому, пожалуйста, помогите мне, если вы знаете решение.

Спасибо, что нашли время, чтобы помочь мне! Я ценю его.

setInterval(demo,1);
function demo()
{
     var name = prompt("Enter your name: ");
}

3 ответа

Решение

Другой вариант заключается в поиске iframe на панели инструментов "Инструменты" разработчика (это должно быть выполнимо, даже если основной документ не отвечает из-за promptблокировка) - тогда, просто щелкните правой кнопкой мыши элемент iframe и удалите его, нет необходимости вводить какой-либо Javascript. (или, если хотите, вы можете выбрать querySelector и удалите его, например document.querySelector('iframe').remove())

Предполагая, что инструменты разработчика закрыты, нажмите esc а также f12 почти одновременно. Это должно открыть инструменты разработчика. Если он не будет пытаться, пока не сделает.

Как только они открыты, нажмите esc а также f8, Повторите попытку, пока он не остановит выполнение JavaScript в некоторой произвольной точке кода.

Во вкладке "sources" найдите сгенерированный скрипт для того, что вы написали (случайно я не знаю, как это будет выглядеть в JSBin) и буквально удалите var name = prompt("Enter your name: "); линия. Удары f8 снова продолжит выполнение, как будто работает "новый" код. Это должно освободить вас для копирования / вставки кода с самого сайта, прежде чем обновлять страницу

Это что-то вроде хака, и его следует использовать только в тех случаях, которые описаны в OP, но
Во всех реализациях используются целые числа в качестве временного интервала, которые просто увеличиваются при каждом вызове.

Так что вы можете сделать, это очистить все тайм-ауты, которые были созданы на странице.
Для этого вам нужно сначала узнать, какой у нас таймрид, затем вызывать cleatTimeout или clearInterval (они делают то же самое) в цикле, пока вы не достигнете последнего вызова:

function stopAllTimers() {
  const timerid = setTimeout(_=>{}); // first grab the current id
  let i=0;
  while(i < timerid) {
    clearTimeout(i); // clear all
    i++;
  }
};
btn.onclick = stopAllTimers;

// some stoopid orphan intervals
setInterval(()=>console.log('5000'), 5000);
setInterval(()=>console.log('1000'), 1000);
setInterval(()=>console.log('3000'), 3000);
const recursive = () => {
  console.log('recursive timeout');
  setTimeout(recursive, 5000);
};
recursive();
<button id="btn">stop all timeouts</button>

Другие вопросы по тегам