Непонятка с 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, время: 22:27. |