JQuery .each () 뒤로


442

JQuery를 사용하여 페이지에서 일부 요소를 선택한 다음 DOM에서 요소를 이동합니다. 내가 겪고있는 문제는 JQuery가 자연스럽게 선택하려는 역순으로 모든 요소를 ​​선택해야한다는 것입니다. 예를 들면 다음과 같습니다.

<ul>
   <li>Item 1</li>
   <li>Item 2</li>
   <li>Item 3</li>
   <li>Item 4</li>
   <li>Item 5</li>
</ul>

모든 li 항목을 선택하고 .each () 명령을 사용하고 싶지만 Item 5부터 시작한 다음 Item 4 등으로 시작하고 싶습니다. 이것이 가능합니까?

답변:


681
$($("li").get().reverse()).each(function() { /* ... */ });

10
예를 들어, 마지막 세 가지만 수행하려는 <li>Item 5</li>경우 인덱스가 0 일 것으로 예상 할 수 없습니다.
pathfinder

8
David Andres에게 : li 전에 $ ()를 추가하는 것을 잊었을 수 있습니다. 나는이 실수를하고 "undefined func"을 받았다.
Michal-wasda-net

2
@DavidAndres : .get()jQuery 랩핑 된 배열을 일반적인 JS 배열로 바꾸는 것을 놓쳤습니다 . JS 배열에는가 있습니다 .reverse().
stackular

1
주의 : Array.reverse()둘 다 배열 을 제자리에 수정 하고 반대 배열을 반환합니다. 따라서이 솔루션은 실제로 내부 jQuery 또는 DOM 배열에 대한 참조가 아닌 새 배열을 반환하는 $ (). get ()에 의존합니다 . 이 예의 범위 내에서 아마 안전한 내기. 경고 코더.
Bob Stein

404

나는 세계에서 가장 작은 jquery 플러그인 형태로 가장 깨끗한 방법을 제시합니다.

jQuery.fn.reverse = [].reverse;

용법:

$('jquery-selectors-go-here').reverse().each(function () {
    //business as usual goes here
});

그의 게시물에 마이클 기어 리에 대한 모든 크레딧 : http://www.mail-archive.com/discuss@jquery.com/msg04261.html


좋아, 나는 그것이 멋지다는 데 동의하지만 왜 효과가 있습니까? Array.prototype.reverse를 jQuery.prototype.reverse에 복사하고 (느슨하게 말하면) this객체에 숫자 속성과 길이 속성이 있으므로 javascript가 색인을 생성하고 jQuery 인스턴스에 배열 함수를 적용 할 수 있습니까?
mlhDev

5
예를 들어, 마지막 세 가지만 수행하려는 <li>Item 5</li>경우 인덱스가 0 일 것으로 예상 할 수 없습니다.
pathfinder

1
@Matthew-예, 이해합니다. 그 코드는 복사 실제로 않는 참조Array.prototype.reverse넘어서 jQuery.prototype.reverse. 많은 JavaScript 배열 메소드는 배열과 같이 보이는 오브젝트, 즉 오브젝트가 .length있고 숫자 인덱스 특성 인 경우 모든 오브젝트에서 제대로 작동합니다 . reverse배열의 내부 표현에 의존하지 않습니다. 그것은 정상적인 사용하여 어레이에 접근 .length, [0], [1]당신이 자신을 써서 배열과 같은 코드 등.
Michael Geary

8
reverse메소드 를 얻기 위해 새로운 Array를 인스턴스화하는 것이 낭비되지 않습니까? Array.prototype.reverse예를 들어 함수에 대한 참조를 복사하는 것이 더 빠르지 jQuery.fn.reverse = Array.prototype.reverse;않습니까? 짧고 "영리한"것이 아니라 더 효율적입니까? 분명히 이것은 아마도 오늘날의 초고속 브라우저에서는 눈에 띄지 않을 것입니다.
zachelrath

3
@zachelrath 예, 더 이상 결과를 구분할 수 없습니다. 20 %가 단지 우연 인 것 같습니다. 함수는 한 번만 설정하므로 인스턴스화는 한 번만 발생하며 함수가 설정됩니다.
Sandy Gifford

64

넌 할 수있어

jQuery.fn.reverse = function() {
    return this.pushStack(this.get().reverse(), arguments);
}; 

뒤에

$(selector).reverse().each(...) 

