我无法解释此代码的作用。这是:
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循环如何使这个函数选择一个祖先?
答案 0 :(得分:2)
这里重要的是数字是“真实的”(或虚假的)。 0
与false
的行为相同。因此,当n
达到零时,循环结束。
因此,如果n
从2开始,则循环将最多运行2次。
另一个条件稍微容易理解。如果节点没有父节点,则循环也将终止。
循环的每次迭代都会e = e.parentNode
,它将获得“当前”节点的父节点。如果循环执行2次迭代,那么将在dom(“祖父母”)上移动2层。
答案 1 :(得分:0)
看起来它得到了第n个父元素......
答案 2 :(得分:0)
循环的每次迭代都会查看传入元素的parentNode。因此,如果传入一个特定的div作为迭代因子,它将查看div的直接父级。如果你传入2,它将看起来2个父母(div的父母的父母)。它通过使用e.parentNode并在循环的每次迭代中将e重置为其父级来完成此操作。
答案 3 :(得分: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的值,然后减去1。如果您在上面的代码中使用--n,那么它只会执行一次(先减去)。
在你的代码中,如果n为2,循环将执行2次,在循环变量e(元素)设置为元素的父节点。如果没有父节点,那么e将是未定义的,在这种情况下,语句if(e){...}将不会执行任何操作,因为评估未定义的值会导致false。所以n&&当e未定义时(如没有父节点),即使n不为0,e也会返回false。