返回首页

简介
有时(特别是在AJAX的项目),它是要得到一些quot DOM元素的位置; absolutequot;在当前文档中的坐标。例如,这样一个quot; absolutequot;位置是需要的,如果你想显示一些隐藏的DIV对象正是另一个元素的位置(或一些偏移)。我们使用此功能在我们的项目之一,到下一个文本标签显示一个弹出菜单。解决方案
等特性style.left,style.top,或offsetLeft,offsetTop可以在它的父元素的位置,用来获取(或设置)。因此,要在文档中的元素的绝对位置,我们应该向上移动元素的树和添加所有元素的父母(除最新的文档中的元素)位置。
然而,这是不太容易。还有一些问题:首先,我们需要考虑到可能的滚动元素的父母,并相应地减少我们的结果。第二,有一些区别(像往常一样:-(),在不同的浏览器的行为。对于Internet Explorer,我们永远只是减去滚动位置的元素的offsetParent属性中存储的对象,但对于Firefox,我们还需要采取考虑到所有的家长对于ParentNode属性访问。最后,我们应该考虑到一些父元素的边框宽度。不幸的是,这个任务也不是那么容易,因为它,特别是IE浏览器,可咋办。
所以,在这里我们得到的功能:

function __getIEVersion() {

    var rv = -1; // Return value assumes failure.

    if (navigator.appName == 'Microsoft Internet Explorer') {

        var ua = navigator.userAgent;

        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");

        if (re.exec(ua) != null)

            rv = parseFloat(RegExp.$1);

    }

    return rv;

}



function __getOperaVersion() {

    var rv = 0; // Default value

    if (window.opera) {

        var sver = window.opera.version();

        rv = parseFloat(sver);

    }

    return rv;

}



var __userAgent = navigator.userAgent;

var __isIE =  navigator.appVersion.match(/MSIE/) != null;

var __IEVersion = __getIEVersion();

var __isIENew = __isIE && __IEVersion >= 8;

var __isIEOld = __isIE && !__isIENew;



var __isFireFox = __userAgent.match(/firefox/i) != null;

var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || 

	(__userAgent.match(/firefox\/1./i) != null));

var __isFireFoxNew = __isFireFox && !__isFireFoxOld;



var __isWebKit =  navigator.appVersion.match(/WebKit/) != null;

var __isChrome =  navigator.appVersion.match(/Chrome/) != null;

var __isOpera =  window.opera != null;

var __operaVersion = __getOperaVersion();

var __isOperaOld = __isOpera && (__operaVersion < 10);



function __parseBorderWidth(width) {

    var res = 0;

    if (typeof(width) == "string" && width != null && width != "" ) {

        var p = width.indexOf("px");

        if (p >= 0) {

            res = parseInt(width.substring(0, p));

        }

        else {

     		//do not know how to calculate other values 

		//(such as 0.5em or 0.1cm) correctly now

    		//so just set the width to 1 pixel

            res = 1; 

        }

    }

    return res;

}



//returns border width for some element

function __getBorderWidth(element) {

	var res = new Object();

	res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;

	if (window.getComputedStyle) {

		//for Firefox

		var elStyle = window.getComputedStyle(element, null);

		res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));  

		res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));  

		res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));  

		res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));  

	}

	else {

		//for other browsers

		res.left = __parseBorderWidth(element.style.borderLeftWidth);

		res.top = __parseBorderWidth(element.style.borderTopWidth);

		res.right = __parseBorderWidth(element.style.borderRightWidth);

		res.bottom = __parseBorderWidth(element.style.borderBottomWidth);

	}

   

	return res;

}



//returns the absolute position of some element within document

function getElementAbsolutePos(element) {

	var res = new Object();

	res.x = 0; res.y = 0;

	if (element !== null) { 

		if (element.getBoundingClientRect) {

			var viewportElement = document.documentElement;  

 	        var box = element.getBoundingClientRect();

		    var scrollLeft = viewportElement.scrollLeft;

 		    var scrollTop = viewportElement.scrollTop;



		    res.x = box.left + scrollLeft;

		    res.y = box.top + scrollTop;



		}

		else { //for old browsers

			res.x = element.offsetLeft;

			res.y = element.offsetTop;



			var parentNode = element.parentNode;

			var borderWidth = null;



			while (offsetParent != null) {

				res.x += offsetParent.offsetLeft;

				res.y += offsetParent.offsetTop;

				

				var parentTagName = 

					offsetParent.tagName.toLowerCase();	



				if ((__isIEOld && parentTagName != "table") || 

					((__isFireFoxNew || __isChrome) && 

						parentTagName == "td")) {		    

					borderWidth = kGetBorderWidth

							(offsetParent);

					res.x += borderWidth.left;

					res.y += borderWidth.top;

				}

				

				if (offsetParent != document.body && 

				offsetParent != document.documentElement) {

					res.x -= offsetParent.scrollLeft;

					res.y -= offsetParent.scrollTop;

				}





				//next lines are necessary to fix the problem 

				//with offsetParent

				if (!__isIE && !__isOperaOld || __isIENew) {

					while (offsetParent != parentNode && 

						parentNode !== null) {

						res.x -= parentNode.scrollLeft;

						res.y -= parentNode.scrollTop;

						if (__isFireFoxOld || __isWebKit) 

						{

						    borderWidth = 

						     kGetBorderWidth(parentNode);

						    res.x += borderWidth.left;

						    res.y += borderWidth.top;

						}

						parentNode = parentNode.parentNode;

					}    

				}



				parentNode = offsetParent.parentNode;

				offsetParent = offsetParent.offsetParent;

			}

		}

	}

    return res;

}

