한 페이지에 두 가지 양식이 있습니다. 양식 중 하나에는 항상 표시되는 recaptcha가 있습니다. 다른 하나는 최대 로그인 시도와 같은 특정 이벤트 이후에만 recaptcha를 표시해야합니다. 따라서 동일한 페이지에 2 개의 리캡 차가 표시되어야하는 경우가 있습니다. 이게 가능해? 두 가지 모두에 대해 하나를 사용할 수 있다는 것을 알고 있지만 레이아웃 방식에서는 2 개를 선호합니다. 감사합니다.
업데이트 : 가능하지 않을 수도 있습니다. 누구든지 reCaptcha와 함께 사용할 다른 캡처 라이브러리를 추천 할 수 있습니까? 나는 정말로 같은 페이지에 2 개의 캡차를 가질 수 있기를 원합니다.
업데이트 2 : 각 양식을 iframe에 넣으면 어떻게 되나요? 이것이 허용 가능한 솔루션입니까?
답변
ASP 페이지 ( link ) 에서이 작업을 수행하는 것에 대해 비슷한 질문이 제기되었으며 거기에있는 합의는 recaptcha로 할 수 없다는 것입니다. 다른 보안 문자를 사용하지 않는 한 단일 페이지의 여러 양식이 보안 문자를 공유해야하는 것 같습니다. recaptcha에 잠겨 있지 않은 경우 살펴볼 좋은 라이브러리는 Zend Frameworks Zend_Captcha 구성 요소 ( 링크 )입니다. 그것은 몇 가지를 포함합니다
답변
현재 버전의 Recaptcha ( reCAPTCHA API 버전 2.0 )를 사용하면 한 페이지에 여러 개의 recaptcha가있을 수 있습니다.
recaptcha를 복제하거나 문제 해결을 시도 할 필요가 없습니다. recaptcha에 여러 div 요소를 넣고 그 안에 recaptcha를 명시 적으로 렌더링하면됩니다.
google recaptcha api를 사용하면 쉽습니다.
https://developers.google.com/recaptcha/docs/display#explicit_render
다음은 HTML 코드의 예입니다.
<form>
<h1>Form 1</h1>
<div><input type="text" name="field1" placeholder="field1"></div>
<div><input type="text" name="field2" placeholder="field2"></div>
<div id="RecaptchaField1"></div>
<div><input type="submit"></div>
</form>
<form>
<h1>Form 2</h1>
<div><input type="text" name="field3" placeholder="field3"></div>
<div><input type="text" name="field4" placeholder="field4"></div>
<div id="RecaptchaField2"></div>
<div><input type="submit"></div>
</form>
자바 스크립트 코드에서 recaptcha에 대한 콜백 함수를 정의해야합니다.
<script type="text/javascript">
var CaptchaCallback = function() {
grecaptcha.render('RecaptchaField1', {'sitekey' : '6Lc_your_site_key'});
grecaptcha.render('RecaptchaField2', {'sitekey' : '6Lc_your_site_key'});
};
</script>
그 후, recaptcha 스크립트 URL은 다음과 같습니다.
<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>
또는 recaptcha 필드에 ID를 제공하는 대신 클래스 이름을 제공하고 클래스 선택기로 이러한 요소를 반복하고 .render ()를 호출 할 수 있습니다.
답변
간단하고 직관적 :
1) 일반적으로 다음과 같이 recaptcha 필드를 만듭니다.
<div class="g-recaptcha" data-sitekey="YOUR_KEY_HERE"></div>
2) 다음과 같이 스크립트를로드합니다.
<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>
3) 이제 이것을 호출하여 필드를 반복하고 recaptchas를 만듭니다.
<script type="text/javascript">
var CaptchaCallback = function() {
jQuery('.g-recaptcha').each(function(index, el) {
grecaptcha.render(el, {
'sitekey' : jQuery(el).attr('data-sitekey')
,'theme' : jQuery(el).attr('data-theme')
,'size' : jQuery(el).attr('data-size')
,'tabindex' : jQuery(el).attr('data-tabindex')
,'callback' : jQuery(el).attr('data-callback')
,'expired-callback' : jQuery(el).attr('data-expired-callback')
,'error-callback' : jQuery(el).attr('data-error-callback')
});
});
};
</script>
답변
이것은 jQuery의 clone()
기능으로 쉽게 수행됩니다 .
따라서 recaptcha에 대해 두 개의 래퍼 div를 만들어야합니다. 내 첫 번째 양식의 recaptcha div :
<div id="myrecap">
<?php
require_once('recaptchalib.php');
$publickey = "XXXXXXXXXXX-XXXXXXXXXXX";
echo recaptcha_get_html($publickey);
?>
</div>
두 번째 양식의 div가 비어 있습니다 (다른 ID). 그래서 내 것은 다음과 같습니다.
<div id="myraterecap"></div>
그렇다면 자바 스크립트는 매우 간단합니다.
$(document).ready(function() {
// Duplicate our reCapcha
$('#myraterecap').html($('#myrecap').clone(true,true));
});
아마도 true
값 이있는 두 번째 매개 변수가 필요 clone()
하지는 않지만 그것을 가지고 있어도 아프지는 않습니다 …이 방법의 유일한 문제는 ajax를 통해 양식을 제출하는 경우 문제는 다음과 같은 두 가지 요소가 있다는 것입니다. 같은 이름이고 올바른 요소의 값을 캡처하는 방법에 대해 좀 더 영리해야합니다 (reCaptcha 요소의 두 ID는 #recaptcha_response_field
누군가가 필요할 경우를 대비하여 #recaptcha_challenge_field입니다).
답변
나는이 질문이 오래되었다는 것을 알고 있지만 누군가가 미래에 그것을 찾을 경우를 대비하여. 한 페이지에 두 개의 보안 문자가있을 수 있습니다. Pink to documentation은 여기에 있습니다. https://developers.google.com/recaptcha/docs/display
아래 예제는 복사 양식 문서이며 다른 레이아웃을 지정할 필요가 없습니다.
<script type="text/javascript">
var verifyCallback = function(response) {
alert(response);
};
var widgetId1;
var widgetId2;
var onloadCallback = function() {
// Renders the HTML element with id 'example1' as a reCAPTCHA widget.
// The id of the reCAPTCHA widget is assigned to 'widgetId1'.
widgetId1 = grecaptcha.render('example1', {
'sitekey' : 'your_site_key',
'theme' : 'light'
});
widgetId2 = grecaptcha.render(document.getElementById('example2'), {
'sitekey' : 'your_site_key'
});
grecaptcha.render('example3', {
'sitekey' : 'your_site_key',
'callback' : verifyCallback,
'theme' : 'dark'
});
};
</script>
답변
이 대답은 @raphadko 의 대답에 대한 확장 입니다.
ajax 요청과 같이 captcha 코드를 수동으로 추출해야하는 경우 다음을 호출해야합니다.
grecaptcha.getResponse(widget_id)
그러나 위젯 ID 매개 변수를 어떻게 검색 할 수 있습니까?
이 CaptchaCallback 정의 를 사용하여 각 g-recaptcha 상자 의 위젯 ID 를 HTML 데이터 속성으로 저장합니다.
var CaptchaCallback = function() {
jQuery('.g-recaptcha').each(function(index, el) {
var widgetId = grecaptcha.render(el, {'sitekey' : 'your code'});
jQuery(this).attr('data-widget-id', widgetId);
});
};
그런 다음 전화 할 수 있습니다.
grecaptcha.getResponse(jQuery('#your_recaptcha_box_id').attr('data-widget-id'));
코드를 추출합니다.
답변
항상 표시되는 바닥 글에 연락처 양식이 있고 계정 만들기와 같은 일부 페이지에도 보안 문자가있을 수 있으므로 동적이며 다음 방법으로 jQuery를 사용하고 있습니다.
html :
<div class="g-recaptcha" id="g-recaptcha"></div>
<div class="g-recaptcha" id="g-recaptcha-footer"></div>
자바 스크립트
<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit&hl=en"></script>
<script type="text/javascript">
var CaptchaCallback = function(){
$('.g-recaptcha').each(function(){
grecaptcha.render(this,{'sitekey' : 'your_site_key'});
})
};
</script>