L1nuX, как я понял, необходимо определить координаты щелчка мыши относительно всего документа или относительно элемента, получившего событие? могу только 2 варианта предложить, т.к. не знаю конкретно что ты хочешь сделать за скрипт. 1.используются относительные координаты, то есть пользователь кликнул и невложенный элемент позиционирует туда.
обработчик события document.onmousedown - moveToClisk;
Code
function moveToClick(evt) {
evt = (evt) ? evt : event;
if (evt.shiftKey) {
var coords = getPagetEventCoords(evt);
shiftTo("mapArrow". coords Left. coords.top);
}
2. юзер щелкает, необходимо определить координаты относительно внешнего неподвижного элемента.
Это выполняется в процедуре инициализации, запускаемой событием onload: document.getElementByld("myMap").onmousedown = moveToClick
Code
function moveToClick(evt) {
evt = (evt) ? evt : event;
if (evt.shiftKey) {
var coords = getPositionedEventCoords(evt);
shiftToC'mapArrow". coords.left, coords.top);
}
}
В функции getPageEventCoords(), показанной далее, имеется две основные ветви, необходимые для определения положения события мыши в координатной плоскости документа. Первая из них применяет более простые в применении свойства, имеющиеся в Netscape: pageX и pageY. Но в IE для того, чтобы точно переместить элемент в указанное место, приходится выполнять гораздо больше вычислений. Используя свойства clientX и clientY, нужно учитывать прокрутку документа и небольшой сдвиг, который IE автоматически добавляет к документу (обычно это два px по обеим осям). Если же IE работает в режиме совместимости с CSS, в уравнение следует внести небольшой сдвиг элементов HTML.
Code
function getPageEventCoords(evt) {
var coords = {left:0. top:0};
if (evt.pageX) {
coords.left = evt.pageX;
coords.top = evt.pageY;
} else if (evt.clientX) {
coords, left = evt.clientX + document.body.scroll Left - document.body.с1i entLeft;
coords.top = evt.clientY + document.body.scroll Top - document.body.clientTop;
// если нужно, учитываем положение внешнего элемента
if (document.body.parentElement &&
document.body.parentElement.clientLeft) {
var bodParent = document.body.parentElement;
coords.left += bodParent.scroll Left - bodParent.clientLeft;
coords.top += bodParent.scroll Top - bodParent.clientTop;
}
}
return coords;
}
Определение координат события относительно подвижного элемента — задача функции getPositionedEventCoordsO, код которой показан в следующем листинге. Здесь ветка IE, которая поддерживает свойства offsetX и offsetY, самая простая. Ветка Netscape использует свойства layerX и layerY, значения которых требуется только немного подстроить, чтобы учесть границы элемента. А чтобы предотвратить дальнейшую передачу этого события (что может привести к конфликтам с другими событиями mousedown), его свойству cancelBubble присваивается значение true:
Code
function getPositionedEventCoords(evt) {
var elan = (evt.target) ? evt.target : evt srcElement;
var coords = {left:0. top:0};
if (evt.iayerX) {
var borders = {left:parseInt(getElementStyle("progressBar".
"borderLeftWidth". "border-left-width")).
top:parseInt(getElementStyle("progressBar"
"borderTopWidth". "border-top-width"))};
coords.left = evt.layerX - borders.left;
coords.top = evt.layerY - borders.top;
} else i f (evt.offsetX) {
coords.left = evt.offsetX;
coords.top = evt.offsetY;
}
evt.cancel Bubble = true;
return coords;
}
проверь код, часть кода из справочника по js и я ее не проверял. и если используются отступы css то в IE будут глюки в любом случае