6

这条链不起作用有什么原因吗?它不添加类:

document.getElementsByTagName('nav')[0].firstChild.className = "current"

它应该返回 nav 元素的第一个子元素,<a>它不会发生。

谢谢你的帮助!

4

4 回答 4

4

那是因为您在和之间有文本节点。您可以通过以下方式过滤它们:navanodeType

var childNodes = document.getElementsByTagName('nav')[0].childNodes;
for (var i = 0; i < childNodes.length; i++) {
    if (childNodes[i].nodeType !== 3) { // nodeType 3 is a text node
      childNodes[i].className = "current";  // <a>
      break;
    }        
}

这可能看起来很奇怪,但是,例如,如果您有以下标记:

<nav>
<a>afsa</a>
</nav>

这是一个演示

为什么会这样?因为某些<nav>浏览器可能会将和之间的空间解释<a>额外的文本节点。因此,firstChild将不再工作,因为它将返回文本节点。

如果您有以下标记,它会起作用

<nav><a>afsa</a></nav>
于 2012-09-11T01:46:31.767 回答
2

该声明:

document.getElementsByTagName('nav')[0].firstChild.className = "current"

有点脆弱,因为假定的文档结构中的任何更改都会破坏您的代码。所以更健壮的做类似的事情:

var links, 
    navs = document.getElementsByTagName('nav');

if (navs) links = nav[0].getElementsByTagName('a');

if (links) links[0].className = links[0].className + ' ' + 'current';

您还应该有健壮的 addClassName 和 removeClassName 函数。

于 2012-09-11T06:21:16.303 回答
1

Jquery 可以使这变得非常简单:

$("#nav:first-child").addClass("current");
于 2012-09-11T01:41:09.323 回答
1

您可以简单地 document.querySelectorAll 来选择列表。使用“firstElementChild”获取第一个子节点并添加类。

 const firstChild = document.querySelectorAll('nav').firstElementChild;
 firstChild.classList.add('current');
于 2021-01-14T06:03:44.333 回答