14
이 접근법은 원래 jQuery 메일 링리스트 에서 John Resig (jQuery 개발자)에 의해 제안되었습니다 .
Chris Shouts

20

이에 대한 다른 옵션은 다음과 같습니다.

첫 번째 : jQuery없이 :

var lis = document.querySelectorAll('ul > li');
var contents = [].map.call(lis, function (li) {
    return li.innerHTML;
}).reverse().forEach(function (content, i) {
    lis[i].innerHTML = content;
});

여기 데모

... 그리고 jQuery와 함께 :

이것을 사용할 수 있습니다 :

$($("ul > li").get().reverse()).each(function (i) {
    $(this).text( 'Item ' + (++i));
});

여기 데모

jQuery를 반대로 사용하는 또 다른 방법 은 다음 과 같습니다.

$.fn.reverse = [].reverse;
$("ul > li").reverse().each(function (i) {
    $(this).text( 'Item ' + (++i));
});

이 데모는 여기에 있습니다 .

다른 대안은 length(선택자와 일치하는 요소 수)를 사용하고 index각 반복을 사용하여 그 아래로 내려가는 것 입니다. 그런 다음 이것을 사용할 수 있습니다 :

var $li = $("ul > li");
$li.each(function (i) {
    $(this).text( 'Item ' + ($li.length - i));
});

이 데모 여기

하나 는 위의 것과 관련이 있습니다.

var $li = $("ul > li");
$li.text(function (i) {
    return 'Item ' + ($li.length - i);
});

여기 데모


14

역 플러그인을 작성하는 것을 선호합니다.

jQuery.fn.reverse = function(fn) {       
   var i = this.length;

   while(i--) {
       fn.call(this[i], i, this[i])
   }
};

사용 예 :

$('#product-panel > div').reverse(function(i, e) {
    alert(i);
    alert(e);
});

이 아이디어 / 코드도 있지만 같이 (반대되는)는 체인 가능 객체를 반환하지 않습니다 내가 같이 답변 : 아직, 방법에 대해 확실히 좋은 방법을-투표 높을수록 그것의 설정
이안

네 말이 맞아 연결할 수 없으므로 유효한 플러그인이 아닙니다. 감소기를 조건으로 이동하면서 코드를 약간 개선했습니다.
제임스 웨스트 게이트


5

Vinay 아이디어를 사용 했으므로 $ .each에 대한 역전이 필요했습니다.

//jQuery.each(collection, callback) =>
$.each($(collection).get().reverse(), callback func() {});

잘 했어, 고마워


이것은 옳지 않습니다. 이것은 단지이어야한다 $.each(collection.reverse(), ...).
Sophie Alpert

@ 벤 알퍼트는 - 컬렉션 진정한 배열이 아닌 있기 때문에 귀하의 의견은 결함이
수직 동기화

4

각 함수를 jQuery로 거꾸로 반복 할 수는 없지만 여전히 jQuery 구문을 활용할 수 있습니다.

다음을 시도하십시오 :

//get an array of the matching DOM elements   
var liItems = $("ul#myUL li").get();

//iterate through this array in reverse order    
for(var i = liItems.length - 1; i >= 0; --i)
{
  //do Something
}

2

내가 찾은 Array.prototype.reverse내가 대안으로 사용할 새 jQuery를 기능을 만들 수 있도록, 객체와 실패 : jQuery.eachBack(). 평상시처럼 반복 jQuery.each()하고 각 키를 배열에 저장합니다. 그런 다음 해당 배열을 되돌리고 원래 배열 / 객체에서 역순으로 정렬 된 순서대로 콜백을 수행합니다.

jQuery.eachBack=function (obj, callback) {
    var revKeys=[]; $.each(obj,function(rind,rval){revKeys.push(rind);}); 
    revKeys.reverse();
    $.each(revKeys,function (kind,i){
        if(callback.call(obj[i], i, obj[i]) === false) {    return false;}
    });
    return obj;
}   
jQuery.fn.eachBack=function (callback,args) {
    return jQuery.eachBack(this, callback, args);
}

-2

나는 당신이 필요하다고 생각

.parentsUntill()

1
왜 그렇게 생각하십니까? 어떻게 사용하겠습니까?
Bergi

-2

시도해 볼 수도 있습니다

var arr = [].reverse.call($('li'))
arr.each(function(){ ... })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.