 
			
				19.12.2009, 17:15
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.09.2009 
					
					
					
						Сообщений: 1,578
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Кроссбраузерная обработка нажатий клавиш
			 
			
		
		
		
		Привет. 
Есть у кого то функция (или ссылка посмотреть) чтобы однозначно для всех браузеров можно было обработать и виртуальные коды клавиш и unicod символы? 
Например такого типа:
 
function (what, event)
{
    if (what == 'keypress')
    {
        // получаем код unicod символа по event.which или пусто если не символ
        return code;
    }
if (what == 'keyup/keydown')
    {
        // получаем код виртуальной клавиши по event.keyCode и event.which
        return code;
    }
    
}
Думал в jQuery это решено, но смотрю там тоже есть путаница. 
Я понимаю, что можно и самому поперебирать, но замечаю что в той же опере от версии к версии меняются подходы, так что хотелось бы одну 100% правильную иметь где все уже учтено.   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.12.2009, 10:45
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.09.2009 
					
					
					
						Сообщений: 1,578
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 В принципе при более подробном изучении все примерно нормально в jQuery - пару приколов в опере, и главное их не мешать - обработку символьных клавиш с управляющими .... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.12.2009, 15:09
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 
 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.12.2008 
					
					
					
						Сообщений: 4,201
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		ну расскажи тогда уж, что накопал. Ты ж не сам с собой разговариваешь?    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.12.2009, 16:14
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.09.2009 
					
					
					
						Сообщений: 1,578
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от x-yuri
			 
		
	 | 
 
	
		ну расскажи тогда уж, что накопал. Ты ж не сам с собой разговариваешь?  
	 | 
 
	
 
 Нет, с вами разговариваю. 
Получается значит вот что: 
Исходные данные:
 1-ый случай - обрабатываем нажатие кнопок, соответствующих видимым символам (алфавитно-цифровые, ...) 
 
$('...').keypress(function(e) {
/*
     e.which
держит unicod значение символа, управляющие кнопки обрабатывать тут не следует (из-за Chrome и не только )
*/
});
2-ой случай - обрабатываем нажатие управляющих кнопок (стрелки, backspace, esc ...)
 
$('...').keyup/keydown(function(e) {
/*
    e.keyCode
держит код нажатой виртуальной клавиши. Тут обрабатываем [B]только[/B] нажатие управляющих кнопок.
Тут есть тонкость в Опере: если нужно обрабатывать кнопку стрелка вниз(keyCode==40) или кнопку Tab(keyCode==9), 
то не надо это делать в keyup(событие не произойдет), а только в keydown.
*/
});
Вот, пока все.   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.12.2009, 00:47
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор Всея Форума 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 4,021
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 keypress для меня вообще тайна, покрытая мраком... Каждый браузер генерит событие по-разному... Уж лучше тогда обходиться связкой keydown/keyup, для которой нетрудно написать обёртку. 
 
Насчёт Tab: событие keyup происходит уже не на том элементе, где был keydown, а там, куда попал фокус. В этой ситуации, после keydown нужно прикручивать blur. 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось B~Vladi, 22.12.2009 в 00:49.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.12.2009, 10:05
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от B~Vladi
			
		
	 | 
 
	| 
		Уж лучше тогда обходиться связкой keydown/keyup, для которой нетрудно написать обёртку.
	 | 
 
	
 
 Отличия у них существенные: keydown сообщает о нажатии клавиши, а keypress -- о вводе символа. Это в теории, на практике всё, разумеется, хуже.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.12.2009, 11:25
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.09.2009 
					
					
					
						Сообщений: 1,578
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Я вообще в jQuery смотрел. Там многое уже наверное решено. 
	
 
	
		
			Сообщение от B~Vladi
			 
		
	 | 
 
	| 
		keypress для меня вообще тайна, покрытая мраком... Каждый браузер генерит событие по-разному... Уж лучше тогда обходиться связкой keydown/keyup, для которой нетрудно написать обёртку.
	 | 
 
	
 
 keypress для описанных мной случаев везде нормально работает - и символы в верхнем регистре тоже ОК. А в keydown/keyup как определять что нажата shift - запоминать что-ли отдельно?
 
	
 
	
		
			Сообщение от B~Vladi
			 
		
	 | 
 
	| 
		Насчёт Tab: событие keyup происходит уже не на том элементе, где был keydown, а там, куда попал фокус. В этой ситуации, после keydown нужно прикручивать blur.
	 | 
 
	
 
 Это в опере только так, в остальных keyup  сработает также на покидаемом элементе.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.12.2009, 11:36
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от micscr
			
		
	 | 
 
	| 
		А в keydown/keyup как определять что нажата shift - запоминать что-ли отдельно?
	 | 
 
	
 
 Про Caps не забываем    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.12.2009, 11:40
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.09.2009 
					
					
					
						Сообщений: 1,578
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Kolyaj
			 
		
	 | 
 
	
		Про Caps не забываем  
	 | 
 
	
 
 Да, забывать не надо   . А в  keypress все это уже решено.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.12.2009, 11:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Новичок на форуме 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.02.2008 
					
					
					
						Сообщений: 9,177
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от micscr
			
		
	 | 
 
	| 
		А в keypress все это уже решено.
	 | 
 
	
 
 Если нужна нажатая клавиша (горячие клавиши, например) -- ловим keydown, если нужен введённый символ (фильтрация ввода, например) -- ловим keypress.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |