有一个简单的方法来检查的节点列表当前元素是否是其母公司的偶/奇的孩子。
例如,如果有一个链接列表。
<ul>
<li>Odd</li>
<li>Even</li>
<li>Odd</li>
<li>Even</li>
<li>Odd</li>
</ul>
我遍历这样的节点列表:
var links = document.querySelectorAll("ul li");
for (i = 0; i < links.length; i++) {
var link = links[i];
var parent = link.parentNode;
if (// this is an even link) {
console.log("even");
}
else {
console.log("odd");
}
}
我将如何确定当前的链接是奇数还是偶数?
我想选择所有父奇的一个新的节点列表的li
用元素li:nth-child(odd)
的母公司,然后检查当前节点是否是在该节点列表。 虽然我不知道该怎么做准确。
如何检查当前节点是否是奇/偶相对于它的父?
这个问题类似于在纯JavaScript获取元素的第n个孩子数
如何检查当前节点是否是奇/偶相对于它的父?
与单纯递增的问题i
在每个迭代上,因为所有其他的答案都在做,就是这种计算是没有关系的任何父节点。 如果您发现,没有一个现有的答案利用link.parentNode
了!
由于计算是不知道的父节点的背景下,它基本上假设恰好有一个ul
元素,所有的li
元素是一个儿童ul
才能正常工作。 你嵌套的那一刻ul
元素,甚至只是多个ul
元素在同一文件中,这将打破。
请注意,这个问题是不是与%
线。 事实上,这正是你如何确定一个整数是偶数或奇数。 的问题是,索引没有被相对于父节点计算。
例如,如果我修改列表,包括嵌套ul
恰好与一个li
:
<ul>
<li>Odd
<ul>
<li>Odd</li>
</ul>
</li>
<li>Even</li>
<li>Odd</li>
<li>Even</li>
<li>Odd</li>
</ul>
输出将是完全错误的 ,一旦它计算在内li
(第二行):
[12:07:25.505] odd
[12:07:25.505] even
[12:07:25.505] odd
[12:07:25.505] even
[12:07:25.506] odd
[12:07:25.506] even
我在写一个脚本回答到类似的问题,我挂上面。 这里的报价:
实现这一点,更是万无一失的方法之一是遍历每个元素的父节点的子节点,增加了性的元素节点的每个子节点的计数器(因为:nth-child()
只计算元素节点):
而这里的脚本,适合你的使用情况:
var links = document.querySelectorAll("ul li");
for (var i = 0; i < links.length; i++) {
var link = links[i];
var parent = link.parentNode;
var child = parent.firstChild;
var index = 0;
while (true) {
if (child.nodeType === Node.ELEMENT_NODE) {
index++;
}
if (child === link || !child.nextSibling) {
break;
}
child = child.nextSibling;
}
if (index % 2 == 0) {
console.log("even");
}
else {
console.log("odd");
}
}
现在,输出将是正确的 :
[12:35:22.273] odd
[12:35:22.273] odd
[12:35:22.273] even
[12:35:22.273] odd
[12:35:22.273] even
[12:35:22.273] odd
再次,第二行表示内li
,这在修改的HTML是它的父的第一(和因此奇数)子ul
。
只是检查是否i+1
为偶数或奇数
for (i = 0; i < links.length; i++) {
var link = links[i];
var parent = link.parentNode;
if ((i+1)%2 == 0) {
console.log("even");
}
else {
console.log("odd");
}
}
使用模运算符 :
if ((i+1)%2==0) {
console.log("even");
}
else {
console.log("odd");
}