//判断是否是IE
if(document.documentElement.getBoundingClientRect){
//注1
returnfunction(el){
varbox=el.getBoundingClientRect();
varrootNode=el.ownerDocument;
return[box.left+
Y.Dom.getDocumentScrollLeft(rootNode),box.top+
Y.Dom.getDocumentScrollTop(rootNode)];
};
}else{
returnfunction(el){
varpos=[el.offsetLeft,el.offsetTop];
varparentNode=el.offsetParent;
//判断是否在Safari下,节点是否为absolute,
//并且父元素是否为body
//注2.
varaccountForBody=(isSafari&&
Y.Dom.getStyle(el,'position')=='absolute'&&
el.offsetParent==el.ownerDocument.body);
//如果父元素不是自身
if(parentNode!=el){
while(parentNode){
pos[0]+=parentNode.offsetLeft;
pos[1]+=parentNode.offsetTop;
if(!accountForBody&&isSafari&&
Y.Dom.getStyle(parentNode,'position')
=='absolute'){
accountForBody=true;
}
parentNode=parentNode.offsetParent;
}
}
//还是针对Safari的
if(accountForBody){//safaridoublesinthiscase
pos[0]-=el.ownerDocument.body.offsetLeft;
pos[1]-=el.ownerDocument.body.offsetTop;
}
parentNode=el.parentNode;
//accountforanyscrolledancestors
while(parentNode.tagName&&
!patterns.ROOT_TAG.test(parentNode.tagName))
{
//workaroundoperainline/tablescrollLeft/Topbug
//注3.
if(Y.Dom.getStyle(parentNode,'display')
.search(/^inline|table-row.*$/i)){
pos[0]-=parentNode.scrollLeft;
pos[1]-=parentNode.scrollTop;
}
parentNode=parentNode.parentNode;
}
returnpos;
};
}
}()//NOTE:Executingforloadtimebranching注.有关IE的getBoundingClientRect方法,可以参考这里。
注.Safari的BUG,详细情况参见这里。
注.参见老外的原话(出处):
"-RemoveparentscrollUNLESSthatparentisinlineoratable
toworkaroundOperainline/tablescrollLeft/Topbug"
FixedinOpera9.5.(also,Opera9.5supportsgetBoundingClientRect
andgetClientRects.)最后,有关更多DOM的兼容性,可以参看PPK的总结(怎么又是他)。