Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Блокировка недопустимых символов
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Блокировка недопустимых символов

Страниц (1): [1]
 

1. Bertolomych - 08 Августа, 2010 - 14:07:42 - перейти к сообщению
Здравствуйте!
Столкнулся с проблемой блокировки недопустимых символов в поле ввода (например, букв, там, где должны быть только цифры). И, хотя, казалось бы, проблема тривиальная и часто возникает, почему-то не могу найти нормального решения.
В основном нашел вот такие:
CODE (javascript):
скопировать код в буфер обмена
  1. <input type="text" onkeyup="this.value = this.value.replace(/[^0-9:.\/]/, '')">

Но у этого решения есть один существенный недостаток: если ввести строку, а потом попытаться отредактировать ее середину, то ничего не выйдет - при нажатии клавиши, курсор смещается в конец строки, и именно там и вводит символ.
Некоторые товарищи предлагают использовать keycode и event.stopPropagation. Но тут возникает вопрос: как различить, к примеру ":" и "Ж" клавиши-то одни, раскладка разная!
Ну, еще есть куча решений со всплывающими подсказками "вы ввели неправильный символ", но они в данном случае не подходят..

Вопрос: может, кто знает нормальное решение этой задачи?

З.Ы. Я точно видел на некоторых сайтах такие поля, куда недопустимые символы просто не вводятся (а не исчезают, появившись на секунду, как в случае приведенного выше решения). Но поди их теперь разыщи эти сайты..
2. alexspb - 08 Августа, 2010 - 14:16:50 - перейти к сообщению
замените onkeyup на onblur
(Добавление)
Для нормальных пользователей должно быть достаточно предупреждения о недопустимых символах + onblur вырезать лишнее

Для роботов и хитрых пользователей - все-равно проверка на стороне сервера
3. Bertolomych - 08 Августа, 2010 - 19:30:10 - перейти к сообщению
Да-да. На худой конец я именно так и собирался сделать.
Но все-таки, простота подхода, когда ненужные символы просто не вводятся, по сравнению со всякими подсказками.. такая желанная! Улыбка
4. JustUserR - 09 Августа, 2010 - 03:09:32 - перейти к сообщению
Bertolomych пишет:
Но у этого решения есть один существенный недостаток: если ввести строку, а потом попытаться отредактировать ее середину, то ничего не выйдет - при нажатии клавиши, курсор смещается в конец строки, и именно там и вводит символ
Для того чтобы осуществлять динамическую обработку данных вводимых в текстовое поле на основе регулярного выражения определяющего шаблон допустимых символов - необходимо добавить предварительное сохранение текущей позиции курсора и его возвращения в исходное положение после произведения фильтрации Так как механизмы получения и установки позиции курсора в различных браузерах отличаются - из-за того что в них имеется различный принцип работы и программное взаимодейсвие с объектом текущего выделения - то необходимо использовать универсальную кросс-браузерную функцию описанную например здесь http://kurilka[dot]co[dot]ua/archives/getcaretpos/ Далее вам будет необходимо только несколько модифицировать текущий механизи фильтрации - а именно добавить в него получение и установку положения курсора в соответсвующий момент времени Кроме того следует выделить JS-код из on_event-блока в отдельную функцию и использовать именно ее вызов в возможной передачей текущего DOM-объекта - это нужно для избежания синтаксических ошибок связанных с различием уровней экранирования HTML и JS-кода
5. Bertolomych - 09 Августа, 2010 - 04:15:17 - перейти к сообщению
Ого! Ничего себе "простое элегантное решение"! Улыбка
Спасибо, будем пробовать.
Эх.. они бы там еще описали как этот курсор потом на место вернуть.. В затруднении
6. JustUserR - 10 Августа, 2010 - 03:13:11 - перейти к сообщению
Bertolomych пишет:
Ого! Ничего себе "простое элегантное решение"!
Спасибо, будем пробовать.
Эх.. они бы там еще описали как этот курсор потом на место вернуть..
Пожалуйста! На самом деле данное решение несмотря на достаточный объем используемого JS-кода является достаточно простым - ведь в нем используются обычные JS-объекты для управления курсором внутри текстового поля - и события взаимодействия с ним на основе возникновеня которых происходит обработка Тем не менее можно использовать и более сложный метод заключающийся в создании и программировании собственного элемента управления для текстового поля - а вместе с ним и описание динамического взаимодейтсвия с ним и эффективного рендеринга
Что касается функции для установки курсора в некоторую позицию - можете посмотреть это решение http://jscript[dot]ru/archives/60

 

Powered by ExBB FM 1.0 RC1