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)

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, время: 07:06.