Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   keypress для клавиши backspace в Firefox (https://javascript.ru/forum/jquery/41578-keypress-dlya-klavishi-backspace-v-firefox.html)

mi.rafaylik 20.09.2013 10:34

keypress и клавиша backspace в Firefox
 
Задача
Первичная проверка введённых символов в поле email адреса.
По keypress проверяем - если нажата неразрешённая клавиша, останавливаем функцию (точнее отменяем действие по умолчанию), здесь ничего нового:
$('#email').keypress(function(e){
	if (!(
		e.which>=48 && e.which<=57 ||
		e.which>=97 && e.which<=122 ||
		e.which==45 || e.which==46 ||
		e.which==64 || e.which==95)
	){
		return false;
	};
});

Почему keypress а не keydown
Плюс keypress - работает с большим количеством символов, например "@", что актуально для поля email.
Плюс keydown - работает с клавишами управления, такими как backspace и т.д.
Проблема
В браузере Firefox при такой проверке блокируется также и клавиша backspace (забой, код клавиши "8"), в результате чего набрать текст мы можем, а стереть нет.
Мысли вслух
Первая мысль - добавить backspace в список разрешённых клавиш, но ведь отловить её нажатие можно лишь событиями keydown/keyup!
Вторая мысль - делать дополнительное условие для события keydown, которое будет следить за клавишей backspace.
Проблема в том, что если вставить проверку события keydown внутрь keypress, оно (keydown) не будет обрабатываться, так как keydown срабатывает раньше чем keypress (который является неким гибридом keydown+keyup).
Третья мысль - делать проверку события keydown паралельно и если нажата клавиша клавиша backspace, присваивать некой переменной значение "1" (в противном случае присваивать "0"), и значение этой переменной проверять в событии keypress. Это решение кажется слишком сложным и вообще это костыли, поэтому хорошо бы найти другой путь.
Буду благодарен за Ваши мудрые мысли!

рони 20.09.2013 11:21

mi.rafaylik,
а что мешает добавить проверку на 8
$('#email').keypress(function(e){
   if(e.which != 8) {	if (!(
		e.which>=48 && e.which<=57 ||
		e.which>=97 && e.which<=122 ||
		e.which==45 || e.which==46 ||
		e.which==64 || e.which==95)

	){
		return false;
	}};
});

mi.rafaylik 20.09.2013 11:37

Спасибо, это действительно работает для Firefox, несмотря на то, что в данной таблице keypress не является обработчиком клавиши с кодом "8".
Устроил проверку, и она срабатывает только в Firefox, что и требовалось.
Интересно почему у Firefox такое поведение, ведь используя jQuery хочется получать кроссбраузерный результат, но это не всегда так )


Часовой пояс GMT +3, время: 08:52.