You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

页面加载时Google reCAPTCHA不显示,刷新后正常的解决求助

解决Google reCAPTCHA首次加载不显示、刷新后正常的问题

看起来你遇到的是Angular vcRecaptcha 组件和reCAPTCHA API加载时序不匹配的问题——首次加载时API还没准备好,组件就已经完成初始化,导致渲染失败;刷新时API可能已经被浏览器缓存,所以能正常加载。下面是具体的解决步骤:

问题根源

你当前直接加载了reCAPTCHA的基础API脚本,没有配合vcRecaptcha要求的显式加载模式。这个组件需要等待reCAPTCHA API完全加载完成后再初始化,否则会因为API未就绪而无法渲染控件。另外你添加的$(window).load自动刷新是临时 workaround,我们可以彻底解决这个问题。

具体解决方案

1. 修正reCAPTCHA API的加载方式

把你当前的reCAPTCHA脚本引用替换成显式加载版本,指定onload回调和render=explicit参数:

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

这个vcRecaptchaApiLoaded回调是vcRecaptcha组件内置的,用来通知组件API已就绪,可以开始渲染控件了。

2. 移除自动刷新的冗余代码

删掉这段临时刷新的脚本,它不是根本解决办法:

<script>
  $(window).load(function () {
    window.location.href=window.location.href
  });
</script>

3. 确认脚本加载顺序

确保你的脚本加载顺序正确,遵循以下顺序:

  • 先加载Angular核心库
  • 再加载angular-recaptcha.js(注意你原代码里的文件名拼写有误,是recaptcha不是rechapcha,如果文件名不对要修正)
  • 最后加载你的app.js
  • reCAPTCHA的API脚本放在Angular之后、组件脚本前后都可以,因为它是异步加载的

4. 修正代码中的小细节

你的控制器里变量名有笔误:respone1和respone2应该是response1和response2,虽然不影响控件显示,但会影响后续获取验证响应,建议修正:

var app = angular.module('plunker', ['vcRecaptcha']);
app.controller('MainCtrl', function($scope ) {
  $scope.name = 'World';
  $scope.response1 = ''; // 修正拼写
  $scope.response2 = ''; // 修正拼写
});

对应的HTML模板里也要同步修改:

<div vc-recaptcha key="'6LdexkAUAAAAAHJjHft19DekOjH0XdNsFjw1mdNm'" ng-model="response1"></div>
<pre>response1 = {{response1 | json}}</pre>
<pre>response2 = {{response2 | json}}</pre>

完整修正后的代码示例

HTML部分

<html ng-app="plunker">
<head>
  <meta charset="utf-8" />
  <title>AngularJS Plunker</title>
  <script>document.write('<base href="' + document.location + '" />');</script>
  <link href="style.css" rel="stylesheet" />
  <!-- 使用显式加载的reCAPTCHA API -->
  <script src="//www.google.com/recaptcha/api.js?onload=vcRecaptchaApiLoaded&render=explicit" async defer></script>
  <script src="angular.js"></script>
  <script src="angular-recaptcha.js"></script> <!-- 修正文件名拼写 -->
  <script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
  <p>Hello {{name}}!</p>
  <div vc-recaptcha key="'6LdexkAUAAAAAHJjHft19DekOjH0XdNsFjw1mdNm'" ng-model="response1"></div>
  <!-- <div vc-recaptcha key="'6LdexkAUAAAAAHJjHft19DekOjH0XdNsFjw1mdNm'" ng-model="response2"></div> -->
  <pre>response1 = {{response1 | json}}</pre>
  <pre>response2 = {{response2 | json}}</pre>
</body>
</html>

JS部分(app.js)

var app = angular.module('plunker', ['vcRecaptcha']);
app.controller('MainCtrl', function($scope ) {
  $scope.name = 'World';
  $scope.response1 = '';
  $scope.response2 = '';
});

这样修改后,reCAPTCHA控件会在API完全加载后再由vcRecaptcha组件初始化,首次加载就能正常显示,不需要手动刷新了。

内容的提问来源于stack exchange,提问作者shami sheikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:50