Как остановить цикл setInterval в Javascript вне кода без обновления браузера? - PullRequest
0 голосов
/ 16 января 2019

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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 16 января 2019

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

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

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

0 голосов
/ 16 января 2019

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

0 голосов
/ 16 января 2019

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

Итак, вы можете удалить все тайм-ауты, созданные на странице.
Для этого вам нужно сначала узнать, какой у нас таймрид, а затем вызывать 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>
...