新的Google reCAPTCHA JavaScript命名空间回调

Tob*_*oby 13 javascript captcha recaptcha

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

将回调更改为不使用回调可以正常工作.我们正在使用谷歌地图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>
Run Code Online (Sandbox Code Playgroud)

问题实际上是我们希望使用揭示模块化模式将所有代码保存在命名空间脚本中.解决这个问题的方法是创建一个全局变量并将其用作回调,但它并没有放弃我所希望的.

全球回调

<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>
Run Code Online (Sandbox Code Playgroud)

Gat*_*ico 2

您可以通过使用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);
Run Code Online (Sandbox Code Playgroud)

对于V3

你的script.onload函数可能是这样的:

grecaptcha.ready(function() {
  namespace.captcha();
});
Run Code Online (Sandbox Code Playgroud)

对于V2

你的script.onload函数可能是这样的:

grecaptcha.render('container', { 
  callback: namespace.captcha
});
Run Code Online (Sandbox Code Playgroud)