javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
发布时间:2016-12-30 来源:查字典编辑
摘要:vargetXY=function(){//判断是否是IEif(document.documentElement.getBoundingCl...

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的总结(怎么又是他)。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类