Tenho 2 formulários em uma única página. Um dos formulários tem um recaptcha sendo exibido o tempo todo. O outro deve exibir uma recaptcha somente após um determinado evento, como o limite de tentativas de login. Portanto, há momentos em que eu precisaria de 2 recaptchas para aparecer na mesma página. Isso é possível? Sei que provavelmente poderia usar um único para os dois, mas da forma como tenho o layout, prefiro ter 2. Obrigado.
Atualização: bem, acho que pode não ser possível. Alguém pode recomendar outra biblioteca de captura para usar lado a lado com o reCaptcha? Eu realmente quero poder ter 2 captchas na mesma página.
Atualização 2: e se colocar cada formulário em um iframe? Isso seria uma solução aceitável?
Hüseyin Yağlı
resposta de . A maioria dos navegadores deve oferecer suporte a JavaScript e o reCAPTCHA padrão usa JavaScript de qualquer maneira. No entanto, não sei o que seria necessário fazer para resolver o problema sem o suporte a JavaScript.Respostas:
Uma pergunta semelhante foi feita sobre fazer isso em uma página ASP ( link ) e o consenso ali era que não era possível fazer com recaptcha. Parece que vários formulários em uma única página devem compartilhar o captcha, a menos que você queira usar um captcha diferente. Se você não estiver preso ao recaptcha, uma boa biblioteca para dar uma olhada é o componente Zend Frameworks Zend_Captcha ( link ). Contém alguns
fonte
Hüseyin Yağlı
A resposta de explica a solução. A documentação do reCAPTCHA para esta solução está em developers.google.com/recaptcha/docs/display#explicit_render . No entanto, não sei o que seria necessário fazer para resolver o problema sem o suporte a JavaScript.Com a versão atual do Recaptcha ( reCAPTCHA API versão 2.0 ), você pode ter vários recaptchas em uma página.
Não há necessidade de clonar o recaptcha nem tentar contornar o problema. Você apenas precisa colocar vários elementos div para os recaptchas e renderizar os recaptchas dentro deles explicitamente.
Isso é fácil com o google recaptcha api:
https://developers.google.com/recaptcha/docs/display#explicit_render
Aqui está o exemplo de código html:
Em seu código javascript, você deve definir uma função de retorno de chamada para recaptcha:
Depois disso, o url do seu script recaptcha deve ser semelhante a este:
Ou, em vez de fornecer IDs para seus campos de recaptcha, você pode dar um nome de classe e fazer um loop desses elementos com seu seletor de classe e chamar .render ()
fonte
grecaptcha.getResponse(0)
egrecaptcha.getResponse(1)
para validar várias instâncias, eu acrescentaria que a indexação tem que corresponder àgrecaptcha.render
ordem. Para este exemplo,grecaptcha.render('RecaptchaField1'...
seria verificado comgrecaptcha.getResponse(0)
egrecaptcha.render('RecaptchaField2'...
seria verificado comgrecaptcha.getResponse(1)
, etc ...Simples e direto:
1) Crie seus campos de recaptcha normalmente com este:
2) Carregue o script com isto:
3) Agora chame isso para iterar os campos e criar as recaptchas:
fonte
data-sitekey="YOUR_KEY_HERE"
é inútil e pode ser removido do div (se você precisar alterar a chave, menos lugares para editar)grecaptcha.render(el, {'sitekey' : $(el).attr('data-sitekey') });
Isso é facilmente realizado com a
clone()
função jQuery .Portanto, você deve criar duas divs wrapper para o recaptcha. Div recaptcha do meu primeiro formulário:
O div do segundo formulário está vazio (ID diferente). Então o meu é apenas:
Então o javascript é bastante simples:
Provavelmente não precisa do segundo parâmetro com um
true
valor emclone()
, mas não custa nada tê-lo ... O único problema com este método é se você está enviando seu formulário via ajax, o problema é que você tem dois elementos que têm o mesmo nome e você deve me um pouco mais esperto com a maneira como você captura os valores desse elemento correto (os dois ids para elementos reCaptcha são#recaptcha_response_field
e #recaptcha_challenge_field apenas no caso de alguém precisar deles)fonte
Eu sei que esta pergunta é antiga, mas no caso de alguém procurar por ela no futuro. É possível ter dois captcha em uma página. Rosa para a documentação está aqui: https://developers.google.com/recaptcha/docs/display O exemplo abaixo é apenas uma cópia do documento e você não precisa especificar layouts diferentes.
fonte
Esta resposta é uma extensão para @raphadko resposta 's .
Se você precisar extrair manualmente o código captcha (como em solicitações ajax), deverá chamar:
Mas como você pode recuperar o parâmetro id do widget?
Eu uso esta definição de CaptchaCallback para armazenar o id do widget de cada caixa g-recaptcha (como um atributo de dados HTML):
Então posso ligar para:
para extrair o código.
fonte
#your_recaptcha_box_id
?Tenho formulário de contato em rodapé que sempre exibe e também algumas páginas, como Criar Conta, podem ter captcha também, então é dinamicamente e estou usando a próxima forma com jQuery:
html:
javascript
fonte
Esta é uma versão livre de JQuery da resposta fornecida por raphadko e substantivo .
1) Crie seus campos de recaptcha normalmente com este:
2) Carregue o script com isto:
3) Agora chame isso para iterar os campos e criar as recaptchas:
fonte
Olhando para o código-fonte da página, peguei a parte do reCaptcha e mudei um pouco o código. Aqui está o código:
HTML:
jQuery:
Estou usando aqui a funcionalidade de guia de javascript simples. Então, não incluí esse código.
Quando o usuário clica em "Solicitar informações"
(#product_tabs_what)
, o JS verifica serecapExist
éfalse
ou tem algum valor. Se tiver um valor, isso irá chamarRecaptcha.destroy();
para destruir o antigo reCaptcha carregado e irá recriá-lo para esta guia. Caso contrário, isso apenas criará um reCaptcha e será colocado no#more_info_recaptcha_box
div. O mesmo que para a#product_tabs_wha
guia "Fazer oferta" .fonte
fonte
<div class="g-recaptcha" data-sitekey="your_site_key"></div>
onde você precisa, no forms / divsUma boa opção é gerar uma entrada de recaptcha para cada formulário na hora (fiz isso com dois, mas provavelmente você poderia fazer três ou mais formulários). Estou usando jQuery, jQuery validation e jQuery form plugin para postar o formulário via AJAX, junto com a API Recaptcha AJAX -
https://developers.google.com/recaptcha/docs/display#recaptcha_methods
Quando o usuário envia um dos formulários:
Em seguida, eles podem preencher a recaptcha e reenviar o formulário. Se eles decidirem enviar um formulário diferente, bem, seu código verifica se há recaptchas existentes, então você terá apenas um recaptcha na página por vez.
fonte
Para adicionar um pouco à resposta do raphadko : como você tem vários captchas (em uma página), você não pode usar o
g-recaptcha-response
parâmetro POST (universal) (porque ele contém apenas uma resposta do captcha). Em vez disso, você deve usargrecaptcha.getResponse(opt_widget_id)
call para cada captcha. Este é meu código (desde que cada captcha esteja dentro de sua forma):HTML:
e
JavaScript:
Observe que aplico a delegação de evento (consulte atualizar DOM após adicionar elemento ) a todos os elementos modificados dinamicamente. Isso vincula a resposta de cada captha individual ao seu
submit
evento de formulário .fonte
Aqui está uma solução que se baseia em muitas das respostas excelentes. Esta opção é livre de jQuery e dinâmica, não exigindo que você direcione especificamente os elementos por id.
1) Adicione sua marcação reCAPTCHA como faria normalmente:
2) Adicione o seguinte ao documento. Funcionará em qualquer navegador compatível com a API querySelectorAll
fonte
O
grecaptcha.getResponse()
método aceita um parâmetro opcional "widget_id" e o padrão é o primeiro widget criado, se não especificado. Um widget_id é retornado dogrecaptcha.render()
método para cada widget criado, não está relacionado ao atributoid
do contêiner reCAPTCHA !!Cada reCAPTCHA possui seus próprios dados de resposta. Você deve fornecer ao div reCAPTCHA um ID e passá-lo para o
getResponse
método:por exemplo
Resposta de acesso:
ou
fonte
É possível, apenas sobrescrever os callbacks do Recaptcha Ajax. Jsfiddle de trabalho: http://jsfiddle.net/Vanit/Qu6kn/
Você nem mesmo precisa de um div de proxy porque com as sobrescritas o código DOM não será executado. Chame Recaptcha.reload () sempre que quiser acionar os callbacks novamente.
fonte
Aqui está um bom guia para fazer exatamente isso:
http://mycodde.blogspot.com.ar/2014/12/multiple-recaptcha-demo-same-page.html
Basicamente, você adiciona alguns parâmetros à chamada da API e renderiza manualmente cada recaptcha:
PS: O método "grecaptcha.render" recebe um ID
fonte
Eu usaria recaptcha invisível. Então, no botão, use uma tag como "formname = 'yourformname'" para especificar qual formulário deve ser enviado e ocultar uma entrada de formulário de envio.
A vantagem disso é que permite que você mantenha a validação do formulário html5 intacta, uma recaptcha, mas várias interfaces de botão. Basta capturar o valor de entrada "captcha" para a chave de token gerada pelo recaptcha.
Acho isso muito mais simples e fácil de gerenciar.
fonte