2012-01-30 2 views
3

각각 jquery를 사용하고 각각 내부적으로 호출하지 않으면 Internet Explorer 브라우저에 '스크립트 실행 중지'오류가 발생합니다.IE에서 'not'를 사용하는 JQuery 성능 문제

사용하면 성능 문제가있는 $("li:not(.sel)", this).hide(); 문이 나타납니다.

는 IE8에서 성능을 처리하고 중지 스크립트 메시지를받지 못하고, $("li[class != sel]", this).hide();

내가 $("li[class != sel]", this).hide();를 사용 또한 $("li", this).not(".sel").hide();로했습니다.

FF에서는 세 가지 모두 완벽하게 작동합니다.

IE7에서 '스크립트 실행 중지'메시지가 3 번 모두 표시됩니다.

제발 나를 도와주세요.

미리 감사드립니다.

편집 : 이러한 li은 이베이와 같은 필터 옵션 목록입니다. 기본적으로 나는 단 5 개의 li만을 보여줍니다. 필터 아래에서 'more choose'라는 링크를 클릭하면 모달 창을 열고 확인란의 옵션 목록을 선택하고 제출할 때 선택한 li에 'sel'클래스를 추가합니다. 마침내 논리에서 'sel'이없는 li은 숨겨집니다. 이 리는 400 개 이하일 수 있습니다. 데이터에 따라 다릅니다. 사용자는 모든 li을 선택할 권한이 있습니다.

응답 해 주셔서 감사합니다. 제게 어떤 아이디어를주세요 :)

+0

얼마나 많은'li'가 있습니까? 그들 중 얼마나 많은 사람들이'sel' 수업을합니까? – RoToRa

+0

응답 해 주셔서 감사합니다. 내 편집을 확인하십시오 ... – Max

+1

숨겨진 리에 다른 수업을 배정받을 수 있습니까? 성능 문제를 해결하지 못한다는 것을 알고 있지만 선택기를 매우 구체적으로 만들 것이고 "필요하지 않을"필요는 없습니다. –

답변

1

음, 분명히 성능 문제입니다. 내 생각 엔 jQuery가 먼저 모든 항목의 목록을 수집하기 전에 그것들을 반복하기 때문이다.

나는 그것을 피하기 위해 jQuery를의 방법이라고 생각하지 않습니다, 그래서 항목을 통해 대신 루프에 jQuery를하지만 일반 DOM 방법을 사용하지 제안 :

var item = this.firstChild; // Assuming "this" is the parent of the list items 
while (item) { 
    $(item).filter(":not(.sel)").hide(); 
    item = item.nextSibling; 
} 

내가 jQuery를 사용하고 있습니다 루프 안쪽에 다시 표시됩니다. 이것은 더 간단하지만 느립니다. DOM 메소드로 폴백해야 할 수도 있습니다 :

if (item.tagName == "LI" && item.className != "sel") { 
    item.style.display = "none"; 
} 
+0

나는이 논리를 내 논리로 고쳤다. 논리가 클래스에 숨겨 지도록 참조 될 때 마지막 인덱스를 처리하여 루프 외부로 완전히 만들었습니다. 당신의 대답이 나에게 그것을 받아들이는 어떤 생각을 주었기 때문에. 다시 한번 감사드립니다. – Max