2011-09-08 6 views
9

JavaScript를 사용하여 형제를 "위로"볼 수 있습니까? 기본적으로 jquery에있는 것과 비슷한 함수 prevUntil()이 필요합니다.라이브러리가없는 JavaScript에서 형제를 가져옴

<div></div> 
<div></div> 
<div></div> 
<div></div> 
<div></div> 
<div></div> 

나는 클릭 된 요소에서 시작하고, 클래스와 일치하는 때까지 형제 트리를 내 방식을 작업 할 :

나는 같은 동일한 수준에 <div> 요소 모두를 많이 가지고 이름 기준에 도달하면 중지하십시오.

어떻게하면됩니까?

+1

@glowcoder : 개인적으로 jQuery가 실제로 무엇을하는지 알면 흥미로워집니다. – pimvdb

+2

@pimvdb, jQuery는 오픈 소스이기 때문에 실제로 무엇을하는지, 그리고 무엇을하고 있는지에 관심이 있다면 주저하지 말고 소스 코드를 참조하십시오. –

+1

@Darin Dimitrov : 나도 알아, 내가 무슨 일이 일어나고 있는지 물어 보는 데는 아무 문제가 없다는 것을 의미한다. – pimvdb

답변

9

이 답변은 비슷한 질문에 대한 대답으로 이전에 출판되었습니다. here

몇 가지 방법이 있습니다.

다음 중 하나가 트릭을 수행해야합니다.

// METHOD A (ARRAY.FILTER, STRING.INDEXOF) 
var siblings = function(node, children) { 
    siblingList = children.filter(function(val) { 
     return [node].indexOf(val) != -1; 
    }); 
    return siblingList; 
} 

// METHOD B (FOR LOOP, IF STATEMENT, ARRAY.PUSH) 
var siblings = function(node, children) { 
    var siblingList = []; 
    for (var n = children.length - 1; n >= 0; n--) { 
     if (children[n] != node) { 
      siblingList.push(children[n]); 
     } 
    } 
    return siblingList; 
} 

// METHOD C (STRING.INDEXOF, ARRAY.SPLICE) 
var siblings = function(node, children) { 
    siblingList = children; 
    index = siblingList.indexOf(node); 
    if(index != -1) { 
     siblingList.splice(index, 1); 
    } 
    return siblingList; 
} 

는 참고 : JQuery와 코드베이스는 A 급 자바 스크립트를 관찰을위한 훌륭한 자원이다.

다음은 jQuery 코드 기반을 매우 간소화 된 방식으로 보여주는 탁월한 도구입니다. http://james.padolsey.com/jquery/

1

다음은 HTML DOM

에서 previousSibling은 속성이있다는

http://reference.sitepoint.com/javascript/Node/previousSibling

+0

'previousSibling' 속성은 함수가 아닌 DOM 노드에 대한 참조입니다. –

+0

나는 그것을 완전히 이해합니다. 그러나 간단한 반복을 사용하면 자신의 조건과 일치하는 이전 요소를 찾을 수 있습니다. –

1

그냥 how jQuery does it 살펴보고 몇 가지 참조입니다.

prevUntil: function(elem, i, until) { 
    return jQuery.dir(elem, "previousSibling", until); 
}, 

while/looping 함수 caled dir()을 사용합니다. prevUntil은 previousSiblinguntil 요소와 동일 할 때까지 계속됩니다.

dir: function(elem, dir, until) { 
    var matched = [], 
     cur = elem[ dir ]; 

    while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { 
     if (cur.nodeType === 1) { 
      matched.push(cur); 
     } 
     cur = cur[dir]; 
    } 
    return matched; 
}, 
4

.parentNode과 조합하여 .children을 사용하십시오. 그런 다음 NodeList을 배열로 변환 한 후 필터링합니다 (http://jsfiddle.net/pimvdb/DYSAm/).

var div = document.getElementsByTagName('div')[0]; 
var siblings = [].slice.call(div.parentNode.children) // convert to array 
       .filter(function(v) { return v !== div }); // remove element itself 
console.log(siblings); 
+0

'[] .slice.call (nl)'을 사용하여 NodeList에서 Cast로 캐스트? 좋은':)' –

+0

위대한 솔루션, 고마워요! – Kholiavko

7

Example 사용 previousSibling은 :

var className = "needle"; 
    var element = clickedElement; 
    while(element.previousSibling && element.previousSibling.className != className) { 
     element = element.previousSibling; 
    } 
    element.previousSibling; // the element or null 
+0

이'element.previousSibling.className'는 문제가됩니다. 이전 형제가 원하는 클래스를 가지고 있지 않으면'element.previousSibling'은 결국'null'을 반환 할 것이므로'element.previousSibling.className'는 에러를 던질 것입니다. –

+2

그것은 무한 루프를 방지하기위한 것이 었습니다! 그냥 키드. 업데이트했습니다. – Joe

+0

고맙습니다. – Francisc

2

이 방법에 대해 :

while (node = node.previousElementSibling) { 
    if ((' ' + node.className + ' ').indexOf('foo') !== -1) { 
     // found; do your thing 
     break; 
    } 
} 

이가 IE8에서 작동하지 않는다는 것을 말해 귀찮게하지 마십시오 ...

+0

속고 싶습니까? 내가 너를 속이지 않을 것이므로 너는 나에게 묻기 때문에 너의 질문에 대답 할 수 없다. – Wayne

+0

@Wayne 아니, 나는 속은 것을 좋아하지 않는다. 나는 내 질문에 대답하지 말라고하지 않았다. 대답 해주세요! 그리고 내가 무엇을 물었습니까? 질문에 답한 것 같고 질문하지 않았습니다. –

+0

내 역할에 대한 오해. 나는 당신이 IE8에서 문자 그대로 작동하지 않는다고 말하지 않는다고 생각했다. 당신이 이미 알고있는 것은 아니다. – Wayne

0

기본적으로 배열을 반환하는 getElementsByTagName 및 getElementsByName이 있습니다. 와일드 카드를 사용할 수 있습니다. prevUntil을 원한다면 라이브러리처럼 이미 존재하는 것을 사용하거나 함수를 만들어야합니다.

function getElements() 
    { 
    var x=document.getElementsByName("*"); 
    alert(x.length); 
    } 

갱신

에서 getElementById는 하나의 요소를 반환합니다.

관련 문제