Я использую проверку jQuery с регистрационной формой для своего сайта с reCaptcha внизу. Вот скрипт для проверки формы для ошибок (отредактирован только для соответствующих частей):
$(document).ready(function() { jQuery.validator.addMethod("checkCaptcha", function() { var phpquery = $.ajax({url:"verify.php", type: "POST", async: false, data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()}, success:function(resp) { if (resp == 'false') { console.dir(resp); return false; } else { console.dir(resp); return true; } } }); },""); $('#regForm').validate({ rules:{ recaptcha_response_field:{required:true,checkCaptcha:true} }, messages:{ recaptcha_response_field:{checkCaptcha:"Your Captcha response was incorrect. Please try again."} } }); });
Что происходит, когда я вхожу в правильный ответ reCaptcha и либо нажимаю кнопку «Отправить», либо «табуляцию» из текстового поля ответа, он сначала скажет « true
в консоли, а затем сразу же выбросит false
и не даст мне отправить форму.
Также случается, когда введен неправильный ответ reCaptcha, он будет генерировать false
как это предполагалось, но для каждой буквы, которую я verify.php
, он будет отправлять это verify.php
и возвращать false
. Когда я, наконец, сделаю ввод в правильном reCaptcha, он не распознает его как таковой и все еще возвращает false
.
Перезагрузка reCaptcha также генерирует false
, даже если введен правильный ответ.
Я знаю, что verify.php
работает правильно, потому что, когда <form>
будет иметь action="verify.php,"
все будет работать отлично (то есть скажите, введен ли вы правильную reCaptcha, независимо от того, сколько раз вы пытались).
Я что-то упускаю? Есть ли более простой и надежный способ сделать это?
Используйте onkeyup: false
внутри .validate()
.
В противном случае каждый раз, когда вы вводите одно письмо, он запускает ваш метод checkCaptcha
и отправляет незавершенный код Captcha на сервер. Я верю, что когда был отправлен неверный код Captcha, он теперь истек, и вы не можете отправить тот же код снова.
В любом случае, я думаю, что лучше не отправлять код на сервер до тех пор, пока поле не будет завершено.
$('#regForm').validate({ onkeyup: false, rules:{ recaptcha_response_field: { required: true, checkCaptcha: true } }, messages:{ recaptcha_response_field: { checkCaptcha: "Your Captcha response was incorrect. Please try again." } } });
Кроме того, если Captcha выходит из строя, вам нужно вызвать обновление, чтобы получить новый код.
Recaptcha.reload();
Возможно, в вашем success
вызове success
…
success:function(resp) { if (resp == 'false') { console.dir(resp); Recaptcha.reload(); // get a new captcha code on failure return false; } else { console.dir(resp); return true; } }
Проблема с вашим первым методом проверки addMethod заключается в том, как вы возвращаете true или false, а вторая сложнее, чем должна быть. Я не знаю, как вы относитесь к этой вещи с серверной стороны, но, возможно, этот код вам нужен:
http://blog.netgloo.com/2014/06/03/adding-recaptcha-validator-to-jquery-validate/
Это отлично работает для меня!
Хорошо, наконец, получил (хотя это может быть работа вокруг). Вот новый addMethod
:
jQuery.validator.addMethod("checkCaptcha", function() { var bfr = false; var phpquery = $.ajax({url:"verify.php", type: "POST", async: false, data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()}, complete:function(resp) { if(resp.responseText.indexOf("false")>=0){ Recaptcha.reload(); }else{ bfr = true; } } }); if(bfr){ return true; } },"");
Я также добавил onkeyup:false
, onclick:false
и onfocusout:false
для validate()
. Кажется, что эта работа выполнена.
Вот моя идея, специально касающаяся « проверки капки с помощью запроса AJAX ».
основной причиной добавления капчей в форме является проверка того, является ли это ботом или человеком, который сделал подачу формы. поэтому, даже если в других областях есть ошибки, после успешной отправки captcha, очевидно, мы знаем, что это человек. Итак, полностью удалять поле captcha после его первого успеха (пожалуйста, обновите капчу, пока это не удастся). Затем можно обрабатывать другие поля, как обычно.
Любые возражения?