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 
   });