2014-12-30 3 views
22

Sto utilizzando Google reCAPTCHA e sono stato in grado di aggiungere il componente CAPTCHA alla mia pagina all'interno di un modulo. Ma quando invio il modulo non è in corso alcuna verifica per verificare se il CAPTCHA è stato risolto.Come posso rendere reCAPTCHA un campo obbligatorio?

Come convalidare che il componente CAPTCHA è stato risolto durante l'invio del modulo? O, in altre parole, come posso rendere necessario il mio componente CAPTCHA?

+0

Prova questo link - http://formvalidation.io/examples/validating-google-recaptcha/ – gpullen

+1

Scusa gpullen ma voglio reCAPTCHA come campo richiesto nel modulo . –

+1

Prova questo link - [Come chiedere] (http://stackoverflow.com/help/how-to-ask). –

risposta

16

Ho avuto lo stesso problema come la tua e risolto in questo modo:

prima dichiarare un variabile che memorizza 1 o 0 a seconda che l'utente abbia riempito correttamente il capcha.

var allowSubmit = false; 

allora avete bisogno di una funzione che viene eseguita quando l'utente compila correttamente il reCapcha:

function capcha_filled() { 
    allowSubmit = true; 
} 

... e una funzione che viene eseguita quando la sessione scade reCapcha:

function capcha_expired() { 
    allowSubmit = false; 
} 

Per comunicare a reCapcha le tue funzioni (callback), imposta gli attributi data- nel tuo codice html:

<div class="g-recaptcha" 
    data-callback="capcha_filled" 
    data-expired-callback="capcha_expired" 
    data-sitekey="your site key"></div> 

Oppure, se si utilizza il carico esplicito:

var onloadCallback = function() { 
    grecaptcha.render('your_div_id', { 
     'sitekey' : 'your_site_key', 
     'callback': capcha_filled, 
     'expired-callback': capcha_expired, 
    }); 
    }; 

è necessario anche un callback per l'invio del modulo:

function check_if_capcha_is_filled (e) { 
    if(allowSubmit) return true; 
    e.preventDefault(); 
    alert('Fill in the capcha!'); 
} 

Infine aggiungere nella forma l'attributo onsubmit:

<form action="..." onsubmit="check_if_capcha_is_filled"> 

Nota: come indicato nei commenti, è necessaria una convalida del server . Il codice impedisce l'invio accidentale del modulo a meno che il capcha non sia compilato e è solo per comodità dell'utente.

+0

Cosa mi impedisce di entrare in una console javascript e di impostare "submit = true" da solo? –

+1

@IanMacDonald Assolutamente nulla. È (la mia risposta) solo per comodità dell'utente. L'idea è di impedire loro di inviare accidentalmente il modulo (ad esempio, premere Invio su un ) senza aver riempito il capcha. Basta salvare una pagina di ricarica per una migliore esperienza utente. –

+0

Oh, ho capito il tuo punto. Dovrei aver esplicitamente menzionato che è ancora necessario un controllo del server. Grazie per la nota. –

9

Ho trovato che questo è un modo rapido & per farlo. Aggiungere questo per le intestazioni:

<script> 
window.onload = function() { 
    var recaptcha = document.forms["myForm"]["g-recaptcha-response"]; 
    recaptcha.required = true; 
    recaptcha.oninvalid = function(e) { 
    // do something 
    alert("Please complete the captcha"); 
    } 
} 
</script> 

Questo funziona solo in HTML5, ed è (o dovrebbe essere) supportato da questi browser: http://caniuse.com/#feat=form-validation

(JS console in Chrome mostra questo messaggio di errore: "Invalid form control" only in Google Chrome, e Non sono stato in grado di aggirare questo problema, speriamo che qualcun altro migliori questa risposta.)

15

se si desidera utilizzare il popup HTML5 nativo, che qui è la soluzione

JavaScript:

window.onload = function() { 
    var $recaptcha = document.querySelector('#g-recaptcha-response'); 

    if($recaptcha) { 
     $recaptcha.setAttribute("required", "required"); 
    } 
}; 

CSS:

#g-recaptcha-response { 
    display: block !important; 
    position: absolute; 
    margin: -78px 0 0 0 !important; 
    width: 302px !important; 
    height: 76px !important; 
    z-index: -999999; 
    opacity: 0; 
} 
+1

questa dovrebbe essere la risposta accettata. Molto dinamico – Akintunde007

7

ho controllato per l'esistenza di # g- recaptcha-response:

function checkRecaptcha() { 
    res = $('#g-recaptcha-response').val(); 

    if (res == "" || res == undefined || res.length == 0) 
     return false; 
    else 
     return true; 
} 

//... 

$('#frm-signup').submit(function(e) { 

    if(!checkRecaptcha()) { 
     $("#frm-result").text("Please validate your reCAPTCHA."); 
     return false; 
    } 
    //... 
}); 

Questo dovrebbe essere parte dei documenti ...