Получить братьев и сестер в JavaScript, без библиотек - PullRequest
10 голосов
/ 09 сентября 2011

Как я могу найти братьев и сестер "вверх", используя JavaScript?По сути, мне нужна функция prevUntil(), аналогичная той, которая присутствует в jQuery.

У меня есть множество элементов <div>, все на одном уровне, например:

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

Я хочу начать с элемента, по которому щелкнули, и пройтись по дереву братьев и сестер, пока не будет достигнуто дерево, соответствующее критериям имени класса, а затем остановиться.

Как мне это сделать, пожалуйста?

Ответы [ 6 ]

11 голосов
/ 02 апреля 2014

Этот ответ был ранее опубликован здесь в ответ на аналогичный вопрос.

Есть несколько способов сделать это.

Любое из следующих действий должно сработать.

// 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 - отличный ресурс для наблюдения за Javascript класса А. Вот превосходный инструмент, который очень хорошо раскрывает кодовую базу jQuery. http://james.padolsey.com/jquery/

7 голосов
/ 09 сентября 2011

Пример Используя previousSibling:

    var className = "needle";
    var element = clickedElement;
    while(element.previousSibling && element.previousSibling.className != className) {
       element = element.previousSibling;
    }
    element.previousSibling; // the element or null
5 голосов
/ 09 сентября 2011

Используйте .children в сочетании с .parentNode.Затем отфильтруйте 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);
2 голосов
/ 09 сентября 2011

Как насчет этого:

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

Не говорите мне, что это не работает в IE8 ...

1 голос
/ 09 сентября 2011

Просто взгляните на как это делает jQuery .

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

Который использует функцию while / looping caled dir (). PrevUntil продолжает работать до тех пор, пока previousSibling не станет таким же, как элемент until.

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;
},
1 голос
/ 09 сентября 2011

В HTML DOM есть свойство previousSibling

Вот некоторые ссылки

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...