Я получаю сообщение об ошибке «Uncaught RangeError: Превышен максимальный размер стека вызовов» на Chrome. вот моя функция jQuery
$('td').click(function () {
if ($(this).context.id != null && $(this).context.id != '') {
foo($('#docId').val(), $(this).attr('id'));
}
return false;
});
Обратите внимание, что на странице есть десятки тысяч ячеек. Однако я обычно связываю переполнение стека с рекурсией, и в этом случае, насколько я понимаю, ее нет.
Создает ли автоматическое создание лямбда-выражения в стеке много чего? есть ли способ обойти это?
На данный момент единственный обходной путь, который у меня есть, - это явно генерировать события onclick для каждой ячейки при рендеринге HTML, что делает HTML намного больше.
foo($('#docId').val(), $(this).attr('id'));
строки? - Дополнительный совет по производительности: кэшируйте результат селекторов - например, сохраните результат$(this)
в переменной, а затем используйте его в своем обработчике по мере необходимости.Ответы:
Поскольку «на странице десятки тысяч ячеек» привязка события щелчка к каждой отдельной ячейке вызовет ужасную проблему с производительностью. Есть лучший способ сделать это - привязать событие щелчка к телу, а затем выяснить, был ли элемент ячейки целью щелчка. Как это:
Этот метод выполнит вашу задачу не только с собственным тегом «td», но и с добавленным позже «td». Думаю, вам будет интересна эта статья о привязке событий и делегировании
Или вы можете просто использовать метод jQuery " .on () " с тем же эффектом:
источник
Вы также можете получить эту ошибку, если у вас бесконечный цикл. Убедитесь, что у вас нет бесконечных рекурсивных ссылок на себя.
источник
<a id="linkDrink" onclick="drinkBeer();">Drink</a>
, и$('#linkDrink').click();
вdrinkBeer()
.Моя была скорее ошибкой, то, что произошло, было щелчком цикла (я думаю) в основном при нажатии на логин, который также был нажат родительским, что в конечном итоге привело к превышению максимального размера стека вызовов.
источник
Эта проблема возникла у меня, когда я использовал jQUery Fancybox на веб-сайте со многими другими плагинами jQuery. Когда я использовал LightBox ( сайт здесь ) вместо Fancybox, проблема исчезла.
источник
Вы можете использовать
источник
Недавно я тоже столкнулся с этой проблемой. У меня была очень большая таблица в диалоге div. Было> 15 000 строк. Когда .empty () был вызван в div диалога, я получал ошибку, указанную выше.
Я нашел обходное решение, в котором, прежде чем я вызываю очистку диалогового окна, я удаляю все остальные строки из очень большой таблицы, а затем вызываю .empty (). Хотя, похоже, это сработало. Похоже, моя старая версия JQuery не может обрабатывать такие большие элементы.
источник