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, проблема ушла.


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

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

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

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