J'ai 2 formulaires sur une seule page. L'un des formulaires a un recaptcha qui s'affiche tout le temps. L'autre ne devrait afficher un recaptcha qu'après un certain événement tel que la maximisation des tentatives de connexion. Il y a donc des moments où j'aurais besoin de 2 recaptchas pour apparaître sur la même page. Est-ce possible? Je sais que je pourrais probablement en utiliser un seul pour les deux, mais la façon dont j'ai la mise en page, je préférerais de beaucoup en avoir 2. Merci.
Mise à jour: eh bien je suppose que ce n'est peut-être pas possible. Quelqu'un peut-il recommander une autre bibliothèque de capture à utiliser côte à côte avec reCaptcha? Je veux vraiment pouvoir avoir 2 captchas sur la même page.
Mise à jour 2: Et si mettre chaque formulaire dans une iframe? Serait-ce une solution acceptable?
Hüseyin Yağlı
la réponse de . La plupart des navigateurs doivent prendre en charge JavaScript et le reCAPTCHA par défaut utilise de toute façon JavaScript. Cependant, je ne sais pas ce qu'il faudrait faire pour résoudre le problème sans le support de JavaScript.Réponses:
Une question similaire a été posée sur le fait de faire cela sur une page ASP ( lien ) et le consensus là-bas était qu'il n'était pas possible de faire avec recaptcha. Il semble que plusieurs formulaires sur une seule page doivent partager le captcha, à moins que vous ne souhaitiez utiliser un autre captcha. Si vous n'êtes pas verrouillé dans recaptcha, une bonne bibliothèque à regarder est le composant Zend Frameworks Zend_Captcha ( lien ). Il contient quelques
la source
Hüseyin Yağlı
La réponse explique la solution. La documentation de reCAPTCHA pour cette solution est disponible sur developer.google.com/recaptcha/docs/display#explicit_render . Cependant, je ne sais pas ce qu'il faudrait faire pour résoudre le problème sans le support de JavaScript.Avec la version actuelle de Recaptcha ( reCAPTCHA API version 2.0 ), vous pouvez avoir plusieurs recaptchas sur une seule page.
Il n'est pas nécessaire de cloner le recaptcha ni d'essayer de contourner le problème. Il vous suffit de mettre plusieurs éléments div pour les recaptchas et de rendre les recaptchas à l'intérieur d'eux explicitement.
C'est facile avec l'api google recaptcha:
https://developers.google.com/recaptcha/docs/display#explicit_render
Voici l'exemple de code html:
Dans votre code javascript, vous devez définir une fonction de rappel pour recaptcha:
Après cela, l'URL de votre script recaptcha devrait ressembler à ceci:
Ou au lieu de donner des identifiants à vos champs recaptcha, vous pouvez donner un nom de classe et boucler ces éléments avec votre sélecteur de classe et appeler .render ()
la source
grecaptcha.getResponse(0)
etgrecaptcha.getResponse(1)
valider plusieurs instances, j'ajouterais que l'indexation doit correspondre à l'grecaptcha.render
ordre. Pour cet exemple,grecaptcha.render('RecaptchaField1'...
serait vérifié avecgrecaptcha.getResponse(0)
etgrecaptcha.render('RecaptchaField2'...
serait vérifié avecgrecaptcha.getResponse(1)
, etc ...Simple et direct:
1) Créez vos champs de recaptcha normalement avec ceci:
2) Chargez le script avec ceci:
3) Appelez maintenant ceci pour parcourir les champs et créer les recaptchas:
la source
data-sitekey="YOUR_KEY_HERE"
est inutile et peut être supprimé de la div (si vous avez besoin de changer la clé, moins d'endroits à modifier)grecaptcha.render(el, {'sitekey' : $(el).attr('data-sitekey') });
Ceci est facilement accompli avec la
clone()
fonction de jQuery .Vous devez donc créer deux divs wrapper pour le recaptcha. Recaptcha div de mon premier formulaire:
Le div du deuxième formulaire est vide (ID différent). Donc le mien est juste:
Ensuite, le javascript est assez simple:
Vous n'avez probablement pas besoin du deuxième paramètre avec une
true
valeur dansclone()
, mais cela ne fait pas de mal de l'avoir ... Le seul problème avec cette méthode est que si vous soumettez votre formulaire via ajax, le problème est que vous avez deux éléments qui ont le même nom et vous devez être un peu plus intelligent avec la façon dont vous capturez les valeurs de cet élément correct (les deux identifiants pour les éléments reCaptcha sont#recaptcha_response_field
et #recaptcha_challenge_field juste au cas où quelqu'un en aurait besoin)la source
Je sais que cette question est ancienne, mais au cas où quelqu'un la chercherait à l'avenir. Il est possible d'avoir deux captcha sur une seule page. Rose à la documentation est ici: https://developers.google.com/recaptcha/docs/display L' exemple ci-dessous est juste un document de copie de formulaire et vous n'avez pas à spécifier différentes mises en page.
la source
Cette réponse est une extension de @raphadko réponse de .
Si vous avez besoin d'extraire manuellement le code captcha (comme dans les requêtes ajax), vous devez appeler:
Mais comment récupérer le paramètre d'id du widget?
J'utilise cette définition de CaptchaCallback pour stocker l' ID de widget de chaque boîte g-recaptcha (en tant qu'attribut de données HTML):
Ensuite, je peux appeler:
pour extraire le code.
la source
#your_recaptcha_box_id
?J'ai un formulaire de contact dans le pied de page qui s'affiche toujours et certaines pages, comme Créer un compte, peuvent également avoir un captcha, donc c'est dynamiquement et j'utilise la prochaine manière avec jQuery:
html:
javascript
la source
Ceci est une version sans JQuery de la réponse fournie par raphadko et nom .
1) Créez vos champs de recaptcha normalement avec ceci:
2) Chargez le script avec ceci:
3) Appelez maintenant ceci pour parcourir les champs et créer les recaptchas:
la source
En regardant le code source de la page, j'ai pris la partie reCaptcha et j'ai un peu changé le code. Voici le code:
HTML:
jQuery:
J'utilise ici une simple fonctionnalité d'onglet javascript. Donc, n'a pas inclus ce code.
Lorsque l'utilisateur clique sur "Request Information",
(#product_tabs_what)
JS vérifie sirecapExist
c'estfalse
ou a une certaine valeur. S'il a une valeur, cela appelleraRecaptcha.destroy();
à détruire l'ancien reCaptcha chargé et le recréera pour cet onglet. Sinon, cela créera simplement un reCaptcha et le placera dans le#more_info_recaptcha_box
div. Identique à l'#product_tabs_wha
onglet "Faire une offre" .la source
la source
<div class="g-recaptcha" data-sitekey="your_site_key"></div>
là où vous enUne bonne option est de générer une entrée recaptcha pour chaque formulaire à la volée (je l'ai fait avec deux mais vous pourriez probablement en faire trois ou plus). J'utilise jQuery, la validation jQuery et le plugin de formulaire jQuery pour publier le formulaire via AJAX, avec l'API Recaptcha AJAX -
https://developers.google.com/recaptcha/docs/display#recaptcha_methods
Lorsque l'utilisateur soumet l'un des formulaires:
Ensuite, ils peuvent remplir le recaptcha et soumettre à nouveau le formulaire. S'ils décident de soumettre un formulaire différent à la place, eh bien, votre code vérifie les recaptchas existants, vous n'aurez donc qu'un seul recaptcha sur la page à la fois.
la source
Pour ajouter un peu à raphadko réponse de : puisque vous avez plusieurs captchas (sur une seule page), vous ne pouvez pas utiliser le (universel)
g-recaptcha-response
paramètre POST (car il contient qu'une seule réponse de captcha). Au lieu de cela, vous devriez utiliser l'grecaptcha.getResponse(opt_widget_id)
appel pour chaque captcha. Voici mon code (à condition que chaque captcha soit dans sa forme):HTML:
et
JavaScript:
Notez que j'applique la délégation d'événement (voir actualiser le DOM après ajouter l'élément ) à tous les éléments modifiés dynamiquement. Cela lie la réponse de chaque captha individuel à son
submit
événement de forme .la source
Voici une solution qui s'appuie sur plusieurs des excellentes réponses. Cette option est libre de jQuery et dynamique, ne vous obligeant pas à cibler spécifiquement les éléments par id.
1) Ajoutez votre balisage reCAPTCHA comme vous le feriez normalement:
2) Ajoutez ce qui suit dans le document. Il fonctionnera dans n'importe quel navigateur prenant en charge l' API querySelectorAll
la source
La
grecaptcha.getResponse()
méthode accepte un paramètre facultatif "widget_id" et utilise par défaut le premier widget créé s'il n'est pas spécifié. Un widget_id est retourné par lagrecaptcha.render()
méthode pour chaque widget créé, il n'est pas lié à l'attributid
du conteneur reCAPTCHA !!Chaque reCAPTCHA a ses propres données de réponse. Vous devez donner un identifiant au reCAPTCHA div et le transmettre au
getResponse
méthode:par exemple
Réponse d'accès:
ou
la source
C'est possible, il suffit de remplacer les rappels Recaptcha Ajax. Jsfiddle fonctionnant: http://jsfiddle.net/Vanit/Qu6kn/
Vous n'avez même pas besoin d'un proxy div car avec les écrasements, le code DOM ne s'exécutera pas. Appelez Recaptcha.reload () chaque fois que vous souhaitez déclencher à nouveau les rappels.
la source
Voici un bon guide pour faire exactement cela:
http://mycodde.blogspot.com.ar/2014/12/multiple-recaptcha-demo-same-page.html
En gros, vous ajoutez quelques paramètres à l'appel de l'API et effectuez manuellement le rendu de chaque recaptcha:
PS: La méthode "grecaptcha.render" reçoit un identifiant
la source
J'utiliserais recaptcha invisible. Ensuite, sur votre bouton, utilisez une balise comme "formname = 'yourformname'" pour spécifier le formulaire à soumettre et masquer une entrée de formulaire d'envoi.
L'avantage de ceci est qu'il vous permet de garder la validation du formulaire html5 intacte, une recaptcha, mais plusieurs interfaces de boutons. Capturez simplement la valeur d'entrée "captcha" pour la clé de jeton générée par recaptcha.
Je trouve cela beaucoup plus simple et plus facile à gérer.
la source