Chrome / jQuery Uncaught RangeError : 최대 호출 스택 크기 초과


113

크롬에서 "Uncaught RangeError : Maximum call stack size exceeded"오류가 발생합니다. 여기 내 jQuery 함수입니다.

$('td').click(function () {
        if ($(this).context.id != null && $(this).context.id != '') {
            foo($('#docId').val(), $(this).attr('id'));
        }
        return false;
    });

페이지에는 수만 개의 셀이 있습니다. 그러나 일반적으로 스택 오버플로를 재귀와 연관시키고이 경우에는 아무것도 없다는 것을 알 수 있습니다.

이와 같은 람다를 생성하면 스택에 많은 항목이 자동으로 생성됩니까? 그 주위에 방법이 있습니까?

현재 유일한 해결 방법은 HTML을 렌더링 할 때 각 셀에서 명시 적으로 onclick 이벤트를 생성하는 것이므로 HTML이 훨씬 더 커집니다.


2
foo 함수가 재귀하지 않는 것이 확실합니까? 해당 함수 호출을 제거해도 오류가 계속 발생합니까?
sth

1
다른 브라우저에서도 예상대로 작동합니까? foo($('#docId').val(), $(this).attr('id'));줄에 주석을 달 때이 오류가 발생합니까 ? -추가 성능 팁 : 선택기의 결과를 캐시합니다. 예를 들어 $(this)변수 의 결과를 유지하고 필요에 따라 핸들러에서 사용하는 것보다.
WTK 2011 년

비슷한 문제가 있지만 mouseenter 이벤트가 필요합니다. 몸이나 테이블을 사용할 때 충분한 이벤트를 얻지 못합니다.
ericslaw

답변:


133

"페이지에 수만 개의 셀이 있습니다"로 클릭 이벤트를 모든 단일 셀에 바인딩하면 끔찍한 성능 문제가 발생합니다. 이를 수행하는 더 좋은 방법은 클릭 이벤트를 본문에 바인딩 한 다음 셀 요소가 클릭 대상인지 확인하는 것입니다. 이렇게 :

$('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(){
        ...
});

감사합니다, 우리는 어쨌든 이것에 대한 성능을 위해 고군분투하고 있습니다. 그래서 이것은 좋은 아이디어입니다 :-)
Andy

60
아니, .live ()를 사용하지 마세요 !!! bitovi.com/blog/2011/04/… .delegate () (또는 jQuery가 충분히 새로운 경우 .on ())을 사용하고 전체 문서가 아닌 테이블 수준에서 위임합니다. 이것은 .live ()를 사용하는 것보다 훨씬 더 성능을 향상시킬 것입니다. 이것은 본질적으로 전체 문서에서 위임 할 것입니다.
brandwaffle 2012

19
그리고
.live

37

무한 루프가있는 경우에도이 오류가 발생할 수 있습니다. 끝없이 반복되는 자체 참조가 없는지 확인하십시오.


6
내 문제가 해결되었습니다. 내가 했어 <a id="linkDrink" onclick="drinkBeer();">Drink</a>, 그리고 $('#linkDrink').click();에서 drinkBeer().
Aycan Yaşıt

7

내 실수는 더 많았습니다. 기본적으로 로그인을 클릭하여 루프 클릭 (내 생각에)을 클릭하여 부모도 클릭하여 최대 호출 스택 크기를 초과했습니다.

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

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

3

이 문제는 다른 많은 jQuery 플러그인과 함께 웹 사이트 내에서 jQUery Fancybox를 사용할 때 발생했습니다. Fancybox 대신 LightBox ( site here )를 사용했을 때 문제가 사라졌습니다.


1

U 사용할 수 있습니다

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

0

최근에이 문제도 만났습니다. 대화 div에 매우 큰 테이블이 있습니다. 15,000 행 이상이었습니다. .empty ()가 div 대화 상자에서 호출되었을 때 위의 오류가 발생했습니다.

대화 상자 정리를 호출하기 전에 매우 큰 테이블에서 다른 모든 행을 제거한 다음 .empty ()를 호출하는 원형 솔루션을 찾았습니다. 그래도 효과가 있었던 것 같습니다. 내 이전 버전의 JQuery는 이러한 큰 요소를 처리 할 수없는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.