2009-05-15 8 views

ответ

34

Это потому, что Firefox считает, что пробелы между узлами элементов являются текстовыми узлами (тогда как IE не работает), и поэтому использование .nextSibling на элементе получает этот текстовый узел в Firefox.

Полезно иметь функцию, используемую для получения следующего узла элемента. Что-то вроде этого

/* 
    Credit to John Resig for this function 
    taken from Pro JavaScript techniques 
*/ 
function next(elem) { 
    do { 
     elem = elem.nextSibling; 
    } while (elem && elem.nodeType !== 1); 
    return elem;   
} 

, то вы можете сделать

var elem = document.getElementById('the_id'); 
var nextElem = next(elem); 

if (nextElem) 
    nextElem.style.display = 'none'; 
+0

Но 'elem' все еще может быть пустым. – Gumbo

+0

Нет, нет. Он просто гарантирует, что 'nextSibling' недоступен, если' elem' is not not 'или 'elem.nodeType == 1'. Но если такого элемента нет, 'elem' - это только последний узел, независимо от того, какой он тип. – Gumbo

+0

Вот пример: var elem = document.createElement ("div"); elem.appendChild (document.createTextNode ("foo")); elem.appendChild (document.createTextNode ("bar")); alert (next (elem.firstChild) === null); // «true» – Gumbo

2

Firebug ошибка была elem.nextSibling.style не определена.

потому NextSibling может быть текстовый узел или другой тип узла

do { 
    elem = elem.nextSibling; 
} while(element && elem.nodeType !== 1); // 1 == Node.ELEMENT_NODE 
if(elem) elem.style.display = 'none'; 
+0

+1 Для проверки того, что элемент 'elem' не равен нулю, прежде чем обращаться к атрибуту' style'. – Gumbo

0

Попробуйте перекручивание через детей этого элемента, используя что-то вроде:

var i=0; 
(foreach child in elem) 
{ 
    if (i==0) 
    { 
    document.getElementByID(child.id).style.display='none'; 
    } 
} 

Пожалуйста, сделайте соответствующие поправки к синтаксис.

8

Посмотрите на Element Traversal API, что API перемещается только между узлами Element. Это позволяет следующее:

elem.nextElementSibling.style.display = 'none'; 

И, таким образом, позволяет избежать проблем, присущих NextSibling потенциально получать узлы, не элемент (например, TextNode холдинг пустое пространство)

+0

TY TY TY TY для добавления ответа! – Alisso

+0

Я думаю, что это лучший и простой способ, я не понимаю, почему люди не фокусировались. –