sourcecode

한 페이지에 여러 개의 리캡처를 표시하려면 어떻게 해야 하나요?

copyscript 2022. 12. 26. 20:31
반응형

한 페이지에 여러 개의 리캡처를 표시하려면 어떻게 해야 하나요?

한 페이지에 두 개의 양식이 있습니다.그 양식 중 하나는 탈환차가 항상 표시된다.다른 한쪽은 로그인 시도 최대값 등 특정 이벤트가 발생한 후에만 retailcha를 표시해야 합니다.그래서 같은 페이지에 두 개의 리캡처가 필요할 때가 있습니다.이게 가능합니까?둘 다 싱글로 할 수 있다는 것은 알지만, 레이아웃을 보면 2개가 더 좋습니다.감사해요.

업데이트: 불가능할 수도 있습니다.reCaptcha와 함께 사용할 다른 캡처 라이브러리를 추천해 주실 수 있습니까?꼭 2개의 캡처를 같은 페이지에 넣을 수 있으면 좋겠습니다.

업데이트 2: 각 폼을 iframe에 넣으면 어떻게 됩니까?이것이 수용 가능한 해결책일까요?

현재 버전의 Recapcha(reCAPTCHA API 버전 2.0)에서는 여러 개의 Recapcha를 한 페이지에 표시할 수 있습니다.

retackcha를 복제하거나 문제를 해결할 필요가 없습니다.리캡처용 여러 div 요소를 넣고 그 안에 리캡처를 명시적으로 렌더링하기만 하면 됩니다.

Google retapcha api.
https://developers.google.com/recaptcha/docs/display#explicit_renderhttpsdevelopers.google.com/recaptcha/docs/display#

다음은 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>

javascript 코드에서 retcha를 위한 콜백 함수를 정의해야 합니다.

<script type="text/javascript">
    var CaptchaCallback = function() {
        grecaptcha.render('RecaptchaField1', {'sitekey' : '6Lc_your_site_key'});
        grecaptcha.render('RecaptchaField2', {'sitekey' : '6Lc_your_site_key'});
    };
</script>

이후 retailcha 스크립트 URL은 다음과 같습니다.

<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>

또는 retapcha 필드에 ID를 지정하는 대신 클래스 이름을 지정하고 클래스 셀렉터로 이러한 요소를 루프하여 .render()를 호출할 수 있습니다.

심플하고 알기 쉽게:

1) 보통 리셉차 필드를 만듭니다.

<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) 이것을 호출하고 필드에 반복하여 리캡처를 만듭니다.

<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>

이 답변은 @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'));

코드를 추출합니다.

ASP 페이지(링크)에서 이와 유사한 질문을 받았는데, 리캡카에서는 불가능하다는 의견이 일치했습니다.다른 captcha를 사용할 의사가 없는 한, 한 페이지에 있는 여러 개의 양식이 captcha를 공유해야 할 것 같습니다.retcha에 잠겨 있지 않은 경우 살펴보기 좋은 라이브러리는 Zend Frameworks Zend_Captcha 컴포넌트(링크)입니다.몇 개 들어 있습니다.

jQuery를 사용하면 할 수 .clone()★★★★★★ 。

탈환차용 래퍼 디바를 2개 작성해야 합니다.내 첫 번째 폼은 탈환차 div:

<div id="myrecap">
    <?php
        require_once('recaptchalib.php');
        $publickey = "XXXXXXXXXXX-XXXXXXXXXXX";
        echo recaptcha_get_html($publickey);
    ?>
</div>

두 번째 양식의 div가 비어 있습니다(다른 ID).그래서 저는 그냥...

<div id="myraterecap"></div>

javascript는 매우 간단합니다.

$(document).ready(function() {
    // Duplicate our reCapcha 
    $('#myraterecap').html($('#myrecap').clone(true,true));
});

