AjaxForm убивает <select>?
Всем доброго дня!
Понадобилось поставить в форму, которую обрабатывает FormIt через AjaxForm (в. 1.1.5), обычный select. Ну казалось бы всё просто. Всё сделал, форма уходит, данные приходят. Стал проверять форму на «дурака». Оказалось, что после второй неправильной попытки заполнения формы и при незаполненном select'е, он становится пустым. Т.е. было:
Вот ссылка на формы: Тест форм
Шансов конечно не много, что пользователь будет таким дЭбилом, что два раза неправильно заполнит форму и при этом забудет про селект, но надеятся на это не хочу. Куда копать, чтобы решить проблему?
Понадобилось поставить в форму, которую обрабатывает FormIt через AjaxForm (в. 1.1.5), обычный select. Ну казалось бы всё просто. Всё сделал, форма уходит, данные приходят. Стал проверять форму на «дурака». Оказалось, что после второй неправильной попытки заполнения формы и при незаполненном select'е, он становится пустым. Т.е. было:
<select id="numbers" name="numbers" value="">
<option value="">Select an option...</option>
<option value="one">One</option>
<option value="two">Two</option>
<option value="three">Three</option>
</select>
После второй валидации стало:<select id="numbers" name="numbers" value=""></select>
Не поленился, нашёл jscript для обработки формы без AjaxForm. Всё нормально — селект при любом количестве неправильных попыток не опустошается.Вот ссылка на формы: Тест форм
Шансов конечно не много, что пользователь будет таким дЭбилом, что два раза неправильно заполнит форму и при этом забудет про селект, но надеятся на это не хочу. Куда копать, чтобы решить проблему?
Комментарии: 17
У тега select нет атрибута value — www.w3schools.com/tags/tag_select.asp
ОК, убрал, но легче не стало. Пример с оформление селекта взят отсюда: FormIt
Значит, ищи ошибку вот тут и исправляй.
Скажу сразу — я в js, как свинья в апельсинах. Но вот что я нарыл:
Строка, из-за которой опустошается селект, была найдена быстро (default.js)
Итого: Василий с ГитХабом у меня еще хуже, чем с js, сможешь изменить класс «error» для полей на какой нибудь другой, например на «field-error»?
Строка, из-за которой опустошается селект, была найдена быстро (default.js)
54. form.find('[name="' + key + '"]').addClass('error');
А вот дальше начались танцы с бубном и призывом грома — я попробовал не находить строчку, а фильтровать, пробовал искать по атрибуту «name», ничего не изменилось. А потом покурил, стукнул в бубен и спросил: «О великий селект, почему ты глючишь?» И ответил селект: «А мне имя класса не нравится!» Вот тут я выпал в осадок, но поменял строчку 54. form.find('[name="' + key + '"]').addClass('field-error');
и всё заработало. На всякий случай убрал все стили (мало ли). Те же яйца, вид сбоку. Итого: Василий с ГитХабом у меня еще хуже, чем с js, сможешь изменить класс «error» для полей на какой нибудь другой, например на «field-error»?
Чтобы у всех пользователей сразу всё посыпалось? Нет, не могу.
Разбирайся, почему у тебя на сайте так происходит. Это явно локальная проблема.
Ну и эта, можно же переименовать скрипты, изменить как угодно и указать новое имя в настройках — всё будет работать и не перезапишется при обновлении.
Разбирайся, почему у тебя на сайте так происходит. Это явно локальная проблема.
Ну и эта, можно же переименовать скрипты, изменить как угодно и указать новое имя в настройках — всё будет работать и не перезапишется при обновлении.
Нет, не локальная. Я стал править дальше, чтобы класс «field-error» очищался и нашел строку из-за которой происходит весь конфликт и обнуление селекта:
37. form.find('.error').html('');
Вот содержимое селекта с классом «error» и обнуляется.
А вот это уже ошибка, да. Попробуй заменить на
form.find('.error').val('');
Стало еще хуже — обнуляются инпуты
Ну тогда вообще закомментируй эту строку.
Тоже не комильфо́, сообщения с ошибками не обнуляются. Я пока все-таки поставил вариант с другим именем класса для полей. И установил AjaxForm локально, чтобы он обновления не искал.
Главное — проблема локализована. Как ее решить с наименьшими потерями для всех, вряд ли подскажу, как я уже писал — не особо я разбираюсь в js, чуть-чуть jQuery умею. Время есть, а если кто-то столкнётся с проблемой, то хоть не будет биться головой об стенку, как я вчера.
Если нужна помощь в тестировании — всегда пожалуйста.
Главное — проблема локализована. Как ее решить с наименьшими потерями для всех, вряд ли подскажу, как я уже писал — не особо я разбираюсь в js, чуть-чуть jQuery умею. Время есть, а если кто-то столкнётся с проблемой, то хоть не будет биться головой об стенку, как я вчера.
Если нужна помощь в тестировании — всегда пожалуйста.
Я вот так и не смог воспроизвести. Все ок работает. Проверяйте браузер и расширения/плагины в нем, может какое расширение лишние классы навешивает?
В коде тоже все верно, там ничего менять не нужно. form.find('.error').html(''); выполняется для спана с текстом ошибки, а не для самого элемента.
В коде тоже все верно, там ничего менять не нужно. form.find('.error').html(''); выполняется для спана с текстом ошибки, а не для самого элемента.
> form.find('.error').html(''); выполняется для спана с текстом ошибки, а не для самого элемента.
И где вы это увидели? В строке про span нет ни слова. Обнуляются всё html содержимое елементов с классом .error. Обычные инпуты и текстареа не имеют html содержимого, поэтому их это не задевало. А вчера — сошлись звезды и понадобилась мне аджакс форма с селектом.
И где вы это увидели? В строке про span нет ни слова. Обнуляются всё html содержимое елементов с классом .error. Обычные инпуты и текстареа не имеют html содержимого, поэтому их это не задевало. А вчера — сошлись звезды и понадобилась мне аджакс форма с селектом.
Здравствуйте Янис, у меня аналогичная проблема, Вам удалось с ней справиться?
Как я уже писал: «Я пока все-таки поставил вариант с другим именем класса для полей. » Т.е. я дополнил default.js. Изменений не много:
После строчки
Ну и css слегка подправить нужно.
После строчки
form.find('.error').removeClass('error');
Вставилform.find('.field-error').removeClass('field-error');
Строку form.find('[name="' + key + '"]').addClass('error');
Изменил на form.find('[name="' + key + '"]').addClass('field-error');
После сроки form.find('.error').removeClass('error');
Добавилform.find('.field-error').removeClass('field-error');
И блок$(document).on('keypress change', '.error', function () {
var key = $(this).attr('name');
$(this).removeClass('error');
$('.error_' + key).html('').removeClass('error');
});
Изменил на$(document).on('keypress change', '.error, .field-error', function () {
var key = $(this).attr('name');
$(this).removeClass('error field-error');
$('.error_' + key).html('').removeClass('error');
});
Т.е. теперь инпутам, селектам и прочим полям присуждается класс .field-error, вместо .error. Ну и css слегка подправить нужно.
Та же проблема была и есть, пока закрыл на неё глаза…
решение вместо 37 строки это —
form.find('.error').each(function( index ) {
if(!$(this).is('select')) {
$(this).html('');
}
});
Jquery отлично работает css-селекторами и решение становится простейшим:
строку
строку
form.find('.error').html('');
заменить наform.find('.error:not(select)').html('');
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.