Chrome/jQuery Uncaught RangeError: превышен максимальный размер стека вызовов
Я получаю сообщение об ошибке "Uncaught RangeError: Максимальный размер стека вызовов" на хроме. вот моя функция jQuery
$('td').click(function () {
if ($(this).context.id != null && $(this).context.id != '') {
foo($('#docId').val(), $(this).attr('id'));
}
return false;
});
Обратите внимание, что на странице находятся десятки тысяч ячеек. Однако я обычно связываю переполнение стека с рекурсией, и в этом случае, насколько я вижу, нет.
Создает ли лямбда это автоматически генерирует нагрузку на стек? есть ли способ обойти его?
В настоящий момент единственным обходным решением, которое я использую, является создание явных событий onclick в каждой ячейке при визуализации HTML, что делает HTML намного больше.
Ответы
Ответ 1
Как "есть десятки тысяч ячеек на странице", привязка события 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". Я думаю, вам будет интересна эта статья о привязке событий и делегировании
Или вы можете просто использовать ". on()" метод jQuery с тем же эффектом:
$('body').on('click', 'td', function(){
...
});
Ответ 2
Вы также можете получить эту ошибку, когда у вас есть бесконечный цикл. Убедитесь, что у вас нет бесконечных рекурсивных ссылок на себя.
Ответ 3
Мина была скорее ошибкой, а то, что произошло, - это щелчок цикла (я думаю), в основном, нажав на логин, который также был нажат на родительский элемент, в результате чего превышен максимальный размер стека вызовов.
$('.clickhere').click(function(){
$('.login').click();
});
<li class="clickhere">
<a href="#" class="login">login</a>
</li>
Ответ 4
Эта проблема произошла со мной, когда я использовал jQuery Fancybox внутри веб-сайта со многими другими плагинами jQuery.
Когда я использовал LightBox (сайт здесь) вместо Fancybox проблема исчезла.
Ответ 5
U может использовать
$(document).on('click','p.class',function(e){
e.preventDefault();
//Code
});