Непонятка с nextSibling
Добрый день!
Я столкнулся с непонятной цепочкой кода: HTML
<tr>
<td class="label">имя: * </td>
<td>
<input id="name" type="text" />
</td>
<td class="note"></td>
</tr>
На элемент <input id="name" type="text" /> подцеплен обработчик onblur который проверяет пустой ли он. Если пустой то в ячейку <td class="note"></td> Записывается текст о том, что его нужно заполнить. JavaScript Код:
if (!isNotEmpty(element)) {Вопрос! Почему для получения ячейки <td class="note"></td> нужно выполнить цепочку кода element.parentNode.nextSibling.nextSibling? Ведь element.parentNode это содержащий element td, а element.parentNode.nextSibling это и есть <td class="note"></td>. В чём тут дело? Заранее благодарен. |
А почему бы самому не посмотреть?
|
Цитата:
Мне непонятно откуда он взялся |
Переносы строк — это тоже текстовая нода.
Проверяйте nodeType — у текстовых элементов он равен 3, у обычных 1. |
Цитата:
<div id="test"> </div>
<div> </div>
<script>
var test = document.getElementById('test');
alert( test.nextSibling )
</script>
<div id="test"> </div><div> </div>
<script>
var test = document.getElementById('test');
alert( test.nextSibling )
</script>
Отсюда вывод: .nextSibling.nextSibling - это очень ненадежно, потому что зависит от конкретной верстки. |
function next(element) {
while (element = element.nextSibling)
if (element.nodeType === 1)
return element;
return null;
}
Надёжное получение nextSibling. |
Или использовать nextElementSibling (правда, могут быть проблемы с кроссбраузерностью)
|
function next(element) {
if ("nextElementSibling" in element)
return element.nextElementSibling;
while (element = element.nextSibling)
if (element.nodeType === 1)
return element;
return null;
}
Оптимизированный вариант. |
Ах вот оно что! Большое всем спасибо за прояснение ситуации! :)
|
А не подскажете, почему перестал работать этот самый перескок?
http://msufootball.ru/tournaments/op...4/application/
<script>
function Jump(x){
var ml = ~~x.getAttribute('maxlength');
if(ml && x.value.length >= ml){
do{
x = x.nextSibling;
}
while(x && !(/text/.test(x.type)));
if(x && /text/.test(x.type)){
x.focus();
}
}
}
</script>
|
| Часовой пояс GMT +3, время: 01:41. |