Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   offsetX, offsetY и firefox (https://javascript.ru/forum/misc/31077-offsetx-offsety-i-firefox.html)

dmitry111 26.08.2012 14:06

offsetX, offsetY и firefox
 
Как заставить firefox понимать эти свойства?

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>выпвып</title>
</head>

<body>
<div id="box" style="width: 100px; height: 100px; background: green;"></div>
<div id="valueX"></div>
<div id="valueY"></div>
<script>
    function func(e) {
        var x = document.getElementById("valueX");
        var y = document.getElementById("valueY");

        x.innerHTML = e.offsetX;
        y.innerHTML = e.offsetY;
    }
document.getElementById("box").addEventListener("mousemove", func);
</script>
</body>
</html>

bes 26.08.2012 14:41

чем clientX/clientY не устроил?
http://javascript.ru/tutorial/events...entx-y-pagex-y

dmitry111 26.08.2012 14:52

Цитата:

Сообщение от bes (Сообщение 200570)
чем clientX/clientY не устроил?
http://javascript.ru/tutorial/events...entx-y-pagex-y

Они показывают значения относительно окна браузера. И если элемент находится в центре окна и не равен размерам окна, то вывод значений этих свойств некорректен :cray:

bes 26.08.2012 14:57

чем pageX/pageY не устроил? :)
http://javascript.ru/tutorial/events...entx-y-pagex-y

dmitry111 26.08.2012 15:18

:)

Мне необходимо получить значения элемента, желательно без "костылей"
Никак нельзя?
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>выпвып</title>
</head>

<body>
<div id="box" style="width: 100px; height: 100px; background: green; position: absolute; left: 200px;"></div>
<div id="clientX" style="position: absolute; top: 120px; left: 50px;"></div>
<div id="clientY" style="position: absolute; top: 150px; left: 50px;"></div>
<div id="pageX" style="position: absolute; top: 120px; left: 100px;"></div>
<div id="pageY" style="position: absolute; top: 150px; left: 100px;"></div>
<div id="offsetX" style="position: absolute; top: 120px; left: 150px;"></div>
<div id="offsetY" style="position: absolute; top: 150px; left: 150px;"></div>
<script>
    function func(e) {
        var clientX = document.getElementById("clientX");
        var clientY = document.getElementById("clientY");
        var pageX = document.getElementById("pageX");
        var pageY = document.getElementById("pageY");
        var offsetX = document.getElementById("offsetX");
        var offsetY = document.getElementById("offsetY");


        clientX.innerHTML = "cX" + e.clientX;
        clientY.innerHTML = "cY" + e.clientY;

        pageX.innerHTML = "pX" + e.pageX;
        pageY.innerHTML = "pY" + e.pageY;

        offsetX.innerHTML = "oX" + e.offsetX;
        offsetY.innerHTML = "oY" + e.offsetY;

    }
    document.getElementById("box").addEventListener("mousemove", func);
</script>
</body>
</html>

bes 26.08.2012 15:20

FF вроде никогда его не поддерживал http://www.quirksmode.org/dom/w3c_cssom.html
Похожее от devote http://javascript.ru/forum/misc/2988...i-offsetx.html

dmitry111 26.08.2012 15:22

Правильные значения показывают только oX (offsetX), oY (offsetY) , но они не работают в firefox почему-то

dmitry111 26.08.2012 15:25

bes,
спасибо за ссылку :thanks:

Угу, не поддерживает :cray:

dmitry111 26.08.2012 17:21

Ну, предложит кто-нибудь как заставить работать clientX/clientY или pageX/pageY с позиционируемыми элементами?

Есть несколько идей решения этой задачи (например создать функцию, которая будет вычислять расстояние top/left до границ нужного элемента)
Но хотелось бы услышать/увидеть версии более авторитетных разработчиков, дабы не изобретать самому велосипеды :)

bes 26.08.2012 18:01

так пойдёт?
<style>
	div {
		position: absolute;
		left: 40%;
		top: 40%;
		width: 50px;
		height: 50px;
		background: lightgreen;
		padding: 20px;
	}
</style>


<div>div</div><span></span>

<script>
window.onload = function () {

	document.body.children[0].onmousemove = function (e) {
		e = e || event;
		var coords = this.getBoundingClientRect();
		var x = parseInt(e.clientX - coords.left);
		var y = parseInt(e.clientY - coords.top);
		this.nextSibling.innerHTML = x + '<br>' + y;
	}
}
</script>

dmitry111 26.08.2012 18:14

bes,

ага :yes:

