Проверки на стороне клиента в Rails с формами в слайдере jQuery - PullRequest
2 голосов
/ 09 июня 2011

У меня есть сайт, на котором есть слайдер на основе jQuery Неудобная витрина .

На этих слайдах у меня есть форма Rails для регистрации нового пользователя.Я использую гем проверки на стороне клиента для проверки на стороне клиента.

Проблема в том, что поскольку форма находится на втором .showcase-slide, она не существует вDOM, когда страница загружается, и проверка на стороне клиента не работает.

Мне нужен способ использовать ловушку, найденную на странице GitHub проверки на стороне клиента, для активации проверок на стороне клиента, когда мой элемент загружен.

Итак, как мне использовать хук $('form#user_new[data-validate]').validate(); в моей форме с идентификатором user_new, который не загружается сразу и исчезает из DOM при изменении слайда витрины.

Я попробовал несколько вариантов .live и .bind, но, очевидно, мой jQuery очень слабый, и мне не повезло.

Помогите, пожалуйста?

Обновление

Я пробовал это:

$("body").delegate("#user_username", 'focus', function(){
   $('form#user_new[data-validate]').validate()}); 

Но теперь каждый раз, когда я нажимаю на поле #user_username, в стек добавляется другая проверка, и я получаю несколькоошибки (клоны), отображаемые для одного поля.

Еще одно обновление и некрасивое решение

Хорошо, это то, что я придумал, но оно, безусловно, ужасно.Любое лучшее решение приветствуется!

$("body").delegate("#user_username", 'focus', function(){
  if ($('form#user_new[data-validate]').data('events') === undefined ) { 
    $('form#user_new[data-validate]').validate()  
  }});

Ответы [ 2 ]

0 голосов
/ 22 сентября 2012

Я использую рельсы 3.2.8, simpleForm 2.0.2, client_side_validations 3.2.0.beta.4 и client_side_validations-simple_form 2.0.0.beta.1, и вышеприведенное решение работает хорошо, но решение является неполным, потому что когдапроверки выполняются повторно (вы изменяете вкладку и обратно), если вы запускаете ошибку в одной и той же форме с одним и тем же полем несколько раз, строковая ошибка дублируется, утраивается и т. д.

Так что для этого конкретного поля вы должны добавьте в свой файл js.coffee «ластик промежутка», поскольку client_side_validations каждый раз добавляет промежуток, и вы хотите видеть только последний.

Полное решение: (вставьте код в свой *файл .js.coffee):

# the above suggested works well
$("body").delegate "#user_name", "focus", ->
  $(this).closest("form").removeClass("validateme").validate()

# my additional code
$("#user_username").live "blur", ->
  $(@).siblings("span:not(:last)").remove()
  # $(@).siblings()  is identical to  $(@).parent().children() except @
  # in other words, select my "brothers" except me if yes or not match the selector
  # (nicer!)

Это пример;если ваш случай отличается, проверьте сгенерированный HTML и поиграйте с селекторами.

0 голосов
/ 14 сентября 2011

Это может быть немного меньше.

Вам нужно будет добавить класс (т.е. "validateme") к полю, на которое вы фокусируете.

$("body").delegate("#user_username.validateme", 'focus', function(){
   $(this).closest('form').removeClass('validateme').validate();
}); 

Таким образом, проверка добавляется только тогда, когда фокусируемый элемент имеет класс validateme.Как только он сфокусирован, класс удаляется и валидатор применяется к форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...