"Not a robot" recaptcha without a <form> but AJAX instead "Not a robot" recaptcha without a <form> but AJAX instead ajax ajax

"Not a robot" recaptcha without a <form> but AJAX instead


I just implemented it without using any form and submit mechanism, respectively. Thus, a pure AJAX solution.

HTML code:

<div id="recaptcha-service" class="g-recaptcha" data-callback="recaptchaCallback" data-sitekey=""></div><script type="text/javascript" src="https://www.google.com/recaptcha/api.js?hl=en"></script>

JavaScript code:

window.recaptchaCallback = undefined;jQuery(document).ready(function($) {  window.recaptchaCallback = function recaptchaCallback(response) {    $.ajax({      method: "POST",      url: "http://example.com/service.ajax.php",      data: { 'g-recaptcha-response': response },    })      .done(function(msg) {        console.log(msg);      })      .fail(function(jqXHR, textStatus) {        console.log(textStatus);      });  }});

The point is using a callback (recaptchaCallback in this case).

You can find a more complete example at https://gist.github.com/martinburger/f9f37770c655c25d5f7b179278815084. That example uses Google's PHP implementation on the server side (https://github.com/google/recaptcha).


You use a form, interrupt the submissions of the form. Set up a form as per normal:

<form action="post.php" method="POST" id="my-form">    <div class="g-recaptcha" data-sitekey="6Lc_0f4SAAAAAF9ZA_d7Dxi9qRbPMMNW-tLSvhe6"></div>    <input type="text" id="text">    <button type="submit">Sign in</button></form><script src='https://www.google.com/recaptcha/api.js'></script>

And then you use jQuery to interrupt the submission of the form and serialize it, allowing you to pass the data through Ajax:

$('#my-form').submit(function(e) {    e.preventDefault();    $this = $(this);    $.ajax({        type: "POST",        url: "post.php",        data: $this.serialize()    }).done(function(data) {    }).fail(function( jqXHR, textStatus ) {        alert( "Request failed: " + textStatus );    });});

As you will have noticed I've used .done and .fail instead of success and error, this is the preferred way of handling the response.


For answer completeness, say you wanted to just use a link you could...

<form id="g-recap">  <div class="g-recaptcha" data-sitekey="{{ gcaptcha key }}" ></div></form><a href="/recaptchaured/path">Verify</a>$('a').on('click',function(e) {   e.preventDefault();   document.location =  $(this).attr('href') + '?' + $('#g-recap').serialize()});