【问题标题】:New Google reCAPTCHA JavaScript namespace callback新的 Google reCAPTCHA JavaScript 命名空间回调
【发布时间】:2015-03-02 20:08:44
【问题描述】:

我们正在尝试在我们的网站上实现新的 Google reCAPTCHA,但是当我们尝试使用命名空间函数从中加载回调时,回调不会运行。

将回调更改为不使用回调可以正常工作。我们正在使用 Google Maps API 做类似的事情,效果很好。

有没有办法解决这个问题,或者这是新的 Google reCAPTCHA 系统的限制?

代码

<script>
    var namespace = {};
    namespace.captcha = function() {
        alert("Hello world!")
    };
</script>
<script src="//www.google.com/recaptcha/api.js?onload=namespace.captcha&render=explicit" async defer></script>

真正的问题是,我们希望使用显式模块化模式将所有代码封装在命名空间脚本中。解决这个问题的一种方法是创建一个全局变量并将其用作回调,但这并没有退出我所希望的。

全局回调

<script>
    var namespace = {};
    namespace.captcha = (function() {         
        function call() {
            alert("Hello world!")
       };
       window.callback = namespace.captcha.call;   
       return call:call;
    })();
</script>
<script src="//www.google.com/recaptcha/api.js?onload=callback&render=explicit" async defer></script>

【问题讨论】:

  • 是的,看起来他们不允许这样做。
  • “将回调更改为不使用回调可以正常工作”您的意思是不使用命名空间吗?
  • 我遇到了同样的问题,加上我们缩小函数名称的问题,所以我们的全局命名空间函数名称是不可预测的。
  • 使用 有什么问题
  • 我也无法让 recaptcha V2 使用命名空间的模块函数作为回调。

标签: javascript recaptcha captcha


【解决方案1】:

您可以使用Javascript API 来设置回调。

这将允许您使用命名空间回调,甚至在使用框架时使用范围受保护的回调。

我无法测试,举个例子:

var script = document.createElement('script');

script.id = 'container'
script.src = '//www.google.com/recaptcha/api.js?render=explicit';
script.async = true;
script.defer = true;

script.onload = () => { ... };

document.body.appendChild(script);

对于 V3

您的script.onload 函数可能类似于:

grecaptcha.ready(function() {
  namespace.captcha();
});

对于 V2

您的script.onload 函数可能类似于:

grecaptcha.render('container', { 
  callback: namespace.captcha
});

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 2017-10-24
    • 2020-08-17
    • 2010-12-05
    • 2011-12-02
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多