Показать сообщение отдельно
  #6 (permalink)  
Старый 02.05.2009, 13:10
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Илья Кантор
Особо серьезных оптимизаций там даже в ущерб читабельности не сделаешь имхо.
Ну тогда продолжим :

1. все конструкции типа:
a = a || b;
полезно заменить на:
a || (a = b);

Это неплохо увеличивает производительность.
Вот так, например, выглядит мой вариант Event.fix :
if (e._fixed) return e;
e._fixed = true;
e.target || (e.target = e.srcElement || $d);
e.relatedTarget || e.fromElement && (e.relatedTarget = e.fromElement == e.target ? e.toElement : e.fromElement);
if (e.pageX == null && e.clientX != null) {
	var docElem = $d.documentElement, body = $d.body || {};
	e.pageX = e.clientX + (window.pageXOffset || docElem.scrollLeft || body.scrollLeft || 0) - (docElem.clientLeft || 0);
	e.pageY = e.clientY + (window.pageYOffset || docElem.scrollTop || body.scrollTop || 0) - (docElem.clientTop || 0);
}
e.which || e.button && (e.which = e.button & 1 ? 1 : e.button & 2 ? 3 : e.button & 4 ? 2 : 0);
e.preventDefault || (e.preventDefault = preventDefault);
e.stopPropagation || (e.stopPropagation = stopPropagation);
return e;


preventDefault и stopPropagation создаются заранее один раз.

2. в commonHandle переменные handler и ret используются один раз. Лучше вычислять их прямо там, где они используются:
function commonHandle(event) {
	event = fixEvent(event)

	var handlers = this.events[event.type]

	for ( var g in handlers ) {
		if ( handlers[g].call(this, event) === false ) {
			event.preventDefault()
			event.stopPropagation()
		}
	}
}


3. куски
if (!handler.guid) handler.guid = ++guid

и
elem.events[type][handler.guid] = handler

полезно объединить в одну конструкцию:
elem.events[type][handler.guid || (handler.guid = ++guid)] = handler;

Это позволяет избежать лишнего обращения к свойству объекта (.guid) и минус одна операция булевого отрицания (или как она там называется).

4. fixEvent можно сделать публичным. Во-первых, он может понадобиться при обработке в атрибуте элемента, куда код добавляется не через Event.add, во-вторых, может возникнуть необходимость переопределить его (менее вероятно) или обернуть в другую функцию (вот это очень вероятно) для увеличения функциональности.

--------

Не надоел еще?

Последний раз редактировалось Riim, 04.05.2009 в 12:58.
Ответить с цитированием