欢迎来到福编程网,本站提供各种互联网专业知识!

javascript YUI 读码日记之 YAHOO.util.Dom - Part.4

发布时间:2008-03-22 作者: 来源:转载
YAHOO.util.Dom中的getXY函数让开发者充分体验到不同浏览器的Hack的乐趣。IE8即将破壳而出,但愿下面的函数不会又多个if判断。getXY函数使用匿名函数执行返回函数(听起来有点拗口,可以参考圆心Blog上的一篇文章)。
vargetXY=function(){
//判断是否是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的总结(怎么又是他)。

相关推荐