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;
}();