有什么理由这个连锁不起作用?它没有添加类:s。
document.getElementsByTagName('nav')[0].firstChild.className = "current"
它应该返回导航元素的第一个子元素<a>
,但这似乎在某种程度上出错了。
感谢您的帮助!
答案 0 :(得分:2)
那是因为nav
和a
之间有text nodes。您可以按nodeType
:
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>
这是 DEMO 。
为什么会这样?因为某些浏览器可能会将<nav>
和<a>
之间的空格解释为 extra 文本节点。因此,firstChild
将不再有效,因为它将返回文本节点。
如果您有以下标记,则 work :
<nav><a>afsa</a></nav>
答案 1 :(得分: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函数。
答案 2 :(得分:1)
Jquery可以让这很容易:
$("#nav:first-child").addClass("current");
答案 3 :(得分:1)
您可以简单地使用 document.querySelectorAll 来选择列表。 使用“firstElementChild”获取第一个子节点并添加类。
const firstChild = document.querySelectorAll('nav').firstElementChild;
firstChild.classList.add('current');