当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript YUI 读码日记之 YAHOO.util.Dom - Part.4

Javascript
JMenuTab简单使用说明
简单的JS多重继承示例
js另类写法
javascript cookie解码函数(兼容ff)
Javascript的一种模块模式
详解new function(){}和function(){}() 区别分析
YUI 读码日记之 YAHOO.lang.is*
用JS得到字符串中出现次数最多的字母
YUI 读码日记之 YAHOO.util.Dom - Part.1
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
利用js对象弹出一个层
js用图作提交按钮或超连接
通过 Dom 方法提高 innerHTML 性能
javascript 通用滑动门tab类
二行代码解决全部网页木马
JavaScript的面向对象方法以及差别
悟透JavaScript整理版
try finally 妙用,防止内存泄漏

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 176 ::
收藏到网摘: n/a

YAHOO.util.Dom 中的 getXY 函数让开发者充分体验到不同浏览器的 Hack 的乐趣。IE8 即将破壳而出,但愿下面的函数不会又多个 if 判断。getXY 函数使用 匿名函数执行返回 函数(听起来有点拗口,可以参考 圆心 Blog 上的一篇文章)。 var getXY = function() {
// 判断是否是 IE
if (document.documentElement.getBoundingClientRect) {
// 注1
return function(el) {
var box = el.getBoundingClientRect();
var rootNode = el.ownerDocument;
return [box.left +
Y.Dom.getDocumentScrollLeft(rootNode), box.top +
Y.Dom.getDocumentScrollTop(rootNode)];
};
} else {
return function(el) {
var pos = [el.offsetLeft, el.offsetTop];
var parentNode = el.offsetParent;
// 判断是否在 Safari 下,节点是否为 absolute ,
// 并且父元素是否为 body
// 注2.
var accountForBody = (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) { //safari doubles in this case
pos[0] -= el.ownerDocument.body.offsetLeft;
pos[1] -= el.ownerDocument.body.offsetTop;
}
parentNode = el.parentNode;
// account for any scrolled ancestors
while ( parentNode.tagName &&
!patterns.ROOT_TAG.test(parentNode.tagName) )
{
// work around opera inline/table scrollLeft/Top bug
// 注3.
if (Y.Dom.getStyle(parentNode, 'display')
.search(/^inline|table-row.*$/i)) {
pos[0] -= parentNode.scrollLeft;
pos[1] -= parentNode.scrollTop;
}
parentNode = parentNode.parentNode;
}
return pos;
};
}
}() // NOTE: Executing for loadtime branching注. 有关 IE 的 getBoundingClientRect 方法,可以参考这里。
注. Safari 的 BUG,详细情况参见这里。
注. 参见老外的原话(出处):
"- Remove parent scroll UNLESS that parent is inline or a table
to work around Opera inline/table scrollLeft/Top bug"
Fixed in Opera 9.5. (also, Opera 9.5 supports getBoundingClientRect
and getClientRects.)最后,有关更多 DOM 的兼容性,可以参看 PPK 的总结(怎么又是他)。