![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Sardar |
|
||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Очень часто нужно проверить форму перед отправкой. Часто задаются вопросы "как?" и эти вопросы преживут всех нас вместе взятых
Сегодня днём меня выгнали из лаборатории, уборка, потому свободен, а от свободы руки чешутся. Представим что при вёрстке формы мы можем задать правила, на то, какие значения допустимы в этом текстовом поле, интерактивная(при вводе) проверка(например только числа), минимум чекбоксов и какие должны быть отселектированны, что бы отправить форму и прочее. Назовём это механизм встроенных(inline) правил. После загрузки документ начинает контролироватся скриптом, у скрипта вся необходимая инфа что делать в различных ситуациях, от простых alert'ов, до сложных вычислений. Назовём эту инфу просто "Описание". Пара слов о inline правилахНужен некоторый синтаксис для описания правил. Не будем изобретать велосипед и сидеть неделями за докозательствами тех или иных решений. Возьмем за основу синтаксис CSS:
Мы определили 3 правила: проверка в момент ввода, допустимые символы и не допустимые символы. Что же должно произойти в случае не правильного ввода? Проверка в момент ввода уже подразумевает не остановку отправки формы, значит нужно обьявить какое нибудь поведени, иначе ничего не произойдёт. Читаем об этом ниже. Писать для каждого поля свой набор правил трудоёмкая задача, потому будем также определять общие (shared) правила в Описании. Эти правила затем вставляются в inline правила. Отсюда сделаем первый вывод: существует помимо механизма inline правил еще и набор комманд, например import, которую только что рассмотрели. Придумаем для этого еще один аттрибут элемента: validatorCommand. Вот и первые вопросы. Давайте опеделим как можно больше ситуаций(что нужно сделать) с которыми мы встречаемся при проверке формы. Отсюда мы придумаем набор правил, комбинации которых позволят охватить всю широту темы Пара слов о ОписанииВ описании мы будем определять общие правила и действия, для конкретных ситуаций. Описание может быть определенно в:
В 90% случаем нужно просто не отправить форму, но нужны также и расширенные возможности. В основном в описании будут указыватся пользовательские функции, но также реализуем несколько наиболее частых решений. Например чекбоксы доступны только если только radiobutton отселектирован(подвод элементов под паттерн). Синтаксис должен быть простым и не утомительным как для человека, так и для парсера. Над этим нужно основательно подумать. Для примера выше можно определить действие в случии не правильного ввода и связать это действие с элементом:
Этот пример говорит: при ошибке ввода вызывай функцию alert(она стандартная, скрипту безразлично), передай ей аргументы(сторку). В аргументах встречатются простые операции. Синтаксис кажется сложным? Как видим этот способ позволяет вызвать любую функцию с некоторыми аргументами, при этом аргументы можно задать в зависимости от ситуации. В контексте handler существует несколько переменных связанных с элементом и ситуацией. Время выходит, вечером допишу остальное. Я вывожу основу/идеюм которая всегда обьемна. В использовании это всё будет компактным и удобным. Призываю всех присоединится к проекту, задачка интересна и увлекательна -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||
|
|||||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 10 Всего: 360 |
А рэгами условие на проверку задать нельзя? (Сорри, я в них не разбирался ещё)
|
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
А как раз зачастую регами и будет проверятся ввод Идея в некотором универсальном механизме валидации формы, не задымываясь над JS кодом. Синстаксис и общая идея почти как у CSS стилей, мы задаем правила, которые описывают конкретный элемент. В зависимости от типа элемента бдует выполнятся валидация. Вообще идея составить спецификацию на подибии CSS, а затем реализовать её. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Alx |
|
||||||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: 10 Всего: 78 |
ну что ж идея очень интересная и заманчивая!
1. если мы задаем аттрибут для тегов формы, то когда будет вызываться сам валидатор? перед отпракой/во премя изменения/после изменения? 2. как эти строчки отностится к JavaScript?
3. по поводу правил интерпретации наших установок: по-моему лучше всего сделать JavaScript-код наподобии CSS, т.е. правила могут задаваться непосредственно в атрибуте validator, который по аналогии равен style. Так же можно задавать атрибут class, пусть он будет vclass.
в нашем JavaScript-коде будет следуещее:
вот. т.е. при разборе скрипта основной функцией, если задан vclass txt1, то мы не пропустиим русские буквы, символы и циферку 6. если же ничего не будет указано, то будем действовать по умолчанию для input_text. Я правильно тебя понял? |
||||||
|
|||||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Не совсем, но хорошо что ты откликнулся
Мы работаем только с формами, т.е. только с вводом. Конечно основой нашей "библиотечки" будут общие функции/обьекты, так что программист может подключить нужный ему код. Синтаксис inline правил почти точная копия CSS, только мы описываем как форма будет валидироватся. Я ушел дальше аттрибута class в CSS, теперь мы имеем аттрибут validatorCommands, в котором мы описываем специфику проверки, не правила. Также нужно полностью отойти от JS, мы разрабатываем общую спецификацию, которая может быть реализованна браузером на прямую или плагином. Поддерживается механизм вызова пользовательского кода, на уровне спецификации это "функции", пример выше. Теперь идея. Проверять мы будем вводимые данные в элементы формы. Также связывать элементы между собой, например группа чекбоксов становится доступной если другая группа элементов приходит в нужное состояние. Когда же проверять элемeнт/форму? Мы абстрагируемся от событий и выведем две ситуации:
Когда мы задаем правила, система должна выставлять "умные" дефолтовые значения для не указанных свойтв. Например нам не нужно обьявлять форме, что она не отправится, пока в таком то текстовом поле не будет валидный и-меил. Задав такое правило для элемента форма примет по умолчанию: проверка в пассивном режиме, дейтвие формы - остановка отправки. Пользовательские обработчики Но стандартных действий не достаточно, будем ресширять пользовательским кодом. Для этого существуют обработчики состояний, таких у нас три вида:
Пользовательский обработчик это всегда пользовательская функция. Если подумать логично, то зачем реализовывать свой "урезанный" язык Перед вызовом функции мы можем сконструировать необходимые аргументы. Нам дступны некоторые операции, например конкатенация строк и простейшие арифметические операции(+, -, / ,*). К сожалению реализовывать мы это будем на JS, следовательно код должен быть компактным. Сложные выражения без КС грамматик не реализовать, значит с ними будет туго. Но это не мешает нам внести сложные выражения в спецификацию. Когда аргументы сформированны вызывается пользовательская функция. Отдельным аргументом к ней идёт контекст обработчика с информацией о элементе и т.п. Для аргументов существует только один тип - строки. Языки не поддерживающие свободные функции(Java), реализуют свой механизм вызова(например для Java это будет некий интерфейс). Пока выводы:
Что нужно: вспомнить свои ситуации с валидацией форм, какова была задача. Кидайте сюда описание, разберусь. На основе этих наблюдений будем составлять базовый набор правил. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 2 Всего: 83 |
У меня обычно валидация сводится к таким типам проверок:
|
|||
|
||||
| Sardar |
|
||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Вообще это реализуется регами. Но не все обычные пользователи умеют составять реги, потому введём две опции:
Опция работает как в интерактивном так и в пассивном режиме. Проверка выполняется первой, перед регами.
Введём две опции, тоже существуущие только для текстовых полей:
Заметим что патерны в основном нужны для пассивной проверки перед отправкой формы. В опциях выше вместо указывания значения можно дать имя, для этого имени найдётся нужное значение в глобальном Описании. Наиболее популярные уже существуют: email, euDate, usaDate и подобные.
Обычно, что бы форма отправилась, все элементы должны пройти проверку удачно. Но преставим ситуацию, форма отправится если:
Текстовое поле допускает паттерн email(это просто имя, значение инклюдится) или значения: пусто, слова "special value". Только в этом случаем она перейдёт в состояние pass. Чекбоксы добавляются в специальные группы, существующие только внутри конкретной формы. Из названия ясно как вычисляется результирующее значение. Теперь можно обратится к элементу индивидуально, либо к группе сразу. Группа несёт значения своих элементов и состояние проверки(pass/fail). Что мы хотим использовать задаем синтаксисом:
Естесвенно что комбинирование груп существует только для формы, не для элементов. Элементы могут только входить в одну или несколько груп. Группировка должна произойти так, что бы в конце осталось одно булево значение, которе и определит отрпавлятся ли форме. Чувствую надо лучше продумать. Добавлю: пример выше не верный, опция value несет другой смысл чем в задаче. Уже придумал немного другую концепций, позволяющую гибко работать с любым количеством различных проверок одного элемнта и комбинирования результатов. А главное понятно и довольно коротко -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||
|
|||||||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: 10 Всего: 78 |
GoodBoy
согласен |
|||
|
||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: 10 Всего: 78 |
так. пока я вот подумал, что нам надо будет проверять:
- заполнение необходимых полей - верное заполнение e-mail - верное заполнение определённых полей - соответствие полей password1 и password2 (повтор пароля) - в определённых селектах/чекбокс группах если ничего не выбрано, проверяем поле myValue (свой вариант) и наоборот. есливыбрат вариант из данных, свой : disabled и неиспользуется дальше. думаю раз уж мы пишем такую фичу, можно сделать ещё немколько отдельных полей. Например: <input type="country"> // option со всеми странами <input type="сities" value="rus|ukr|eng|ger|fra|ita|usa"> (тут как раз должно быть поле "Или введите другой город", у value можно оставить только rus, если на твой взгляд не стоит морочится с другими городами.) <input type="years" since="1900" for="2005"> // года с 1900 по 2005 <input type="mounthes"> // 12 месяцев <input type="days1" value="31|30|29|28"> 30 дней в месяце, если используется с полем mounthes, нужно будет делать установку количества дней. Например: if(april) value = 30; <input type="days2" value="s|m"> // дни недели (s - начало с воскресенья, m - начало с понедельника) эти поля используются очень часто, поэтому сделать их на мой взгляд нужно. Тогда меньше будет возьни с их проверкой (если делать обыкновенные input`ы). |
|||
|
||||
| Aliance |
|
||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
У меня есть много собственных валидаторов, отличные штуки.
Итак, попорядку:
Тут производяться 2 проверки: при изменении значения поля и при отсылки (общая) - какую выберете Вы - Вам решать ЗЫ: что бы пользователь не обошел проверку на локальной машине я всегда делаю так:
В этом случае юзер, отключивший JS вообще не сможет отправить форму =) Добавлено @ 18:52 ALEXANDRO Первый раз вижу такие type`ы input`ов... Может это не type, а name??? |
||||
|
|||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Aliance это код под определённую ситуацию, мы хотим сделать нечто общее. В данный момент обдумываем идею, реализовывать можно не только на JS, но и сделать встроенной в браузер. вообщем чтиай с начала
Нет это "наши" типы, после загрузки они заменятются на конкретные элементы. У меня пока идея сделать для этого отдельный тег, дабы браузер не смущать. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: 10 Всего: 78 |
я предлагаю назвать тег <alx>
|
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Сори, конечно должен я был все прочесть.
Просто понимаешь, меня 2 недели небыло, и прочесть все непрочитанные сообщения полностью за 1 день нереально Я по теме смотрел )) Добавлено @ 14:45 Тег нужно назвать <vin> (vingrad) |
|||
|
||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: 10 Всего: 78 |
ну тогда уж его нужно назвать <spetialinput>
Добавлено @ 17:12 или что-то в этом роде.... |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |