Firefox катастрофического отказа с помощью [закрытого] JavaScript

7
задан AstroCB 30 August 2014 в 20:47
поделиться

3 ответа

В некоторой степени похоже на "вилочную бомбу"

<html>
<body>
<a href="#" onclick="die()">click me!</a>
<script>
function die () {
  setTimeout(function () {die(); die()}, 0)
}
</script>
</body>
</html>

Ее нельзя остановить в FF 3.6 и ниже (если только пользователь не закроет вкладку с нарушением в ближайшее время ). Чем дольше вы позволяете ему работать, тем более жестоким он становится.В конце концов он съест всю доступную для процесса память. Также должна увеличиться нагрузка на ЦП. Некоторые операционные системы справляются с некорректным FF лучше, чем другие. Вы можете сделать это более вырожденным, если вы также примените соответствующую нагрузку к DOM в каждом цикле.

Редактировать: «Используйте эти знания только на благо мира». : -)

11
ответ дан 6 December 2019 в 09:59
поделиться

Мне удавалось неоднократно вылетать из строя мой Firefox, выполняя массивную вставку в DOM примерно 10 000+ элементов.

Обычно пользователь нажимает кнопку, чтобы запустить вызов jQuery AJAX.Вызов вернет полный HTML-файл, который будет добавлен к определенному div с помощью jQuery.

<script>
  $("div.content").empty();
  $("div.content").html(data);
</script>

Затем, как только данные будут добавлены, он попытается проанализировать всю эту гадость данных и добавить события onClick и onHover практически к каждому элементу в дереве.

Будьте уверены, каждый раз, когда я запускал эту функцию, мой браузер падал. Это вызвало бы обычный запрос «сценарий работает медленно, вы хотите его отменить», но я никогда не мог отменить его, и всегда приходилось нажимать CTRL + ALT + DEL.

К вашему сведению, я никогда не планировал вставлять 10 000 элементов, это была ошибка с моей стороны. Я запрашивал базу данных с помощью JOIN и намеревался выполнить SELECT DISTINCT, а вместо этого сделал SELECT, поэтому вместо возврата 100 элементов я вернул 10000 из-за объединений. Ой.

2
ответ дан 6 December 2019 в 09:59
поделиться

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

<script>while(true) alert('alert bomb');</script>

трудно покинуть, а это:

<body onbeforeunload="while(true) alert('alert bomb');">

фактически невозможно . (Имейте под рукой диспетчер задач.)

Использование модальных циклов, от которых трудно избежать, было излюбленной тактикой агрессивных страниц установщика шпионского ПО. («Нажмите« Да », чтобы установить VomitBar сейчас или столкнуться с бесконечными окнами предупреждений ...»)

6
ответ дан 6 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

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