javascript - document.getElementById ("Three").parentNode.previousSibling.setAttribute 给我带来问题

标签 javascript

使用 Chrome,我尝试定位列表中的另一个元素

<ul>
<li><a href="#" id="One">One</a></li>
<li><a href="#" id="Two">Two</a></li>
<li><a href="#" id="Three">Three</a></li>
<li><a href="#" id="Four">Four</a></li>
<li><a href="#" id="Five">Five</a></li>
</ul>

所以这有效,

document.getElementById("Three").parentNode.setAttribute("class", "active");

但是事实并非如此,我很困惑为什么。

document.getElementById("Three").parentNode.previousSibling.setAttribute("class", "active");

这是我在控制台中收到的错误:

Uncaught TypeError: Object #<Text> has no method 'setAttribute' 

最佳答案

<li> 的前一个同级即父元素是一个文本节点(包含换行符),它没有 setAttribute()方法。

如果你像这样删除元素之间的任何空白,那么这行 JS 就会起作用:

<li><a href="#" id="Two">Two</a></li><li><a href="#" id="Three">Three</a></li>

演示:http://jsfiddle.net/HLGJE/

但是您可能不希望标记全部在一行上,因此您可以尝试这样的操作来跳过文本节点:

var prev = document.getElementById("Three").parentNode.previousSibling;
while(prev.nodeType == 3)
    prev = prev.previousSibling;
prev.setAttribute("class", "active");

演示:http://jsfiddle.net/HLGJE/2/

关于javascript - document.getElementById ("Three").parentNode.previousSibling.setAttribute 给我带来问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749517/

相关文章:

javascript - 如何使用 gulp-connect 打开一个新的浏览器窗口?

javascript - 解析js html库中的字符串(语言字符串)

javascript - 如何创建按 Enter 时充当链接的 &lt;input&gt;

javascript - Django 删除确认

javascript - 无法使用 jquery 从 html 表中删除行

用于禁用 Tab 键转到浏览器选项卡和地址栏的 JavaScript

javascript - 将变量替换为带有许多内部引号的链接 - 如何正确转义

javascript - 如何抑制 LivePass 控制台消息? (Vimeo 播放器)

javascript - $injector :modulerr AngularJS, 到目前为止尝试了一切

javascript - 运行 JEST 测试用例时如何将全局变量设置为 true