Chrome / jQuery Uncaught RangeError: превышен максимальный размер стека вызовов
Я получаю ошибку "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 намного больше.
6 ответов
поскольку" на странице есть десятки тысяч ячеек", привязка события click к каждой отдельной ячейке вызовет ужасную проблему производительности. Есть лучший способ сделать это, то есть привязать событие click к телу, а затем выяснить, был ли элемент ячейки целью щелчка. Вот так:
$('body').click(function(e){
var Elem = e.target;
if (Elem.nodeName=='td'){
//.... your business goes here....
// remember to replace $(this) with $(Elem)
}
})
этот метод не только выполнит вашу задачу с собственным тегом" td", но и с добавленным позже"td". Я думаю, вам будет интересна эта статья о событие binding & delegate
или вы можете просто использовать ".on ()" метод jQuery с тем же эффектом:
$('body').on('click', 'td', function(){
...
});
вы также можете получить эту ошибку, когда у вас есть бесконечный цикл. Убедитесь, что у вас нет бесконечных рекурсивных ссылок на себя.
мой был больше ошибкой, то, что произошло, было циклическим щелчком(я думаю) в основном, нажав на логин, на который также был нажат родитель, что привело к превышению максимального размера стека вызовов.
$('.clickhere').click(function(){
$('.login').click();
});
<li class="clickhere">
<a href="#" class="login">login</a>
</li>
эта проблема произошла со мной, когда я использовал jQUery Fancybox внутри веб-сайта со многими другими плагинами jQuery. Когда я использовал лайтбокс (здесь) вместо Fancybox, проблема ушла.
недавно я тоже столкнулся с этой проблемой. У меня была очень большая таблица в dialog div. Это было >15,000 строк. Когда.empty () был вызван в диалоговом окне div, я получал ошибку выше.
Я нашел круглое решение, где, прежде чем я вызову очистку диалогового окна, я удалю каждую другую строку из очень большой таблицы, а затем вызову .пустой.)( Хотя, похоже, это сработало. Кажется, что моя старая версия jQuery не может обрабатывать такие большие элементы.