Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Перехват координат курсора мыши 1 раз в секунду (https://javascript.ru/forum/events/2569-perekhvat-koordinat-kursora-myshi-1-raz-v-sekundu.html)

Бондя 16.01.2009 18:55

Перехват координат курсора мыши 1 раз в секунду
 
Подскажите, пожалуйста, как это сделать... при помощи onmousemove и setTimeout не выходит(

ZoNT 16.01.2009 18:56

никак.

Kolyaj 16.01.2009 19:00

onmousemove на body.

ZoNT 16.01.2009 19:01

Цитата:

Сообщение от Kolyaj (Сообщение 10918)
onmousemove на body.

И если мышкой не двигать, то никаких координат ты не получишь...
А если двигать резко и за пределы браузера, то тоже :)

Бондя 16.01.2009 19:01

Вот так всегда... задашь вопрос и прийдёт озарение...
Делаем три массива...
x координата
y координата
t координата времени аналогично функции time() в PHP
Далее из полученного массива меток времени выбираем уникальные элементы, с каждым из которых связаны по 1 координате в массиве x и y.
o_O

Хотя, конечно, хотелось бы решение проблемы "без извращений" получить...

Octane 16.01.2009 19:02

Координаты можно узнать только по событию.

Функция для кросс-браузерного определения координат:
var mousePosition = function(ie) {
	return ie ? function(doc, body) {
		return function(e) {
			return {x: e.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0), y: e.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0)};
		};
	}(document.documentElement, document.body) : function(e) {
		return {x: e.pageX, y: e.pageY};
	}
}(/*@cc_on 1 @*/);


Добавьте обработчик события mousemove для всего документа и по таймеру отправляйте в функцию объект-событие, чтобы получить координаты курсора.

Kolyaj 16.01.2009 19:02

Цитата:

Сообщение от ZoNT
И если мышкой не двигать, то никаких координат ты не получишь...
А если двигать резко и за пределы браузера, то тоже

Я же их сохранять буду. А что за пределами браузера все равно.

Kolyaj 16.01.2009 19:05

Octane,
условная компиляция вещь хорошая, но опасная. Может возникнуть желание сжать скрипт YUICompressor'ом.

Octane 16.01.2009 19:11

Packer без проблем справляется с условной компиляцией, кроме извращенных случаев, типа:
return /*@cc_on makeArray( @*/ (node || document).getElementsByTagName(tag || '*') /*@cc_on ) @*/;

А если YUICopressor не умеет сжимать конструкции JScript, зачем им пользоваться?

HelpeR 16.01.2009 20:05

Octane, не распишите более подробно функцию mousePosition, если можно было более даже очень подробно.
Заранее спасибо!

Octane 16.01.2009 21:04

var mousePosition = function(ie) {
    return ie ? function(doc, body) { // замыкаем document.documentElement и document.body, чтобы запись была короче, и чтобы избежать инициализайции переменных при каджом использовании функции
        return function(e) {
            // алгоритм определения позиции курсора, подсмотренный в jQuery
            return {x: e.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0), y: e.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0)};
        };
    }(document.documentElement, document.body) : function(e) {
        // для W3C-совместимых браузеров ничего изобретать не нужно
        return {x: e.pageX, y: e.pageY};
    }
}(/*@cc_on 1 @*/); // в IE в функцию будет передана единица, в остальных браузерах аргумент ie будет undefined


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

В принципе можно как-нибудь проще написать:
var mousePosition = function() {
	var ie /*@cc_on = 1 @*/;
	var func;
	if(ie) {
		var doc = document.documentElement;
		var body = document.body;
		func = function(e) {
			return {x: e.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0), y: e.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0)};
		};
	}
	else {
		func = function(e) {
			return {x: e.pageX, y: e.pageY};
		};
	}
	return func;
}();

Kolyaj 17.01.2009 13:40

Цитата:

Сообщение от Octane
А если YUICopressor не умеет сжимать конструкции JScript, зачем им пользоваться?

Затем, что лучше него никто не умеет сжимать все остальные конструкции. А Packer вообще вещь бесполезная.

HelpeR 17.01.2009 19:12

Octane, большое спасибо! А каким образом переменная ie получает значение единицу в этой записи var ie /*@cc_on = 1 @*/; ? И что обозначает этот коммент /*@cc_on = 1 @*/; ?

Octane 17.01.2009 19:42

Это не простые комментарии, а «Conditional Compilation», поддерживаются в JScript, который, в свою очередь, поддерживает Internet Explorer, вместо JavaSript.

Использовать можно, как и условные комментарии в HTML, для ограничения видимости кода другими браузерами.

/*@cc_on
многострочный вид
@*/


//@cc_on однострочный вид


И кстати, проверил через YUI Compressor Online, вроде нормально работает сжатый скрипт с условной компиляцией.

Бондя 20.01.2009 12:13

Поддержка IE - это замечательно, а с кроссбраузерностью как у скрипта?

Бондя 20.01.2009 12:26

А то оба примера так работать заставить и не удалось(
В IE ругается на ClientX is null or not an object
В FF на e undefined

Octane 20.01.2009 14:44

Функция будет работать во всех браузерах. Вы, наверное, не передавали в нее объект-событие при вызове.


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