148 lines
5.3 KiB
JavaScript
148 lines
5.3 KiB
JavaScript
// ===================================================================
|
|
// Author: Matt Kruse <matt@mattkruse.com>
|
|
// WWW: http://www.mattkruse.com/
|
|
//
|
|
// NOTICE: You may use this code for any purpose, commercial or
|
|
// private, without any further permission from the author. You may
|
|
// remove this notice from your final code if you wish, however it is
|
|
// appreciated by the author if at least my web site address is kept.
|
|
//
|
|
// You may *NOT* re-distribute this code in any way except through its
|
|
// use. That means, you can include it in your product, or your web
|
|
// site, or any other form where the code is actually being used. You
|
|
// may not put the plain javascript up on your site for download or
|
|
// include it in your javascript libraries for download.
|
|
// If you wish to share this code with others, please just point them
|
|
// to the URL instead.
|
|
// Please DO NOT link directly to my .js files from your site. Copy
|
|
// the files to your server and use them there. Thank you.
|
|
// ===================================================================
|
|
|
|
/*
|
|
AnchorPosition.js
|
|
Author: Matt Kruse
|
|
Last modified: 10/11/02
|
|
|
|
DESCRIPTION: These functions find the position of an <A> tag in a document,
|
|
so other elements can be positioned relative to it.
|
|
|
|
COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small
|
|
positioning errors - usually with Window positioning - occur on the
|
|
Macintosh platform.
|
|
|
|
FUNCTIONS:
|
|
getAnchorPosition(anchorname)
|
|
Returns an Object() having .x and .y properties of the pixel coordinates
|
|
of the upper-left corner of the anchor. Position is relative to the PAGE.
|
|
|
|
getAnchorWindowPosition(anchorname)
|
|
Returns an Object() having .x and .y properties of the pixel coordinates
|
|
of the upper-left corner of the anchor, relative to the WHOLE SCREEN.
|
|
|
|
NOTES:
|
|
|
|
1) For popping up separate browser windows, use getAnchorWindowPosition.
|
|
Otherwise, use getAnchorPosition
|
|
|
|
2) Your anchor tag MUST contain both NAME and ID attributes which are the
|
|
same. For example:
|
|
<A NAME="test" ID="test"> </A>
|
|
|
|
3) There must be at least a space between <A> </A> for IE5.5 to see the
|
|
anchor tag correctly. Do not do <A></A> with no space.
|
|
*/
|
|
|
|
// getAnchorPosition(anchorname)
|
|
// This function returns an object having .x and .y properties which are the coordinates
|
|
// of the named anchor, relative to the page.
|
|
function getAnchorPosition(anchorname) {
|
|
// This function will return an Object with x and y properties
|
|
var useWindow=false;
|
|
var coordinates=new Object();
|
|
var x=0,y=0;
|
|
// Browser capability sniffing
|
|
var use_gebi=false, use_css=false, use_layers=false;
|
|
if (document.getElementById) { use_gebi=true; }
|
|
else if (document.all) { use_css=true; }
|
|
else if (document.layers) { use_layers=true; }
|
|
// Logic to find position
|
|
if (use_gebi && document.all) {
|
|
x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
|
|
y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
|
|
}
|
|
else if (use_gebi) {
|
|
var o=document.getElementById(anchorname);
|
|
x=AnchorPosition_getPageOffsetLeft(o);
|
|
y=AnchorPosition_getPageOffsetTop(o);
|
|
}
|
|
else if (use_css) {
|
|
x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
|
|
y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
|
|
}
|
|
else if (use_layers) {
|
|
var found=0;
|
|
for (var i=0; i<document.anchors.length; i++) {
|
|
if (document.anchors[i].name==anchorname) { found=1; break; }
|
|
}
|
|
if (found==0) {
|
|
coordinates.x=0; coordinates.y=0; return coordinates;
|
|
}
|
|
x=document.anchors[i].x;
|
|
y=document.anchors[i].y;
|
|
}
|
|
else {
|
|
coordinates.x=0; coordinates.y=0; return coordinates;
|
|
}
|
|
coordinates.x=x;
|
|
coordinates.y=y;
|
|
return coordinates;
|
|
}
|
|
|
|
// getAnchorWindowPosition(anchorname)
|
|
// This function returns an object having .x and .y properties which are the coordinates
|
|
// of the named anchor, relative to the window
|
|
function getAnchorWindowPosition(anchorname) {
|
|
var coordinates=getAnchorPosition(anchorname);
|
|
var x=0;
|
|
var y=0;
|
|
if (document.getElementById) {
|
|
if (isNaN(window.screenX)) {
|
|
x=coordinates.x-document.body.scrollLeft+window.screenLeft;
|
|
y=coordinates.y-document.body.scrollTop+window.screenTop;
|
|
}
|
|
else {
|
|
x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
|
|
y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
|
|
}
|
|
}
|
|
else if (document.all) {
|
|
x=coordinates.x-document.body.scrollLeft+window.screenLeft;
|
|
y=coordinates.y-document.body.scrollTop+window.screenTop;
|
|
}
|
|
else if (document.layers) {
|
|
x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
|
|
y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
|
|
}
|
|
coordinates.x=x;
|
|
coordinates.y=y;
|
|
return coordinates;
|
|
}
|
|
|
|
// Functions for IE to get position of an object
|
|
function AnchorPosition_getPageOffsetLeft (el) {
|
|
var ol=el.offsetLeft;
|
|
while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
|
|
return ol;
|
|
}
|
|
function AnchorPosition_getWindowOffsetLeft (el) {
|
|
return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;
|
|
}
|
|
function AnchorPosition_getPageOffsetTop (el) {
|
|
var ot=el.offsetTop;
|
|
while((el=el.offsetParent) != null) { ot += el.offsetTop; }
|
|
return ot;
|
|
}
|
|
function AnchorPosition_getWindowOffsetTop (el) {
|
|
return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;
|
|
}
|