【问题标题】:Working with previousSibling and nextSibling to set attributes使用 previousSibling 和 nextSibling 设置属性
【发布时间】:2015-03-01 22:50:33
【问题描述】:

所以自从我开始学习 JavaScript 以来,我就一直在阅读 Tim Wright 的《Learning JavaScript》一书。

在这本书中,我找到了一章关于我们如何在 DOM 树中移动和定位元素,其中一个是利用针对兄弟姐妹的属性,在做书中的练习时,我根本无法做出以下陈述工作:

<ul id="nav">
  <li><a href="/" id="home">Home</a></li>
  <li><a href="/about" id="about">About Us</a></li>
  <li><a href="/contact" id="contact">Contact Us</a></li>
</ul>
<script>
   //Should add "next" class attribute to the "Contact Us" li tag.
   document.getElementById("about").parentNode.nextSibling.setAttribute("class", "next");
</script>

在快速浏览了这段代码之后,我想知道是否有经验更丰富的开发人员可以帮助我并解释为什么它不能正常工作。我感到困惑,因为我不知道是我做错了什么,还是关于这些属性的文章拼错了。

无论如何,提前感谢您的时间和帮助!

干杯!

cs.almeida

【问题讨论】:

    标签: javascript html dom nextsibling


    【解决方案1】:

    nextSibling 选择元素的下一个兄弟。下一个兄弟节点也可以是没有setAttribute 方法的textNode,即您的代码尝试做的是将一个类添加到下一个兄弟textNode。如果您删除 2 个 li 元素之间的换行符和其他隐藏字符,那么您的代码将按预期工作。

    另一个选项是使用nextElementSibling 属性而不是nextSibling,它将选择具有nodeType1 的下一个兄弟节点,即元素的下一个HTMLElement 兄弟节点。

    document.getElementById("about")
            .parentNode
            .nextElementSibling
            .classList // https://developer.mozilla.org/en-US/docs/Web/API/Element/classList
            .add("next");
    

    【讨论】:

    • 那么发生了什么是目标textNode而不是elementNode,原因是HTML代码中的换行符和其他隐藏字符?我永远不会猜到。另一个快速的问题,你认为我应该像你一样写这些陈述吗?似乎更容易阅读。最后,非常感谢您对 Vohuman 的支持,我想让您知道,有您的支持对我理解这门语言有很大帮助。
    • @cs.almeida 不客气!我很高兴我能提供帮助。使用这种写作风格实际上只是个人喜好问题。当我在一个小文件中有很长的一行时,我会使用这种风格。它对我来说更具可读性、可维护性和可编辑性。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多