Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #12 (permalink)  
Старый 17.01.2009, 13:40
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Octane
А если YUICopressor не умеет сжимать конструкции JScript, зачем им пользоваться?
Затем, что лучше него никто не умеет сжимать все остальные конструкции. А Packer вообще вещь бесполезная.
Ответить с цитированием
  #13 (permalink)  
Старый 17.01.2009, 19:12
Аватар для HelpeR
Профессор
Отправить личное сообщение для HelpeR Посмотреть профиль Найти все сообщения от HelpeR
 
Регистрация: 21.10.2008
Сообщений: 241

Octane, большое спасибо! А каким образом переменная ie получает значение единицу в этой записи var ie /*@cc_on = 1 @*/; ? И что обозначает этот коммент /*@cc_on = 1 @*/; ?
Ответить с цитированием
  #14 (permalink)  
Старый 17.01.2009, 19:42
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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

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


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


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

Последний раз редактировалось Octane, 17.01.2009 в 20:15.
Ответить с цитированием
  #15 (permalink)  
Старый 20.01.2009, 12:13
Бондя
 
Сообщений: n/a

Поддержка IE - это замечательно, а с кроссбраузерностью как у скрипта?
Ответить с цитированием
  #16 (permalink)  
Старый 20.01.2009, 12:26
Бондя
 
Сообщений: n/a

А то оба примера так работать заставить и не удалось(
В IE ругается на ClientX is null or not an object
В FF на e undefined
Ответить с цитированием
  #17 (permalink)  
Старый 20.01.2009, 14:44
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск