Ich habe 2 Formulare auf einer Seite. In einem der Formulare wird ständig ein Recaptcha angezeigt. Der andere sollte ein Recaptcha erst nach einem bestimmten Ereignis anzeigen, z. B. nach maximaler Anmeldung. Es gibt also Zeiten, in denen ich zwei Recaptchas benötige, um auf derselben Seite zu erscheinen. Ist das möglich? Ich weiß, dass ich wahrscheinlich einen einzigen für beide verwenden könnte, aber so wie ich das Layout habe, würde ich 2 lieber haben. Danke.
Update: Nun, ich denke, es ist möglicherweise nicht möglich. Kann jemand eine andere Capture-Bibliothek empfehlen, die neben reCaptcha verwendet werden kann? Ich möchte wirklich 2 Captchas auf derselben Seite haben können.
Update 2: Was ist, wenn jedes Formular in einen Iframe eingefügt wird? Wäre dies eine akzeptable Lösung?
Hüseyin Yağlı
der Antwort von . Die meisten Browser sollten JavaScript unterstützen und das Standard-reCAPTCHA verwendet ohnehin JavaScript. Ich weiß jedoch nicht, was getan werden müsste, um das Problem ohne JavaScript-Unterstützung zu lösen.Antworten:
Eine ähnliche Frage wurde dazu auf einer ASP-Seite ( Link ) gestellt, und der Konsens dort war, dass es nicht möglich war, mit Recaptcha zu tun. Es scheint, dass mehrere Formulare auf einer Seite das Captcha gemeinsam nutzen müssen, es sei denn, Sie sind bereit, ein anderes Captcha zu verwenden. Wenn Sie nicht an recaptcha gebunden sind, ist die Zend_Captcha-Komponente ( Link ) von Zend Frameworks eine gute Bibliothek, die Sie sich ansehen sollten . Es enthält einige
quelle
Hüseyin Yağlı
Die Antwort erklärt die Lösung. Die reCAPTCHA-Dokumentation für diese Lösung finden Sie unter developer.google.com/recaptcha/docs/display#explicit_render . Ich weiß jedoch nicht, was getan werden müsste, um das Problem ohne JavaScript-Unterstützung zu lösen.Mit der aktuellen Version von Recaptcha ( reCAPTCHA API Version 2.0 ) können Sie mehrere Recaptchas auf einer Seite haben.
Es ist nicht erforderlich, das Recaptcha zu klonen oder das Problem zu umgehen. Sie müssen nur mehrere div-Elemente für die Recaptchas einfügen und die Recaptchas explizit in ihnen rendern.
Dies ist mit der Google Recaptcha-API ganz einfach:
https://developers.google.com/recaptcha/docs/display#explicit_render
Hier ist der Beispiel-HTML-Code:
In Ihrem Javascript-Code müssen Sie eine Rückruffunktion für recaptcha definieren:
Danach sollte Ihre Recaptcha-Skript-URL folgendermaßen aussehen:
Oder anstatt Ihren Recaptcha-Feldern IDs zu geben, können Sie einen Klassennamen eingeben und diese Elemente mit Ihrer Klassenauswahl wiederholen und .render () aufrufen.
quelle
grecaptcha.getResponse(0)
und diesegrecaptcha.getResponse(1)
zu validieren, würde ich hinzufügen, dass die Indizierung dergrecaptcha.render
Reihenfolge entsprechen muss. Für dieses Beispielgrecaptcha.render('RecaptchaField1'...
würde mitgrecaptcha.getResponse(0)
undgrecaptcha.render('RecaptchaField2'...
würde überprüft werdengrecaptcha.getResponse(1)
, etc ...Einfach und unkompliziert:
1) Erstellen Sie Ihre Recaptcha-Felder normalerweise folgendermaßen:
2) Laden Sie das Skript mit folgendem:
3) Rufen Sie dies nun auf, um die Felder zu durchlaufen und die Recaptchas zu erstellen:
quelle
data-sitekey="YOUR_KEY_HERE"
ist nutzlos und kann aus dem div entfernt werden (wenn Sie den Schlüssel ändern müssen, weniger Stellen zum Bearbeiten)grecaptcha.render(el, {'sitekey' : $(el).attr('data-sitekey') });
Dies ist mit der
clone()
Funktion von jQuery leicht zu erreichen .Sie müssen also zwei Wrapper-Divs für das Recaptcha erstellen. Recaptcha Div meiner ersten Form:
Das div des zweiten Formulars ist leer (andere ID). Also meins ist nur:
Dann ist das Javascript ganz einfach:
Wahrscheinlich brauchen Sie den zweiten Parameter mit einem
true
Wert in nichtclone()
, aber es tut nicht weh, ihn zu haben ... Das einzige Problem bei dieser Methode ist, dass Sie zwei Elemente haben, wenn Sie Ihr Formular über Ajax senden Der gleiche Name und Sie müssen mich ein bisschen schlauer mit der Art und Weise machen, wie Sie die Werte des richtigen Elements erfassen (die beiden IDs für reCaptcha-Elemente sind#recaptcha_response_field
und #recaptcha_challenge_field, nur für den Fall, dass jemand sie benötigt).quelle
Ich weiß, dass diese Frage alt ist, aber für den Fall, dass jemand in Zukunft danach suchen wird. Es ist möglich, zwei Captchas auf einer Seite zu haben. Pink zur Dokumentation finden Sie hier: https://developers.google.com/recaptcha/docs/display Das folgende Beispiel ist nur ein Kopierformular und Sie müssen keine unterschiedlichen Layouts angeben.
quelle
Diese Antwort ist eine Erweiterung @raphadko ‚s Antwort .
Wenn Sie den Captcha-Code manuell extrahieren müssen (wie bei Ajax-Anfragen), müssen Sie Folgendes aufrufen:
Aber wie können Sie den Widget-ID-Parameter abrufen?
Ich verwende diese Definition von CaptchaCallback , um die Widget-ID jeder g-recaptcha-Box (als HTML- Datenattribut) zu speichern :
Dann kann ich anrufen:
um den Code zu extrahieren.
quelle
#your_recaptcha_box_id
?Ich habe ein Kontaktformular in der Fußzeile, das immer angezeigt wird, und auch einige Seiten, wie "Konto erstellen", können Captcha enthalten. Daher ist es dynamisch und ich verwende den nächsten Weg mit jQuery:
html:
Javascript
quelle
Dies ist eine JQuery-freie Version der Antwort von Raphadko und Nomen .
1) Erstellen Sie Ihre Recaptcha-Felder normalerweise folgendermaßen:
2) Laden Sie das Skript mit folgendem:
3) Rufen Sie dies nun auf, um die Felder zu durchlaufen und die Recaptchas zu erstellen:
quelle
Als ich mir den Quellcode der Seite ansah, nahm ich den reCaptcha-Teil und änderte den Code ein wenig. Hier ist der Code:
HTML:
jQuery:
Ich verwende hier einfache Javascript-Tab-Funktionen. Also, diesen Code nicht enthalten.
Wenn der Benutzer auf "Informationen anfordern" klickt,
(#product_tabs_what)
prüft JS, ob dies ein WertrecapExist
istfalse
oder ist. Wenn es einen Wert hat, wird dies aufgerufenRecaptcha.destroy();
, um das alte geladene reCaptcha zu zerstören und es für diese Registerkarte neu zu erstellen. Andernfalls wird nur ein reCaptcha erstellt und in das#more_info_recaptcha_box
div eingefügt . Gleich wie auf der#product_tabs_wha
Registerkarte "Angebot machen" .quelle
quelle
<div class="g-recaptcha" data-sitekey="your_site_key"></div>
Eine gute Option ist es, eine Recaptcha-Eingabe für jedes Formular im laufenden Betrieb zu generieren (ich habe es mit zwei gemacht, aber Sie könnten wahrscheinlich drei oder mehr Formulare machen). Ich verwende jQuery, jQuery Validation und das jQuery-Formular-Plugin, um das Formular über AJAX zusammen mit der Recaptcha AJAX-API zu veröffentlichen.
https://developers.google.com/recaptcha/docs/display#recaptcha_methods
Wenn der Benutzer eines der Formulare einreicht:
Anschließend können sie das Recaptcha ausfüllen und das Formular erneut einreichen. Wenn sie sich dafür entscheiden, stattdessen ein anderes Formular einzureichen, sucht Ihr Code nach vorhandenen Recaptchas, sodass Sie jeweils nur ein Recaptcha auf der Seite haben.
quelle
Um der Antwort von Raphadko etwas hinzuzufügen : Da Sie mehrere Captchas (auf einer Seite) haben, können Sie den (universellen)
g-recaptcha-response
POST-Parameter nicht verwenden (da er nur die Antwort eines Captchas enthält). Stattdessen sollten Siegrecaptcha.getResponse(opt_widget_id)
für jedes Captcha den Aufruf verwenden. Hier ist mein Code (vorausgesetzt, jedes Captcha befindet sich in seiner Form):HTML:
und
JavaScript:
Beachten Sie, dass ich die Ereignisdelegation (siehe DOM nach Anhängen des Elements aktualisieren ) auf alle dynamisch geänderten Elemente anwende. Dies bindet die Antwort jedes einzelnen Captha auf sein Formereignis
submit
.quelle
Hier ist eine Lösung, die viele der hervorragenden Antworten aufbaut. Diese Option ist jQuery-frei und dynamisch, ohne dass Sie Elemente gezielt nach ID ausrichten müssen.
1) Fügen Sie Ihr reCAPTCHA-Markup wie gewohnt hinzu:
2) Fügen Sie dem Dokument Folgendes hinzu. Es funktioniert in jedem Browser, der die querySelectorAll-API unterstützt
quelle
Die
grecaptcha.getResponse()
Methode akzeptiert einen optionalen Parameter "widget_id" und verwendet standardmäßig das erste Widget, das erstellt wird, wenn es nicht angegeben wird. Von dergrecaptcha.render()
Methode wird für jedes erstellte Widget eine widget_id zurückgegeben, die nicht mit dem Attributid
des reCAPTCHA-Containers zusammenhängt !!Jedes reCAPTCHA hat seine eigenen Antwortdaten. Sie müssen dem reCAPTCHA div eine ID geben und diese an die
getResponse
Methode übergeben:z.B
Zugriffsantwort:
oder
quelle
Es ist möglich, einfach die Recaptcha Ajax-Rückrufe zu überschreiben. Working jsfiddle: http://jsfiddle.net/Vanit/Qu6kn/
Sie benötigen nicht einmal ein Proxy-Div, da der DOM-Code beim Überschreiben nicht ausgeführt wird. Rufen Sie Recaptcha.reload () auf, wenn Sie die Rückrufe erneut auslösen möchten.
quelle
Hier ist eine nette Anleitung, um genau das zu tun:
http://mycodde.blogspot.com.ar/2014/12/multiple-recaptcha-demo-same-page.html
Grundsätzlich fügen Sie dem API-Aufruf einige Parameter hinzu und rendern jedes Recaptcha manuell:
PS: Die Methode "grecaptcha.render" erhält eine ID
quelle
Ich würde unsichtbares Recaptcha verwenden. Verwenden Sie dann auf Ihrer Schaltfläche ein Tag wie "formname = 'yourformname'", um anzugeben, welches Formular gesendet werden soll, und verbergen Sie die Eingabe eines Formulars.
Dies hat den Vorteil, dass Sie die HTML5-Formularvalidierung intakt halten können, eine Wiederholung, aber mehrere Schaltflächen. Erfassen Sie einfach den Eingabewert "captcha" für den von recaptcha generierten Token-Schlüssel.
Ich finde das viel einfacher und einfacher zu verwalten.
quelle