2013-03-24 3 views
1

У меня есть идея, что это может быть глупо, но я застрял на нем часами.Проверка jquery с помощью метода addMethod, когда он не должен

У меня есть простая форма, с проверкой jquery с помощью ajax, чтобы определить, находится ли адрес электронной почты в базе данных. Прекрасно работает. Когда найден адрес электронной почты, он сообщает о дубликате, а когда нет, он молчал.

Но когда я ввожу электронное письмо, которое я знаю как новое, и заполните оставшуюся форму и нажмите «Отправить», он предотвратит отправку формы и задает фокус на поле электронной почты.

Вот JQuery:

$(document).ready(function(){ 
var email; 
var name; 
var passwd; 
var passwd_repeat; 

    //form validation rules 
    $("#regForm1").validate({ 
     rules: { 
      name: { 
       required: true, 
       minlength: 3, 
      }, 
      passwd: { 
       required: true, 
       minlength: 8, 
      }, 
      passwd_repeat: { 
       required: true, 
       equalTo: passwd, 
       minlength: 8 
      } 
     }, 
     messages: 
     { 
      name: "Please enter your name.", 
      passwd: "Please enter a password.", 
      passwd_repeat: "Passwords must match." 
     } 
    }); 

    $.validator.addMethod("validateUserEmail", function(value, element) { 
     var inputElem = $('#regForm1 :input[name="email"]'), 
     data = { "email=" : inputElem.val() }, 
     eReport = ''; //error report*/ 
     var dataString = 'email='+ inputElem.val(); 
     $.ajax({ 
      type: "POST", 
      url: '/checkdups.php', 
      data: dataString, 
      success: function(html) { 
       if (html !== 'true') { 
        $('#email').after('<label class="error" for="email">error - '+inputElem.val()+' already in use. Please <a href="http://tester4.com/staff/auth/login">Log in</a> with '+inputElem.val()+'.</label>'); 
        return false; 
       } 
       else { 
        return true; 
       } 
      }, 
      error: function(xhr, textStatus, errorThrown) 
      { 
       alert('ajax loading error... ... '+url + query); 
       return false; 
      } 
     }); 
    }, 
''); 

$(':input[name="email"]').rules("add", { "validateUserEmail" : true});  

});

Я добавляю правило с addMethod вместо использования .remote, потому что я не мог заставить работу работать больше, чем в первый раз (это означает, что она не будет отвергать последовательность обманов без обновления страницы), и это было предложено в качестве обходного пути. Когда я комментирую добавленный метод, он позволяет мне отправить форму, но, конечно, не проверяет наличие обмана.

В любом случае, любые идеи были бы высоко оценены.

Джон

ответ

2

Вы действительно должны использовать remote. Я не уверен, почему вы не получили его на работу, как вы ожидали - удаленный определенно делает вызывается несколько раз. По умолчанию он работает, чтобы не звонить на удаленную страницу, пока вы не нажмете submit, а затем, если ваш удаленный вызов говорит, что это было плохо, каждое нажатие клавиши после этого приведет к новому удаленному вызову.

Вот simple working example, из которого вы можете построить. Я установил его, чтобы всегда возвращать false, пока вы не сделали 3 изменения. Поэтому вы должны быть в состоянии сделать следующий шаг:

  1. Введите [email protected] и нажмите кнопку Отправить. Обратите внимание, что он отмечен как недопустимый.
  2. удалить м (недействительный)
  3. удалить о (недопустимый)
  4. удалить с (недействительный, но из-за этого не является действительным адресом электронной почты в настоящее время)
  5. типа com (фиксированный)
  6. Submit (работы)

ключевой код из этой скрипки в правилах объекта (ответ глобальный счетчик для данного примера):

rules: { 
    email: { 
     email: true, 
     remote: { 
      url: '/echo/json/', 
      data: { 
       json: function(){ 
        response++; 
        return (response > 3)?'true':'false'; 
       } 
      }, 
      complete: function(data){ 
       $('#log').append('remote triggered<br>'); 
      }, 
      type: 'post' 
     }, 
     required: true 
    } 
} 
0

@Ryley, спасибо за ваш ответ. Я повторил дистанцию, и она отлично работала. Я думаю, что у меня была проблема с кешем Firefox.

Шахта очень похожа на вашу, так что спасибо!

Смежные вопросы