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 99

6 ответов:

поскольку" на странице есть десятки тысяч ячеек", привязка события 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(){
        ...
});

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

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

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

<li class="clickhere">
  <a href="#" class="login">login</a>
</li>

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

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

  $(document).on('click','p.class',function(e){
   e.preventDefault();
      //Code 
   });

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

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