Всегда ли .previousSibling возвращает родительский узел Text? - PullRequest
5 голосов
/ 25 января 2012

Я застрял, используя родные методы DOM (я знаю, верно?), И у меня есть такая структура:

<div>
    <input>
    <a>
</div>

Я использую onClick для тега <a> и хочучтобы получить значение из ввода.В Chrome / OS X что-то вроде

this.previousSibling.previousSibling.value

будет работать хорошо.Я удваиваю его, потому что первый .previousSibling возвращает текстовый узел <div>, а еще один до этого получает желаемый ввод.

Мой вопрос: всегда ли .previousSibling возвращает текст родителя?узел, если он существует?

Спасибо!

РЕДАКТИРОВАТЬ / Решение

Моим хакерским решением было (кросс-браузер), чтобы я выглядел правильнокак это:

var el = this; 
while(el.nodeType == 3 || el.tagName && el.tagName !== 'INPUT') {
    el = el.previousSibling
}; 
console.log(el.value);

Месторасположение, но работает в разных браузерах и достаточно легко, чтобы набрать onClick для моих нужд.Спасибо за помощь в выяснении того, что здесь обсуждалось (разрывы строк между HTML в частности)

Ответы [ 3 ]

9 голосов
/ 25 января 2012

Возвращает предыдущий узел-брат, это может быть text node, это может быть element node, это может быть null

Вы можете получить предыдущие узлы элемента с помощью .previousElementSibling, который не поддерживается в старых браузерах, но вы можете использовать функцию, подобную:

function previousElementSibling( elem ) {

    do {

        elem = elem.previousSibling;

    } while ( elem && elem.nodeType !== 1 );

    return elem;
}

previousElementSibling(this) приведет к элементу ввода.

5 голосов
/ 25 января 2012

Всегда ли .previousSibling возвращает текстовый узел родителя, если он существует?

Нет.Возвращает непосредственно предшествующего родного брата.В вашем случае, есть текстовый узел (новая строка), непосредственно предшествующий элементу a, поэтому он возвращает его.

Если вы удалите пробел, он должен работать как положено:

<div>
    <input><a></a> <!-- input is immediately preceding anchor -->
</div>

Однако это не очень хорошее решение.Смотрите ответ @ Esailija для лучшего!

1 голос
/ 25 января 2012

Согласно http://www.w3schools.com/dom/prop_element_previoussibling.asp

Свойство previousSibling возвращает предыдущий одноуровневый узел (предыдущий узел на том же уровне дерева) выбранного элемента

Если такого нетузел, это свойство возвращает ноль.

технически, то, что вы показываете, есть

<div><textnode><input><textnode><a><textnode></div>

... поэтому, если браузеры следуют правилам, оно должно продолжать работатьдолжным образом.Если вы спрашиваете, существуют ли браузеры, которые не следуют этим правилам, я не могу вам помочь, но отмечу, что в IE есть привычка добавлять объекты dom на страницы (особенно в качестве оберток), которыеможет оказаться опасным независимо.

Редактировать: http://www.w3schools.com/dom/dom_nodes_navigate.asp может сказать это по теме.

Firefox и некоторые другие браузеры будут обрабатывать пустые пробелы илиновые строки в виде текстовых узлов, Internet Explorer не будет.

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