while ((elem = elem[dir]) && elem.nodeType !== 9) {
一个等号?
(elem = elem[dir]) && elem.nodeType !== 9 => elem = elem[dir] //返回elem的dir属性,并赋值给elem(这个属性的值是节点类型,例如dir="parentNode") && elem.nodeType !== 9 //赋值后的elem的nodeType 不等于9,也就是赋值后的elem不是document
当满足上面的两个条件的时候,继续循环。那么什么时候退出循环呢?
调用dir属性无法获取到值
调用dir属性得到的节点是document
这一步是将循环条件中设置当前元素为上一次执行循环时的元素的父节点,以便向上遍历,并且直到当前元素为document对象本身为止
没有错误,取出对应的值