Google ReCaptcha 在 ios 设备上验证时滚动到页面底部

Posted

技术标签:

【中文标题】Google ReCaptcha 在 ios 设备上验证时滚动到页面底部【英文标题】:Google ReCaptcha Scroll to bottom of page when verified on ios devices 【发布时间】:2017-01-27 08:03:11 【问题描述】:

我在联系表单上使用 google recaptcha。问题是,在移动设备上,当验证 google recaptcha 时,它会将使用向下滚动到页面底部。然后用户必须再次向上滚动才能提交特定表单。

这只发生在运行版本 10 或更高版本的 ios 设备上。

我无法解决这个问题。

你可以在这里看到问题https://www.digamberpradhan.com.np/contact-copy/

【问题讨论】:

这是一个已知的错误;见github.com/google/recaptcha/issues/130 【参考方案1】:

我设法找到了解决此问题的方法。 首先,您应该知道提交响应后会有回调。我所做的就是用它来集中我在这个回调中需要的东西。但是焦点在 iOS 上无法正常工作,因此您必须使用另一种解决方法,即 javascript 动画。 文档:https://developers.google.com/recaptcha/docs/display

就我而言,它看起来像这样:

<script src="http://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
<div id="re-captcha" class="g-recaptcha" ></div>

如您所见,我在重新验证码加载后调用onloadCallback。此外,由于某种原因,如果您不指定 render=explicit,则不会发生回调。

<script>
    var focusWhatever = function (response) 
        $("html, body").animate( scrollTop: $("#whatever").offset().top , "slow");
    ;

    var onloadCallback = function () 
        var widget = grecaptcha.render(document.getElementById("re-captcha"), 
            'sitekey' : "yoursitekey",
            'theme': "light",
            'callback' : focusWhatever
        );
    
</script>

特别是,在这种情况下,动画会直接转到您想要的任何元素。为了让用户看起来不错,您应该选择一个高于您实际想要关注的元素。

【讨论】:

【参考方案2】:

这是我使用的解决方法,因为我发现这个问题发生在我管理的一个 WordPress 网站中。它与 Rodrigo 的相似之处在于它看起来使用了 onload 回调;但是,我没有滚动到 $(element)offset().top,而是观看了滚动事件:将 reCAPTCHA 容器滚动到视图中后,我记下了窗口的 pageYOffset 并改为滚动到该位置

<script type="text/javascript">
window.reCaptchaPos = false;

function attachEvent(element, event, callbackFunction) 
    if (element.addEventListener) 
        element.addEventListener(event, callbackFunction, false);
     else if (element.attachEvent) 
        element.attachEvent('on' + event, callbackFunction);
    
;

function isScrolledIntoView(el)  
    var theTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    var elemTop = el.getBoundingClientRect().top;
    var elemBottom = el.getBoundingClientRect().bottom;

    var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);
    if(isVisible)  window.reCaptchaPos = theTop;  
    return isVisible;


window.onscroll = function()  isScrolledIntoView(document.getElementById('reCaptcha_')); ;

focusWhatever = function (response)  
          if(window.reCaptchaPos)  $("html, body").scrollTop(window.reCaptchaPos); 
  ;
</script>

这种方法更好地将 reCAPTCHA 垂直居中于 iOS 设备的视口中

【讨论】:

【参考方案3】:

这个解决方案是对https://github.com/google/recaptcha/issues/131的轻微修改

在成功提交验证码时运行的任何函数中添加此条件:

if (window.innerWidth < 768 && (/iPhone|iPod/.test(navigator.userAgent) && !window.MSStream)) 
    document.getElementById("rc-anchor-container").scrollIntoView();

我的修改是“rc-anchor-container”这一行。如果您检查验证码元素的控制台,到目前为止我看到的每个验证码都共享该 ID。这样,当 scrollIntoView() 运行时,它已经在视图中,因此您的页面不会移动。

【讨论】:

以上是关于Google ReCaptcha 在 ios 设备上验证时滚动到页面底部的主要内容,如果未能解决你的问题,请参考以下文章

Google reCaptcha v3 与 google reCaptcha Enterprise

如何将 Google Recaptcha v2 实施到限制访问 Google Recaptcha 的 Web 应用程序

如何在 vuetify 上添加 google recaptcha 3?

如何解决 Google v3 reCaptcha 超时?

Google reCAPTCHA 错误:提供的云项目编号不拥有给定的 reCAPTCHA 密钥

css 将Google Recaptcha显示为#css #recaptcha #center