Показать сообщение отдельно
  #11 (permalink)  
Старый 16.01.2009, 21:04
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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, 16.01.2009 в 21:15.
Ответить с цитированием