/* *返回元素e的第n层祖先算元素,如果不存在此类祖先或祖先不是Element, *(例如Document或者DocumentFragment)则返回null *如果n为0,则返回本身。如果n为1(或省略),则返回其父元素 *如果n为2,则返回其祖父元素,依次类推 */ function parent(e, n) { if (n === undefined) { n = 1; } while (n-- && e) { e = e.parentNode; } if (!e || e.nodeType !== 1) { return null; } } /* *返回元素e的第n个兄弟元素 *如果n为正,返回后续的第n个兄弟元素 *如果n为负,返回前面的第n个兄弟元素 *如果n为零,返回e本身 */ function sibling(e, n) { while (e && n !== 0) { //如果e未定义,即刻返回它。 if (n > 0) { if (e.nextElementSibling) { e = e.nextElementSibling; } else { for (e = e.nextSibling; e.nodeType !== 1; e = e.nextSibling) // 空循环 } n--; } else { //查找前面的兄弟节点 if (e.previousElementSibling) {e=e.previousElementSibling;} else{ for(e.previousSibling;e&&.nodeType!==1;e=e.previousSibling) // 空循环 } n++; } } return e; } /* *返回元素e的第n代子元素,如果不存在则为null *负值n代表从后往前计数,0代表第一子元素,而-1代表最后一个,-2代表倒数第二个,依次类推 */ function child(e,n){ if (e.children) {//如果children数组存在 if (n<0) {n+=e.children.length;}//转换负的n为数组索引 if (n<0) {return null;}//如果仍然为负,说明没有子元素 return e.children[n];//返回指定的子元素 } //如果e没有children数组,找到第一个子元素并向前数,或者找到最好一个子元素并往回数 if (n>=0) {//n非负数:从第一个子元素向前数 if (e.firstElementChild) {e=e.firstElementChild;} else{ for(e=e.firstChild;e&&e.nodeType!==1;e=e.nextSibling) { //空循环 } return sibling(e,n);//返回第一个子元素的第n个兄弟元素 } }else{//n为负:从最后一个子元素往回数 if (e.lastElementChild){e=e.lastElementChild;} else (e=e.lastChild;e&&e.nodeType!==1;e=e.previousSibling){ //空循环 } } return sibling(e,n+1);//+1来转化最后一个子元素为最后1个兄弟元素 }