두 는 필요예요.true.clone()하지만 가지고 있다고 해서 나쁠 건 없어...는 에이잭스를는 이름이 가 있다는 이 을 캡처하는 방법에 좀더하게 대처해야 는 "Ajax"입니다).문제는 이름이 같은 두 요소가 있다는 것입니다.또한 올바른 요소의 값을 캡처하는 방법에 대해 좀 더 현명하게 설명해야 합니다(reCaptcha 요소의 두 ID는#recaptcha_response_field#secha_field)

오래된 질문인 건 알지만 나중에 누가 찾을지 모르니까.한 페이지에 두 개의 캡차가 있을 수 있습니다.설명서에 대한 분홍색은 다음과 같습니다.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>

grecaptcha.getResponse()method는 선택적 "syslog_id" 매개 변수를 허용하며 지정되지 않은 경우 기본적으로 첫 번째 위젯으로 작성됩니다.는 widget_id에서 됩니다.grecaptcha.render()작성된 각 위젯에 대한 메서드는 reCAPTCHA 컨테이너의 속성과는 관련이 없습니다!!

리캡차라고 합니다. div ID로 해야 .getResponse★★★★

예.

<div id="reCaptchaLogin"
     class="g-recaptcha required-entry"
     data-sitekey="<?php echo $this->helper('recaptcha')->getKey(); ?>"
     data-theme="<?php echo($this->helper('recaptcha')->getTheme()); ?>"
     style="transform:scale(0.82);-webkit-transform:scale(0.82);transform-origin:0 0;-webkit-transform-origin:0 0;">
</div>


<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>

<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>

액세스 응답:

var reCaptchaResponse = grecaptcha.getResponse(0);

또는

var reCaptchaResponse = grecaptcha.getResponse(1);

바닥글에 항상 표시되는 연락처 폼이 있으며, Create Account와 같은 일부 페이지도 captcha를 사용할 수 있기 때문에 동적으로 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>

라파드코와 명사가 제공하는 JQuery 프리 버전입니다.

1) 보통 리셉차 필드를 만듭니다.

<div class="g-recaptcha"></div>

2) 다음과 같이 스크립트를 로드합니다.

<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>

3) 이것을 호출하고 필드에 반복하여 리캡처를 만듭니다.

var CaptchaCallback = function() {
    var captchas = document.getElementsByClassName("g-recaptcha");
    for(var i = 0; i < captchas.length; i++) {
        grecaptcha.render(captchas[i], {'sitekey' : 'YOUR_KEY_HERE'});
    }
};

페이지의 소스 코드를 보고 reCaptcha 부분을 가져다가 코드를 조금 바꿨습니다.코드는 다음과 같습니다.

HTML:

<div class="tabs">
    <ul class="product-tabs">
        <li id="product_tabs_new" class="active"><a href="#">Detailed Description</a></li>
        <li id="product_tabs_what"><a href="#">Request Information</a></li>
        <li id="product_tabs_wha"><a href="#">Make Offer</a></li>
    </ul>
</div>

<div class="tab_content">
    <li class="wide">
        <div id="product_tabs_new_contents">
            <?php $_description = $this->getProduct()->getDescription(); ?>
            <?php if ($_description): ?>
                <div class="std">
                    <h2><?php echo $this->__('Details') ?></h2>
                    <?php echo $this->helper('catalog/output')->productAttribute($this->getProduct(), $_description, 'description') ?>
                </div>
            <?php endif; ?>
        </div>
    </li>

    <li class="wide">
        <label for="recaptcha">Captcha</label>
        <div id="more_info_recaptcha_box" class="input-box more_info_recaptcha_box"></div>
    </li>

    <li class="wide">
        <label for="recaptcha">Captcha</label>
        <div id="make_offer_recaptcha_box" class="input-box make_offer_recaptcha_box"></div>
    </li>
</div>

j쿼리:

<script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
<script type="text/javascript">
    jQuery(document).ready(function() {
        var recapExist = false;
      // Create our reCaptcha as needed
        jQuery('#product_tabs_what').click(function() {
            if(recapExist == false) {
                Recaptcha.create("<?php echo $publickey; ?>", "more_info_recaptcha_box");
                recapExist = "make_offer_recaptcha_box";
            } else if(recapExist == 'more_info_recaptcha_box') {
                Recaptcha.destroy(); // Don't really need this, but it's the proper way
                Recaptcha.create("<?php echo $publickey; ?>", "more_info_recaptcha_box");
                recapExist = "make_offer_recaptcha_box";
            }
        });
        jQuery('#product_tabs_wha').click(function() {
            if(recapExist == false) {
                Recaptcha.create("<?php echo $publickey; ?>", "make_offer_recaptcha_box");
                recapExist = "more_info_recaptcha_box";
            } else if(recapExist == 'make_offer_recaptcha_box') {
                Recaptcha.destroy(); // Don't really need this, but it's the proper way (I think :)
                Recaptcha.create("<?php echo $publickey; ?>", "make_offer_recaptcha_box");
                recapExist = "more_info_recaptcha_box";
            }
        });
    });
