2010-06-19 4 views
4

오늘 저는 Work 및 jQ와 매우 쌓여 있습니다. 나는 그것을 위해 아침을 얻을 수 있었다하지만 난 :(를 해결할 수 여기 내 작업 :.jquery의 "each"함수 대신 "For"를 사용하는 방법

$(".test").each(function() { 
    $(this).text('a'); 
}); 
: 정상에서

<div class="container"> 
    <p class="test">a</p> 
    <div> 
     <p class="test">a</p> 
    </div> 
</div> 

, 나는 각각의 기능 JQ를 사용 할 수 for 모든 <p class="test">a</p> EX를 선택

하지만 난 모든 사람이 그 이야기를 듣고는, for 기능은 이제 내가 대신 eachfor을 사용하여 원하는. each 기능보다 덜 timeload을 얻을 ...하지만 난이 경우 코드 JQ를 작성하는 방법을 모르겠어요.

누군가 나를 도울 수 있습니다!. 고맙습니다!

+0

왜 당신은 더 적은 시간 부하를 원하는가? 그것은 매우 소모적 인 작업입니까? javascript에 대한 규칙은 지연이없고 오류의 양이 너무 많으면 좋은 코드입니다. – tcooc

답변

7

수백 개가 반복되지 않는 한 걱정하지 않겠습니다.

for 루프는 보통마다 반복 계산되지 않도록 elementsLength 좋은 생각

var elements = document.getElementById('something').getElementsByTagName('a'); 

var elementsLength = elements.length; 

for (var i = 0; i < elementsLength; i++) { 

    elements[i].style.color = 'red'; 
} 

캐싱의 ... 정상 DOM (일명 jQuery를 제외) 이송, 등으로 사용된다. 이 제안에 대한 의견에 CMS에게 감사드립니다.

jQuery로 처리하려는 경우 jQuery 객체에 맞게 조정하십시오.

$('#something a')과 같이 elements 변수를 jQuery 컬렉션과 바꾸십시오. 더 이상 jQuery를 사용해야하는 경우 객체를 다시 래핑해야한다고 생각합니다.

+0

getElementById가 getElementsByTagName과 같은 메소드를 가지고 있지 않은 html 요소 하나를 반환했는지 확인했습니다. 그것은 단지 문서가 가진 것입니다. 긴 이야기는 짧습니다. 네이티브 javascript 메서드를 사용하여 메서드를 연결할 수는 없다고 생각합니다. –

+2

코드가 정확합니다. DOM 요소를 컨텍스트로 사용하여 getElementsByTagName 또는 getElementsByClassName과 같은 하위 클래스를 사용할 수 있습니다. –

+0

@alex :'elements [elements.length]'는'undefined '(0을 기본으로 함)이므로 루프의 조건은'i CMS

1

확실한 해결책을 시도해 보셨습니까?

var nodes = $(".test"); 
for(var i = 0; i < nodes.length; i++) 
{ 
    var node = nodes[i]; 
} 
+0

for 블록은 클로저가 아니므로 각 루프에서 동일한 변수를 기술적으로 다시 정의해야합니다. 확실하지는 않지만 오류가 발생합니다. –

+0

변수 선언은 상단으로 "끌어 올린"것이므로 실제 모양은 다음과 같습니다.'var nodes, node; nodes = $ ('. test'); for (...) {노드 = 노드 [i]; } ' –

+0

왜 같은 요소를 참조할까요? nodes는 html 요소의 배열입니다. 이 컬렉션의 i 번째 요소는 클래스 테스트에서 발견 된 요소 중 하나입니다.여기에 문제가 보이지 않습니다. –

5

jQuery 선택 결과에 서수 접근자를 사용하면 기본 DomElement가 반환된다는 것을주의해야합니다. jQuery 메서드를 사용하려면 재 포장해야합니다.

다른 사람들이 말한 것보다 두 번째 줄 수 있습니다. 많은 요소를 다루지 않는 한 조기에 최적화됩니다. .text() 메서드를 사용하기 위해 요소를 다시 래핑하면 다시 이득이 발생하지 않을 수도 있습니다.

+0

그게 내가 원하는 방식이다!. – Rueta

+0

+1 ".text() 메서드를 사용하기 위해 요소를 다시 래핑하면 전혀 이득이 없을 수도 있습니다." 벤치 마크는 없지만 모든 반복을 다시 포장하는 것은 번거로울 수 있습니다. – alex

+0

이 재 포장 사례를 이해할 수 없습니다 ... 자세한 내용을 설명해 주시겠습니까? pls .. – Rueta

1

This article은 수십만 개의 반복 된 항목에 도달 할 때까지 each()에 큰 성능 저하가 없음을 보여줍니다.

+0

예 ..하지만 내 코드를 최적화하고 싶습니다. – Rueta

+1

칭찬 할만한 일이지만, 이는 코드 명확성과 유지 관리 가능성을 줄이면서 사소한 성능 향상이 될 것입니다. 나는 다른 곳에서는 더 큰 성능의 돼지가있을 것이라고 확신한다. 'for' loop에서'Something.length'와 비슷한가? ;-) –

1

또 다른 대안 :

for (var i = 0; i < $('.test').length; i++){ 
    var element = $('.test').eq(i); 
} 
관련 문제