Как остановить цикл 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>