dmitry111 26.08.2012 20:47

bes,

А не будет ли ваша функция нагружать систему, каждый раз вычисляя местоположение элемента и вычисляя значения положения мыши?

dmitry111 26.08.2012 20:48

не имею в виду конкретный пример.

bes 26.08.2012 21:42

ну дык и e.clientX(Y) каждый раз вычисляются и ничего + просчитываются не все точки, по которым прошёл курсор
<div style="background: lightgrey">быстро проведи мышью по мне</div><div></div>
<script>
document.body.children[0].onmousemove = function (e) {
	e = e || event;
	this.nextSibling.innerHTML += e.clientX + '; ' + e.clientY + '<br>'
}
</script>

dmitry111 26.08.2012 23:37

Покопавшись, нашел более "легкий" вариант написания кода:

<style>
	div {
		position: absolute;
		left: 40%;
		top: 40%;
		width: 50px;
		height: 50px;
		background: lightgreen;
		padding: 20px;
	}
</style>


<div>div</div><span></span>

<script>
window.onload = function () {

	document.body.children[0].onmousemove = function (e) {
		e = e || event;
		var coords = this.getBoundingClientRect();
		var x = Number(e.clientX - coords.left);
		var y = Number(e.clientY - coords.top);
		this.nextSibling.innerHTML = x + '<br>' + y;
	}
}
</script>


Так будет быстрее, потому как parseInt() помимо преобразования строки в число, еще анализирует ее, что занимает дополнительное время
Кстати, ParseInt согласно ES3, если получает число начинающееся с "0", интерпретирует его как восьмеричное число, поэтому желательно указывать во втором параметре систему счисления. Хотя можно и не указывать, это для особо придирчивых :)

bes 26.08.2012 23:41

ну я лишь таким образом округлил, там итак числа, можно округлить и другими способами :)

lancer 27.08.2012 00:15

Вложений: 1
Цитата:

Сообщение от dmitry111 (Сообщение 200574)
Они показывают значения относительно окна браузера. И если элемент находится в центре окна и не равен размерам окна, то вывод значений этих свойств некорректен :cray:

Если дело в этом, и тебе нужно нормально считывать координаты элемента.

Давно писал самописные всплывушки(см. аттач). Может стиль не супер, но сейчас посмотрел в FF и в IE9, все работает, как и прежде. Для оперы только надо изменить поправку и снести все касающееся IE6-IE7.

//вычисляем координаты элемента и относительно их устанвливаем подсказку
		var coords=getOffset(this);
		document.getElementById(help_up_id).style.top=coords['top'] - 85 + 'px'
		document.getElementById(help_up_id).style.left=coords['left'] - 14 + 'px';
		
		//поправки для нехороших браузеров.
		if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent))
		{
			document.getElementById(help_up_id).style.top=coords['top'] - 73 + 'px';
			document.getElementById(help_up_id).style.left=coords['left'] - 8 + 'px';
		}
		
		if (/MSIE (7).+Win/.test(navigator.userAgent))
		{
			document.getElementById(help_up_id).style.top=coords['top'] - 70+ 'px';
		}
		
		var ua = navigator.userAgent.toLowerCase();
		isOpera = (ua.indexOf("opera") != -1); 
		if (isOpera){
			document.getElementById(help_up_id).style.top=coords['top'] - 73 + 'px';
		}
		
		//Подсказкам для ссылок небольшая поправка координат вправо и вниз. 
		if(this.tagName=='A')
		{
			var help_top=parseInt(document.getElementById(help_up_id).style.top);
			var help_left=parseInt(document.getElementById(help_up_id).style.left);
			
			//поправки для нехороших браузеров.
			if (isOpera){
				document.getElementById(help_up_id).style.top=help_top +6 + 'px';
				document.getElementById(help_up_id).style.left=help_left +35 + 'px';
			}
			else if
			(/MSIE (5\.5|6).+Win/.test(navigator.userAgent))
			{
				document.getElementById(help_up_id).style.top=help_top +6 + 'px';
				document.getElementById(help_up_id).style.left=help_left +35 + 'px';
			}
			else if
			(/MSIE (7).+Win/.test(navigator.userAgent))
			{
				document.getElementById(help_up_id).style.top=help_top + 6 + 'px';
				document.getElementById(help_up_id).style.left=help_left +35 + 'px';
			}
			else
			{
			document.getElementById(help_up_id).style.top=help_top + 19 + "px";
			document.getElementById(help_up_id).style.left=help_left + 35 + "px";
			}
		}


Часовой пояс GMT +3, время: 05:38.