Проверка имени класса jQuery не работает для динамически генерируемых текстовых полей

#php #jquery #ajax #jquery-validate

#php #jquery #ajax #jquery-проверка

Вопрос:

Я столкнулся с проблемой с проверкой jQuery для проверки (динамически) генерируемых текстовых полей ajax…

Вот фрагмент HTML-кода

          <form name="booking" id="booking" method="post" action="">
              <ul>
                <li>
                    <span>Mobile Number</span>
                </li>
                <li>
                <input  type="tel" name="mobile" id="mobile" class='form_mobile'/>
                </li>                    
                   <li>
                    <span>Number of male tickets</span>
                </li>
                <li>
                       <select name="male_qunatity" id="male_qunatity" >

                        </select>
                </li>
            </ul>
        </form>
 

Сценарий проверки Jquery здесь

      $(document).ready(function(){

Here is the ajax call starts

 $('#male_qunatity').change(function() {

        var male_tickets = $(this).val();      
        var mobile = $('#mobile').val();
        var path = '<?php echo site_url() ?>';
        ajaxurl = path   '/wp-admin/admin-ajax.php';
        var data = {
            action: 'get_quantity',
            qty: male_tickets,
            mobile: mobile
        };

          $.post(ajaxurl, data, function(response) {
            $('#m_attendees').html(response);
        });

     }); //END dropdown change event


       $("#booking").validate({
          });

      $('.form_mobile').each(function() {
      $(this).rules('add', {
        required:true,
        number:true,
      messages: {
        required:"Please enter a mobile number",
        number:"Only numbers allowed"
       }
     });
  });

  });//validation ends
 

Вот код ajax для текстовых полей на основе выбранного количества

     $quantity=  $_REQUEST['qty'];
    $mobile=  $_REQUEST['mobile'];
    $pass = "<table>";
      for($i =0; $i<$quantity; $i   ){
    $pass .= "<tr>
       <td>
      <input type='text'  id='mobile-".$i."' class='form_mobile' name='mmobile[]'>
      </td>
          </tr>";
       }
    $pass .= "</table>";
    echo $pass;
 

К вашему сведению: проверка формы работает нормально для полей формы, за исключением динамически создаваемых полей..

Как решить эту проблему?

Любые предложения будут с благодарностью приняты..

Комментарии:

1.Ваш вопрос очень неясен. Однако, если вы создаете поля динамически, тогда вы должны вызывать .rules('add') ПОСЛЕ динамического создания полей.

2. @sparky Поскольку я вызываю событие изменения и ajax перед .rules(‘add’).. Обновил мой вопрос.

3. Нет, на самом деле это не так. При .rules('add') вызове динамические поля еще не существуют.

4. @Sparky Мне интересно, почему проверка имени класса не работает для динамических полей.. Есть ли какие-либо ошибки в коде?

Ответ №1:

1) Поскольку проверка jQuery зависит от name атрибута, вам нужно будет изменить свой PHP, чтобы убедиться, что каждый name из них уникален. Обратите внимание на индекс, $i , добавленный к name атрибуту…

 "... <input type=text  id='mobile-".$i."' name='mmobile[".$i."]' class='form_mobile'> ..."
 

(вы также пропускаете кавычки text ; должно быть type='text' )

2) При динамическом создании полей вы должны вызывать .rules('add') ПОСЛЕ динамического создания полей. В вашем случае, здесь…

 $.post(ajaxurl, data, function(response) {
    $('#m_attendees').html(response);   // <- create the new fields
    $('.form_mobile').each(function() { // <- then dynamically add the rules
        $(this).rules('add', {
            required:true,
            number:true,
            messages: {
                required:"Please enter a mobile number",
                number:"Only numbers allowed"
            }
        });
    });
});
 

3) .validate() является методом инициализации для плагина на вашем form . Просто вызовите его один раз при загрузке DOM. ( .validate() не вызывается повторно при проверке формы, поскольку проверка выполняется автоматически после правильной инициализации плагина.)

 $(document).ready(function() {  // <- DOM is ready

    $("#booking").validate({    // <- initialize plugin on your form
        // your options         // <- plugin options
    });

});
 

Комментарии:

1. итак, где я могу вызвать «$(«#booking»).validate({ });» ??? Если я добавлю after $(«#m_attendees»).html(ответ), то он будет проверен только после того, как произойдет событие изменения..

2. @PHPCoder, в моем первоначальном ответе не было ничего, что говорило бы о перемещении .validate() . Посмотрите код, который я опубликовал. Вы должны вызвать этот .validate() метод ОДИН РАЗ, чтобы инициализировать плагин на вашем form компьютере . Вы бы сделали это в обработчике событий DOM ready. Другими словами, просто оставьте его там, где он был у вас изначально.

3. 1 Проверка работает сейчас.. Спасибо за ваши предложения и быстрый ответ

4. @PHPCoder, добро пожаловать. Также заметил text , что в вашем HTML отсутствуют кавычки. input type='text'