Chrome / jQuery Uncaught RangeError: превышен максимальный размер стека вызовов - PullRequest
104 голосов
/ 05 октября 2011

Я получаю сообщение об ошибке «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 ]

126 голосов
/ 05 октября 2011

Поскольку «на странице десятки тысяч ячеек», привязка события 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". Думаю, вам будет интересна эта статья о привязке событий и делегате


Или вы можете просто использовать метод jQuery " .on () " с тем же эффектом:

$('body').on('click', 'td', function(){
        ...
});
34 голосов
/ 29 декабря 2013

Вы также можете получить эту ошибку, когда у вас есть бесконечный цикл. Убедитесь, что у вас нет бесконечных рекурсивных ссылок на себя.

5 голосов
/ 18 июня 2015

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

$('.clickhere').click(function(){
   $('.login').click();
});

<li class="clickhere">
  <a href="#" class="login">login</a>
</li>
3 голосов
/ 13 апреля 2013

Эта проблема возникла у меня, когда я использовал jQUery Fancybox на веб-сайте со многими другими плагинами jQuery.Когда я использовал LightBox ( сайт здесь ) вместо Fancybox, проблема исчезла.

1 голос
/ 10 марта 2017

U можно использовать

  $(document).on('click','p.class',function(e){
   e.preventDefault();
      //Code 
   });
0 голосов
/ 18 января 2018

Недавно я тоже столкнулся с этой проблемой.У меня была очень большая таблица в диалоговом окне div.Это было> 15 000 строк.Когда .empty () был вызван в диалоговом окне div, я получил сообщение об ошибке выше.

Я нашел обходное решение, где перед вызовом очистки диалогового окна я удалял все остальные строкиочень большая таблица, затем вызовите .empty ().Похоже, это сработало.Кажется, что моя старая версия JQuery не может обрабатывать такие большие элементы.

...