Tengo 2 formularios en una sola página. Uno de los formularios tiene un recaptcha que se muestra todo el tiempo. El otro debería mostrar un recaptcha solo después de un cierto evento, como maximizar los intentos de inicio de sesión. Entonces, hay ocasiones en las que necesito que aparezcan 2 recaptchas en la misma página. es posible? Sé que probablemente podría usar uno solo para ambos, pero por la forma en que tengo el diseño, preferiría tener 2. Gracias.
Actualización: bueno, supongo que puede que no sea posible. ¿Alguien puede recomendar otra biblioteca de captura para usar junto con reCaptcha? Realmente quiero poder tener 2 captchas en la misma página.
Actualización 2: ¿Qué pasa si colocas cada formulario en un iframe? ¿Sería esta una solución aceptable?
Hüseyin Yağlı
la respuesta . La mayoría de los navegadores deberían admitir JavaScript y el reCAPTCHA predeterminado usa JavaScript de todos modos. Sin embargo, no sé qué se debería hacer para resolver el problema sin el soporte de JavaScript.Respuestas:
Se hizo una pregunta similar sobre cómo hacer esto en una página ASP ( enlace ) y el consenso fue que no era posible hacerlo con recaptcha. Parece que varios formularios en una sola página deben compartir el captcha, a menos que esté dispuesto a usar un captcha diferente. Si no está encerrado en recaptcha, una buena biblioteca para echar un vistazo es el componente Zend Frameworks Zend_Captcha ( enlace ). Contiene algunos
fuente
Hüseyin Yağlı
La respuesta explica la solución. La documentación de reCAPTCHA para esta solución se encuentra en developers.google.com/recaptcha/docs/display#explicit_render . Sin embargo, no sé qué se debería hacer para resolver el problema sin el soporte de JavaScript.Con la versión actual de Recaptcha ( reCAPTCHA API versión 2.0 ), puede tener múltiples recaptchas en una página.
No es necesario clonar el recaptcha ni intentar solucionar el problema. Solo tiene que poner múltiples elementos div para las recaptchas y renderizar las recaptchas dentro de ellos explícitamente.
Esto es fácil con la api recaptcha de google:
https://developers.google.com/recaptcha/docs/display#explicit_render
Aquí está el código html de ejemplo:
En su código javascript, debe definir una función de devolución de llamada para recaptcha:
Después de esto, su URL de script recaptcha debería verse así:
O en lugar de dar ID a sus campos de recaptcha, puede dar un nombre de clase y repetir estos elementos con su selector de clases y llamar a .render ()
fuente
grecaptcha.getResponse(0)
ygrecaptcha.getResponse(1)
validar múltiples instancias, agregaría que la indexación tiene que corresponder con elgrecaptcha.render
orden. Para este ejemplo,grecaptcha.render('RecaptchaField1'...
se verificaría congrecaptcha.getResponse(0)
ygrecaptcha.render('RecaptchaField2'...
se verificaría congrecaptcha.getResponse(1)
, etc ...Sencillo y sencillo:
1) Cree sus campos recaptcha normalmente con esto:
2) Cargue el script con esto:
3) Ahora llame a esto para iterar sobre los campos y crear las recaptchas:
fuente
data-sitekey="YOUR_KEY_HERE"
es inútil y se puede eliminar del div (si necesita cambiar la clave, menos lugares para editar)grecaptcha.render(el, {'sitekey' : $(el).attr('data-sitekey') });
Esto se logra fácilmente con la
clone()
función de jQuery .Por lo tanto, debe crear dos divs de envoltura para recaptcha. Recaptcha div de mi primer formulario:
El div del segundo formulario está vacío (ID diferente). Entonces el mío es solo:
Entonces el javascript es bastante simple:
Probablemente no necesite el segundo parámetro con un
true
valorclone()
, pero no está de más tenerlo ... El único problema con este método es si envía su formulario a través de ajax, el problema es que tiene dos elementos que tienen el mismo nombre y debe ser un poco más inteligente con la forma en que captura los valores correctos del elemento (los dos identificadores para los elementos#recaptcha_response_field
reCaptcha son y #recaptcha_challenge_field en caso de que alguien los necesite)fuente
Sé que esta pregunta es antigua, pero en caso de que alguien la busque en el futuro. Es posible tener dos captcha en una página. Rosa para la documentación está aquí: https://developers.google.com/recaptcha/docs/display El ejemplo a continuación es solo una copia del documento del formulario y no es necesario que especifique diseños diferentes.
fuente
Esta respuesta es una extensión de la respuesta de @raphadko .
Si necesita extraer manualmente el código captcha (como en las solicitudes ajax) debe llamar a:
Pero, ¿cómo se puede recuperar el parámetro de identificación del widget?
Utilizo esta definición de CaptchaCallback para almacenar la identificación del widget de cada cuadro de g-recaptcha (como un atributo de datos HTML):
Entonces puedo llamar:
para extraer el código.
fuente
#your_recaptcha_box_id
?Tengo un formulario de contacto en el pie de página que siempre se muestra y también algunas páginas, como Crear cuenta, también pueden tener captcha, por lo que es dinámico y estoy usando la siguiente forma con jQuery:
html:
javascript
fuente
Esta es una versión sin JQuery de la respuesta proporcionada por raphadko y sustantivo .
1) Cree sus campos recaptcha normalmente con esto:
2) Cargue el script con esto:
3) Ahora llame a esto para iterar sobre los campos y crear las recaptchas:
fuente
Mirando el código fuente de la página, tomé la parte reCaptcha y cambié un poco el código. Aquí está el código:
HTML:
jQuery:
Estoy usando aquí la funcionalidad de pestaña de JavaScript simple. Entonces, no incluyó ese código.
Cuando el usuario seleccione la opción "Solicitar información"
(#product_tabs_what)
a continuación, JS comprobará sirecapExist
esfalse
o tiene algún valor. Si tiene un valor, esto llamaráRecaptcha.destroy();
para destruir el antiguo reCaptcha cargado y lo volverá a crear para esta pestaña. De lo contrario, esto solo creará un reCaptcha y se colocará en el#more_info_recaptcha_box
div. Igual que para la#product_tabs_wha
pestaña "Hacer oferta" .fuente
fuente
<div class="g-recaptcha" data-sitekey="your_site_key"></div>
donde lo necesite, en formularios / divsUna buena opción es generar una entrada recaptcha para cada formulario sobre la marcha (lo he hecho con dos, pero probablemente podrías hacer tres o más formularios). Estoy usando jQuery, jQuery validation y el complemento de formulario jQuery para publicar el formulario a través de AJAX, junto con la API Recaptcha AJAX -
https://developers.google.com/recaptcha/docs/display#recaptcha_methods
Cuando el usuario envía uno de los formularios:
Luego, pueden completar el recaptcha y volver a enviar el formulario. Si deciden enviar un formulario diferente, bueno, su código verifica las recaptchas existentes, por lo que solo tendrá una recaptcha en la página a la vez.
fuente
Para agregar un poco a la respuesta de raphadko : dado que tiene múltiples captchas (en una página), no puede usar el
g-recaptcha-response
parámetro POST (universal) (porque solo contiene una respuesta de captcha). En su lugar, debe usargrecaptcha.getResponse(opt_widget_id)
call para cada captcha. Aquí está mi código (siempre que cada captcha esté dentro de su formulario):HTML:
y
JavaScript:
Observe que aplico la delegación de eventos (consulte actualizar DOM después de agregar elemento ) a todos los elementos modificados dinámicamente. Esto une la respuesta de cada captha individual a su
submit
evento de forma .fuente
Aquí hay una solución que se basa en muchas de las excelentes respuestas. Esta opción es gratuita y dinámica con jQuery, por lo que no requiere que se oriente específicamente a los elementos por id.
1) Agregue su marcado reCAPTCHA como lo haría normalmente:
2) Agregue lo siguiente al documento. Funcionará en cualquier navegador que admita la API querySelectorAll
fuente
El
grecaptcha.getResponse()
método acepta un parámetro "widget_id" opcional y, por defecto, el primer widget creado si no se especifica. Se devuelve un widget_id delgrecaptcha.render()
método para cada widget creado, ¡ no está relacionado con el atributoid
del contenedor reCAPTCHA!Cada reCAPTCHA tiene sus propios datos de respuesta. Tienes que darle al div reCAPTCHA un ID y pasarlo al
getResponse
método:p.ej
Respuesta de acceso:
o
fuente
Es posible, simplemente sobrescriba las devoluciones de llamada de Recaptcha Ajax. Jsfiddle de trabajo: http://jsfiddle.net/Vanit/Qu6kn/
Ni siquiera necesita un div de proxy porque con las sobrescrituras el código DOM no se ejecutará. Llame a Recaptcha.reload () siempre que desee activar las devoluciones de llamada nuevamente.
fuente
Aquí hay una buena guía para hacer exactamente eso:
http://mycodde.blogspot.com.ar/2014/12/multiple-recaptcha-demo-same-page.html
Básicamente, agregas algunos parámetros a la llamada api y renderizas manualmente cada recaptcha:
PD: el método "grecaptcha.render" recibe un ID
fuente
Usaría recaptcha invisible. Luego, en su botón, use una etiqueta como "formname = 'yourformname'" para especificar qué formulario se enviará y ocultar una entrada de formulario de envío.
La ventaja de esto es que le permite mantener intacta la validación del formulario html5, una recaptcha, pero múltiples interfaces de botones. Simplemente capture el valor de entrada "captcha" para la clave de token generada por recaptcha.
Encuentro esto MUCHO más simple y fácil de administrar.
fuente