Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 04.05.2009, 03:09
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

ну если у тебя так получается...
Ответить с цитированием
  #22 (permalink)  
Старый 04.05.2009, 11:51
Аватар для Илья Кантор
Администратор
Отправить личное сообщение для Илья Кантор Посмотреть профиль Найти все сообщения от Илья Кантор
 
Регистрация: 25.05.2007
Сообщений: 1,223

Вообще, по моей практике оптимизация обработчика события имеет смысл ТОЛЬКО в onmousemove.

Иногда для этого имеет смысл вообще отказаться от библиотеки событий и делать все руками.

P.S. Пока не вижу пока существенного прироста производительности от оптимизаций, предложенных Riim. Бенчмарк был бы в тему.
Ответить с цитированием
  #23 (permalink)  
Старый 04.05.2009, 12:10
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Илья Кантор
не вижу пока существенного прироста производительности от оптимизаций
Да и нету там существенного прироста. Не понимаю, откуда здесь вообще взялась информация о !существенном! приросте.
Прирост мизерный и вряд ли получится его увидеть на примере drag&drop-а или чего-то подобного. Но он однозначно есть и это душу мою согревает.

Последний раз редактировалось Riim, 04.05.2009 в 14:08.
Ответить с цитированием
  #24 (permalink)  
Старый 04.05.2009, 15:38
Аватар для MaxPayne
Аспирант
Отправить личное сообщение для MaxPayne Посмотреть профиль Найти все сообщения от MaxPayne
 
Регистрация: 11.04.2009
Сообщений: 39

Вопрос по статье - где необходимо внести изменения, чтобы обрабатывать события клавиатуры, а не мыши? У клавиатуры - несколько другая специфика работы.
Ответить с цитированием
  #25 (permalink)  
Старый 04.05.2009, 15:48
Аватар для Илья Кантор
Администратор
Отправить личное сообщение для Илья Кантор Посмотреть профиль Найти все сообщения от Илья Кантор
 
Регистрация: 25.05.2007
Сообщений: 1,223

Riim: с такой позиции кнешна да, наверно процентов до 5% на простых обработчиках можно получить.

MaxPayne:
у клавиатуры надо фиксить коды клавиш, в остальном все также.
Ответить с цитированием
  #26 (permalink)  
Старый 04.05.2009, 19:45
Аватар для MaxPayne
Аспирант
Отправить личное сообщение для MaxPayne Посмотреть профиль Найти все сообщения от MaxPayne
 
Регистрация: 11.04.2009
Сообщений: 39

Сообщение от Илья Кантор Посмотреть сообщение
MaxPayne:
у клавиатуры надо фиксить коды клавиш, в остальном все также.
Т.е. вставить коды необходимых клавиш вместо этого участка?
if ( !event.which && event.button ) {
        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
    }


А как быть тут:

if (elem.addEventListener)
          elem.addEventListener(type, elem.handle, false)
        else if (elem.attachEvent)
          elem.attachEvent("on" + type, elem.handle)
      }

Или вызывать AttachEvent просто - type, без "on"?
Ответить с цитированием
  #27 (permalink)  
Старый 04.05.2009, 22:19
Аватар для MaxPayne
Аспирант
Отправить личное сообщение для MaxPayne Посмотреть профиль Найти все сообщения от MaxPayne
 
Регистрация: 11.04.2009
Сообщений: 39

хм.. делал по примеру, но все-таки не работает:

Event = (function() {
 
  var guid = 0;
 
  function fixEvent(event) {
    event = event || window.event;
    if ( event.isFixed ) { return event }
    event.isFixed = true 
    event.preventDefault = event.preventDefault || function(){this.returnValue = false}
    event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true}
 
    if (!event.target) { event.target = event.srcElement }
    if (!event.relatedTarget && event.fromElement) { event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; }
	
    return event
  }  
 
  function commonHandle(event) {
    event = fixEvent(event);
    var handlers = this.events[event.type];
    for ( var g in handlers ) {
      var handler = handlers[g];
	  var ret = handler.call(this, event)
      if ( ret === false ) {
          event.preventDefault();
          event.stopPropagation();
      }
    }
  }
 
  return {
    add: function(elem, type, handler) {
      if (elem.setInterval && ( elem != window && !elem.frameElement ) ) {
        elem = window;
      }
      if (!handler.guid) { handler.guid = ++guid }
      if (!elem.events) {
        elem.events = {};
        elem.handle = function(event) {
          if (typeof Event !== "undefined") {
            return commonHandle.call(elem, event)
          }
        }
      }
 
      if (!elem.events[type]) {
        elem.events[type] = {};        
 
        if (elem.addEventListener) elem.addEventListener(type, elem.handle, false)
        else if (elem.attachEvent) elem.attachEvent("on" + type, elem.handle)
      }
 
      elem.events[type][handler.guid] = handler;
    },
 
    remove: function(elem, type, handler) {
      var handlers = elem.events && elem.events[type];
 
      if (!handlers) return
 
      delete handlers[handler.guid]
 
      for(var any in handlers) return 
      if (elem.removeEventListener)
        elem.removeEventListener(type, elem.handle, false);
      else if (elem.detachEvent)
        elem.detachEvent("on" + type, elem.handle);
 
      delete elem.events[type];
 
      for (var any in elem.events) return
      delete elem.handle;
      delete elem.events;
    } 
  }
}())

function keymove(event) {
var code = (event.charCode) ? event.charCode : event.keyCode;
switch(code) 				
{ 					
	case 37: 	
		изменение положения элемента
	break; 					
	case 38: 						
		изменения положения элемента
	break; 					
}   
}


И вызов в другой функции:
Event.add('keypress', keymove);

Последний раз редактировалось MaxPayne, 04.05.2009 в 23:18.
Ответить с цитированием
  #28 (permalink)  
Старый 05.05.2009, 00:39
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от MaxPayne
И вызов в другой функции:
document добавь:

Event.add(document, 'keypress', keymove);
Ответить с цитированием
  #29 (permalink)  
Старый 05.05.2009, 01:05
Аватар для MaxPayne
Аспирант
Отправить личное сообщение для MaxPayne Посмотреть профиль Найти все сообщения от MaxPayne
 
Регистрация: 11.04.2009
Сообщений: 39

Спасибо! Уже по-крайней мере события клавиатуры перехватывает, но только после того как горизонтальный и вертикальный скроллы переместятся в один из краев. Вероятно не останавливаются стандартные обработчики.
Ответить с цитированием
  #30 (permalink)  
Старый 05.05.2009, 08:18
Аватар для MaxPayne
Аспирант
Отправить личное сообщение для MaxPayne Посмотреть профиль Найти все сообщения от MaxPayne
 
Регистрация: 11.04.2009
Сообщений: 39

Хм..

Добавил вместо:
event.preventDefault = event.preventDefault() || function(){this.returnValue = false};
    event.stopPropagation = event.stopPropagaton() || function(){this.cancelBubble = true};


Следующую конструкцию:
if (event.preventDefault) {
      	event.preventDefault();
        event.stopPropagation();
    	} else {
        	event.returnValue = false;
        	event.cancelBubble = true;
    		}


Все заработало именно так, как нужно.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как при добавлении изображения на сервер считывать имя в БД? solomusic Серверные языки и технологии 3 12.06.2008 22:28