Перехват координат курсора мыши 1 раз в секунду
Подскажите, пожалуйста, как это сделать... при помощи onmousemove и setTimeout не выходит(
|
никак.
|
onmousemove на body.
|
Цитата:
А если двигать резко и за пределы браузера, то тоже :) |
Вот так всегда... задашь вопрос и прийдёт озарение...
Делаем три массива... x координата y координата t координата времени аналогично функции time() в PHP Далее из полученного массива меток времени выбираем уникальные элементы, с каждым из которых связаны по 1 координате в массиве x и y. o_O Хотя, конечно, хотелось бы решение проблемы "без извращений" получить... |
Координаты можно узнать только по событию.
Функция для кросс-браузерного определения координат:
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 для всего документа и по таймеру отправляйте в функцию объект-событие, чтобы получить координаты курсора. |
Цитата:
|
Octane,
условная компиляция вещь хорошая, но опасная. Может возникнуть желание сжать скрипт YUICompressor'ом. |
Packer без проблем справляется с условной компиляцией, кроме извращенных случаев, типа:
return /*@cc_on makeArray( @*/ (node || document).getElementsByTagName(tag || '*') /*@cc_on ) @*/; А если YUICopressor не умеет сжимать конструкции JScript, зачем им пользоваться? |
Octane, не распишите более подробно функцию mousePosition, если можно было более даже очень подробно.
Заранее спасибо! |
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;
}();
|
Цитата:
|
Octane, большое спасибо! А каким образом переменная ie получает значение единицу в этой записи var ie /*@cc_on = 1 @*/; ? И что обозначает этот коммент /*@cc_on = 1 @*/; ?
|
Это не простые комментарии, а «Conditional Compilation», поддерживаются в JScript, который, в свою очередь, поддерживает Internet Explorer, вместо JavaSript.
Использовать можно, как и условные комментарии в HTML, для ограничения видимости кода другими браузерами. /*@cc_on многострочный вид @*/ //@cc_on однострочный вид И кстати, проверил через YUI Compressor Online, вроде нормально работает сжатый скрипт с условной компиляцией. |
Поддержка IE - это замечательно, а с кроссбраузерностью как у скрипта?
|
А то оба примера так работать заставить и не удалось(
В IE ругается на ClientX is null or not an object В FF на e undefined |
Функция будет работать во всех браузерах. Вы, наверное, не передавали в нее объект-событие при вызове.
|
| Часовой пояс GMT +3, время: 21:29. |