2

我无法解释这段代码在做什么。这里是:

function parent(e, n) { 

    if (n === undefined) n = 1; //if n is not defined, use 1 by default

    while(n-- && e) e = e.parentNode; 

    if (!e || e.nodeType !== 1) return null; 

    return e;   

}

该函数接受两个参数。一个用于元素,第二个用于元素的祖先。因此,在第二个参数中传递 2 将检索元素的祖父母(DOM 树上的 2 个元素)。

我理解所有这一切,除了while循环。我不确定如何倒数选择那个特定的祖先。这个while循环如何使这个函数选择一个祖先?

4

4 回答 4

2

这里的重点是数字是“真实的”(或虚假的)。 0作用相同false。因此,当n达到零时,循环结束。

因此,如果n从 2 开始,循环将最多运行 2 次。

另一种情况稍微容易理解。如果节点没有父节点,则循环也将终止。

循环的每次迭代都会执行e = e.parentNode,它会获取“当前”节点的父节点。如果循环执行 2 次迭代,则将 dom 向上移动 2 层(“祖父母”)。

于 2013-01-08T03:38:01.243 回答
0

看起来它获得了第 n 个父元素......

于 2013-01-08T03:39:05.160 回答
0

循环的每次迭代都会查看传入元素的 parentNode。因此,如果您以 1 作为迭代因子传入特定的 div,它将查看该 div 的直接父级。如果你传入 2,它将查找 2 个父级(div 的父级的父级)。它通过使用 e.parentNode 并在循环的每次迭代中将 e 重置为其父级来做到这一点。

于 2013-01-08T03:43:21.090 回答
0

试试这个:

var n = 2;
while(n--) console.log("do this " + n + " more times.");

if(0){
  console.log("never executed because zero is evaluated as false");
}

在支持 console.log 的浏览器中。

在说明数字 0 被评估为假之前已经给出了答案。

n-- 表示返回 n 的值,然后减一。如果您在上面的代码中有 --n ,那么它只会执行一次(先减去)。

在您的代码中,如果 n 为 2,则循环将执行 2 次,在循环变量 e(元素)中设置为元素的父节点。如果没有父节点,那么在这种情况下,语句 if(e){...} 将不会做任何事情,因为评估未定义的值会导致错误。因此,当 e 未定义时(例如没有父节点),即使 n 不为 0,n && e 也会返回 false。

于 2013-01-08T03:47:23.133 回答