</script>

간단한 javascript 탭 기능을 사용하고 있습니다.그래서 그 코드를 넣지 않았군요.

가 [ Information]를했을 때 [Request Information ( 보보"" ) ]를 클릭합니다.(#product_tabs_what)그러면 JS가 체크합니다.recapExistfalse또는 가치가 있습니다.값이 있는 경우 호출됩니다.Recaptcha.destroy();이전 로드된 reCaptcha를 파기하고 이 탭에서 다시 만듭니다.그렇지 않으면 reCaptcha가 생성되어 에 배치됩니다.#more_info_recaptcha_boxdiv. "Make Offer"와 동일#product_tabs_wha탭을 클릭합니다.

var ReCaptchaCallback = function() {
    	 $('.g-recaptcha').each(function(){
    		var el = $(this);
    		grecaptcha.render(el.get(0), {'sitekey' : el.data("sitekey")});
    	 });  
        };
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js?onload=ReCaptchaCallback&render=explicit" async defer></script>


ReCaptcha 1
<div class="g-recaptcha" data-sitekey="6Lc8WQcUAAAAABQKSITdXbc6p9HISCQhZIJwm2Zw"></div>

ReCaptcha 2
<div class="g-recaptcha" data-sitekey="6Lc8WQcUAAAAABQKSITdXbc6p9HISCQhZIJwm2Zw"></div>

ReCaptcha 3
<div class="g-recaptcha" data-sitekey="6Lc8WQcUAAAAABQKSITdXbc6p9HISCQhZIJwm2Zw"></div>

Raphadko 답변에 조금 더 덧붙이자면, (한 페이지에) 여러 개의 캡처를 가지고 있기 때문에 (범용)을 사용할 수 없습니다.g-recaptcha-responsePOST 파라미터(Captcha의 응답은 1개뿐이기 때문에).그 대신에,grecaptcha.getResponse(opt_widget_id)캡차 한 대씩 불러주세요.다음은 내 코드입니다(각 캡차가 폼 안에 있는 경우).

HTML:

<form ... />

<div id="RecaptchaField1"></div>

<div class="field">
  <input type="hidden" name="grecaptcha" id="grecaptcha" />
</div>

</form>

그리고.

<script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>

JavaScript:

var CaptchaCallback = function(){
    var widgetId;

    $('[id^=RecaptchaField]').each(function(index, el) {

         widgetId = grecaptcha.render(el.id, {'sitekey' : 'your_site_key'});

         $(el).closest("form").submit(function( event ) {

            this.grecaptcha.value = "{\"" + index + "\" => \"" + grecaptcha.getResponse(widgetId) + "\"}"

         });
    });
};

동적으로 변경된 모든 요소에 이벤트 위임을 적용합니다(「refresh DOM after append element」를 참조).이것은 모든 카프타의 반응을 형태와 결합시킨다.submit이벤트입니다.

각 폼에 대해 즉시 리캡차 입력을 생성하는 것이 좋습니다(두 개로 해봤지만 세 개 이상의 폼을 수행할 수 있습니다).JQuery, jQuery validation 및 jQuery 형식의 플러그인을 사용하여 폼을 리캡차 AJAX API와 함께 AJAX를 통해 게시합니다.

https://developers.google.com/recaptcha/docs/display#recaptcha_methods

사용자가 다음 중 하나의 양식을 제출하면

  1. 송신 가로채기 - jQuery Form Plugin의 beforeSubmit 속성을 사용했습니다.
  2. 페이지의 기존 retailcha 입력을 파기합니다.jQuery의 $.empty() 메서드와 Recapcha.destroy()를 사용했습니다.
  3. Recapcha.create()를 호출하여 특정 형식의 Recapcha 필드를 만듭니다.
  4. 거짓으로 답하다

그런 다음 탈환차를 작성해서 다시 제출하면 됩니다.만약 그들이 다른 양식을 제출하기로 결정한다면, 음, 당신의 코드는 기존의 탈환을 체크하기 때문에 당신은 한 번에 하나의 탈환차만 페이지에 남습니다.

여기 많은 훌륭한 답변을 바탕으로 한 솔루션이 있습니다.이 옵션은 jQuery free로 동적이며 id별로 특정 요소를 대상으로 지정할 필요가 없습니다.

1) reCAPTCHA 마크업을 통상대로 추가합니다.

