1 заметка с тегом

previousSibling РСС

17 августа 2009, 20:42

javascript: «Bug» with previousSibling

У нас есть вот такой список HTML тэгов
<label for="text">Enter text</label>
<input name="text" type="text">
Если вызвать функцию, от имени инпута, и потом попытаться повлиять на его previousSibling, которым по идее есть label, мы упрёмся в текстовую ноду (.style is undefined — у которой нету понятия стиль и т. д., а обидно ;) ). Быстрый способ это вылечить, это написать весь HTML в одну строку, то есть убрать перенос, но это блин не выход ;)

Для этого можно написать «свой», «правильный» previousSibling, или, по желанию, модифицировать существующий, что, на моё мнение, будет излишним ;) Как всегда, залезем в прототип и дадим стране угля Обжектам, типа Нод Element (crossbrowser fix, thx Сергей Морозов), новую функцию
Element.prototype.pSib = function() { 
	var node = this; 
	while (node = node.previousSibling) { 
		// нам не нужен текст, йо ;)
		if (node.nodeType != 3) continue; 
	} 
	return node; 
}
// использовать вот так
var sometop = someid.pSib().style.top;
previousSibling