要使用此功能,只需在函数的参数传递你的元素,得到的结果与存储在X和Y属性相应的左侧和顶部坐标对象:{C}
getElementAbsolutePos功能是最常见的浏览器进行测试: Internet Explorer 6.0和更高版本Firefox 2.x的和更高歌剧9.x的和更高版本谷歌浏览器历史2009年4月,二十一日:战后初期4月28日,2009:文章更新4月20日,2011年:第二十更新

回答

评论会员:Magnamus 时间:2012/01/25
。给人错误"offsetParent不定义为"

如果你声明在脚本的开始,它的功能只是返回"未定义"
评论会员:。谢尔盖Korzh 时间:2012/01/25
嗯。它的工作原理以及在我身边。 offsetParent是定义在DOM中的所有元素,我知道
只要尝试打开您的浏览器JavaScript控制台(CTRL移位我,然后单击"控制台"选项卡上),并尝试键入类似:
document.getElementById("Some element ID in your document").offsetParent
- 用户友好的广告临时查询生成器,为您的应用程序或网站
评论会员:会员2532971 时间:2012/01/25
钉这件事很长一段时间我一直试图,和你怎么知道你没有。 !现在很大。保持这种良好的工作男子
评论会员:!刘若英治疗Pilon 时间:2012/01/25
感谢你这么多
任何消息新版的浏览器版本?
所有最优秀的,

评论会员:WhiteRose1611 时间:2012/01/25
5
评论会员:谢尔盖Korzh 时间:2012/01/25
如何使用getBoundingClientRect
评论会员:?比托尔萨尔加多 时间:2012/01/25
你是什么意思?这个函数是用来在提交代码已经
- 用户友好的广告临时查询生成器,为您的应用程序或网站
评论会员:。谢尔盖Korzh 时间:2012/01/25
您好,
在旧的浏览器,此功能很好工作,但在Firefox 4和IE 9行之有效..

我有一个无形的div,我想下方出现的各种静态投入。所以,我需要
得到的位置这些输入的DIV CSS的如下因素:位置:绝对;宽度:自动;高度:自动显示:无;当我使用此功能,在现代浏览器像Firefox 4中的元素出现在页面的最右边。有什么建议?感谢
评论会员:ashokmk 时间:2012/01/25
我刚才已经发布了一个更新版本的文章与代码中的一些修改。
新版本以及最新的浏览器。
更新的文章将会尽快编辑审查和发布。 - 用户友好的广告临时查询生成器,为您的应用程序或网站
评论会员:游客 时间:2012/01/25
。SabarinathanArthanari
非常有用的,完整的代码可以直接用于{S0}
评论会员:游客 时间:2012/01/25
史蒂夫-威斯布鲁克:|sharing.SabarinathanArthanari感谢作为神(真理/爱)的孩子,我比什么都可能发生更大的阿卜杜勒卡拉姆博士
。ChiPlastique
评论会员:游客 时间:2012/01/25
最短,太。我一直在寻找一个可靠,清洁的方式做了很长时间
谢尔盖Korzh
评论会员:游客 时间:2012/01/25
?任何建议如何测试DOM元素的知名度感谢
!GladToBeGrey
评论会员:游客 时间:2012/01/25
我觉得它不能是一个很大的问题。只是,你应该检查被测元素的属性style.visibility。如果你想更准确,你还需要测试测试DOM元素的所有父母的财产。imgsrc=http://www.orcode.com/img/ico/smiley_confused.gif-用户友好的广告临时查询生成器,为您的应用程序或网站
谢尔盖Korzh
评论会员:游客 时间:2012/01/25
尼斯,有用的功能。但是,也许我正在暗淡,而不是作为一个JavaScript专家,但在下载的代码的功能名称,在代码中,引用的文章和在文章中表示名称的功能都不同。下载:kGetAbsolutePos(),引用代码:getAbsolutePos()的文​​章:getAbsoluteElementPos()。{S1}我没有通过代码检查,所以不知道是否有更多的差异。容易固定,如果这是唯一一个
。会员2522464
评论会员:游客 时间:2012/01/25
是的,你是对的。我已经从我们的一个项目(EasyQuery.NET)这些函数的一些其他的名字这段代码。对于文章中,我决定把那些更多的"共同"我们使用不带前缀的名称。但在有些地方,我只是忘了将它们重命名我已发布新版本的所有描述mistypes的是固定的文章。感谢您的建议。imgsrc=http://www.orcode.com/img/ico/smiley_confused.gif-用户友好的即席查询生成器,为您的应用程序或网站