<div class="g-recaptcha" data-sitekey="YOUR_KEY_HERE"></div>

2) 문서에 다음 사항을 추가한다.querySelector를 지원하는 모든 브라우저에서 작동합니다.모든 API

<script src="https://www.google.com/recaptcha/api.js?onload=renderRecaptchas&render=explicit" async defer></script>
<script>
    window.renderRecaptchas = function() {
        var recaptchas = document.querySelectorAll('.g-recaptcha');
        for (var i = 0; i < recaptchas.length; i++) {
            grecaptcha.render(recaptchas[i], {
                sitekey: recaptchas[i].getAttribute('data-sitekey')
            });
        }
    }
</script>

가능합니다. Recapcha Ajax 콜백을 덮어쓰기만 하면 됩니다.작업 중인 jsfiddle: http://jsfiddle.net/Vanit/Qu6kn/

덮어쓰기를 하면 DOM 코드가 실행되지 않기 때문에 프록시 div도 필요하지 않습니다.콜백을 다시 트리거하려면 언제든지 Recapcha.reload()를 호출합니다.

function doSomething(challenge){
    $(':input[name=recaptcha_challenge_field]').val(challenge);
    $('img.recaptcha').attr('src', '//www.google.com/recaptcha/api/image?c='+challenge);
}

//Called on Recaptcha.reload()
Recaptcha.finish_reload = function(challenge,b,c){
    doSomething(challenge);
}

//Called on page load
Recaptcha.challenge_callback = function(){
    doSomething(RecaptchaState.challenge)
}

Recaptcha.create("YOUR_PUBLIC_KEY");

이를 위한 좋은 가이드는 다음과 같습니다.

http://mycodde.blogspot.com.ar/2014/12/multiple-recaptcha-demo-same-page.html

기본적으로 API 호출에 몇 가지 파라미터를 추가하고 각 리캡차를 수동으로 렌더링합니다.

<script src="https://www.google.com/recaptcha/api.js?onload=myCallBack&render=explicit" async defer></script>
<script>
        var recaptcha1;
        var recaptcha2;
        var myCallBack = function() {
            //Render the recaptcha1 on the element with ID "recaptcha1"
            recaptcha1 = grecaptcha.render('recaptcha1', {
                'sitekey' : '6Lc_0f4SAAAAAF9ZA', //Replace this with your Site key
                'theme' : 'light'
            });

            //Render the recaptcha2 on the element with ID "recaptcha2"
            recaptcha2 = grecaptcha.render('recaptcha2', {
                'sitekey' : '6Lc_0f4SAAAAAF9ZA', //Replace this with your Site key
                'theme' : 'dark'
            });
        };
</script>

PS: "grecaptcha.render" 메서드는 ID를 수신합니다.

난 투명 탈환차를 사용할 거야그런 다음 버튼에서 "formname='yourformname'"과 같은 태그를 사용하여 제출할 양식을 지정하고 제출 양식 입력을 숨깁니다.

이 방법의 장점은 html5 형식의 검증을 그대로 유지할 수 있다는 것입니다.하나의 리캡차이지만 여러 개의 버튼 인터페이스를 사용할 수 있습니다.retcha에 의해 생성된 토큰 키의 "captcha" 입력 값을 캡처하기만 하면 됩니다.

<script src="https://www.google.com/recaptcha/api.js" async defer ></script>

<div class="g-recaptcha" data-sitekey="yours" data-callback="onSubmit" data-size="invisible"></div>
<script>
var formanme = ''
$('button').on('click', function () { formname = '#'+$(this).attr('formname');
    if ( $(formname)[0].checkValidity() == true) { grecaptcha.execute(); }
    else { $(formname).find('input[type="submit"]').click() }
    });

var onSubmit = function(token) {
    $(formname).append("<input type='hidden' name='captcha' value='"+token+"' />");
    $(formname).find('input[type="submit"]').click()
    };
</script>

나는 이것이 훨씬 더 간단하고 관리하기 쉽다고 생각한다.

언급URL : https://stackoverflow.com/questions/1241947/how-do-i-show-multiple-recaptchas-on-a-single-page

반응형