最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Add class to first child using javascript - Stack Overflow

programmeradmin4浏览0评论

is there any reason this chain does not work? It does not add the class:

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

It should return the first child of the nav element which is an <a> which does not happen.

Thanks for your help!

is there any reason this chain does not work? It does not add the class:

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

It should return the first child of the nav element which is an <a> which does not happen.

Thanks for your help!

Share Improve this question edited Aug 19, 2019 at 13:35 cmplieger asked Sep 11, 2012 at 1:39 cmpliegercmplieger 7,35116 gold badges56 silver badges84 bronze badges 1
  • Is the syntax at least correct? – cmplieger Commented Sep 11, 2012 at 1:45
Add a comment  | 

4 Answers 4

Reset to default 5

That's because you have text nodes between nav and a. You can filter them by 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;
    }        
}

It may seem strange but, for example, if you have the following markup:

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

Here's a DEMO.

Why does this happen? Because some browsers may interpret the space between <nav> and <a> as an extra text node. Thus, firstChild will no longer work since it'll return the text node instead.

If you had the following markup, it'd work:

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

You can simply document.querySelectorAll to select the list. use "firstElementChild" to get first child node and add class.

 const firstChild = document.querySelectorAll('nav').firstElementChild;
 firstChild.classList.add('current');

The statement:

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

is somewhat fragile as any change in the assumed document structure breaks your code. So more robust do do something like:

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

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

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

You should also have robust addClassName and removeClassName functions.

Jquery can make this very easy:

$("#nav:first-child").addClass("current");
发布评论

评论列表(0)

  1. 暂无评论