返回

Nuxt reCAPTCHA 集成:如何解决页面冻结问题?

vue.js

修复 Nuxt 中 reCAPTCHA 集成引起的页面冻结问题

问题简介

当使用 Google 的 reCAPTCHA 与 Nuxt 应用程序中的模态窗口结合时,可能会出现一个问题,导致当用户在未完成 reCAPTCHA 验证的情况下点击模态窗口外部时,reCAPTCHA 小部件卡在加载状态,导致页面冻结。

解决方法

为了解决这个问题,请遵循以下步骤:

  • 使用正确的 reCAPTCHA 版本: 确保您使用的是隐形 reCAPTCHA v2,它设计为无需可见按钮或复选框即可使用。

  • 正确放置 reCAPTCHA: 将 reCAPTCHA 脚本标记放置在 结束标记之前。

  • 处理 reCAPTCHA 错误情况: 在您的 Vue 组件中,处理 "onRecaptchaError" 和 "onRecaptchaExpired" 事件,并向用户显示错误消息。

  • 禁用 reCAPTCHA 时模态关闭: 当模态关闭时,使用 "recaptcha-execute" 指令禁用 reCAPTCHA 小部件。

  • 使用正确的事件侦听器进行模态关闭: 与其在模态容器上使用点击事件,不如使用 "onEscape" 事件侦听器来处理模态关闭。

  • 检查 reCAPTCHA 状态: 在提交表单之前,检查是否已成功检索 reCAPTCHA 令牌。如果没有,请向用户显示错误消息。

代码示例

<template>
  <div>
    <form @submit.prevent="onSubmit">
      <recaptcha @recaptcha-error="onRecaptchaError" @recaptcha-expired="onRecaptchaExpired" />
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

<script>
  export default {
    mounted() {
      this.$recaptcha.init()
    },
    methods: {
      onRecaptchaError() {
        this.$emit('recaptcha-error')
      },
      onRecaptchaExpired() {
        this.$emit('recaptcha-expired')
      },
      onSubmit() {
        // Check if reCAPTCHA token has been retrieved
        if (this.$recaptcha.token) {
          // Submit form
        } else {
          // Display error message
        }
      },
    },
  }
</script>

常见问题解答

  1. 为什么使用隐形 reCAPTCHA v2?
    隐形 reCAPTCHA 无需用户交互即可验证人类性,从而提供了更好的用户体验。

  2. 为什么需要处理 reCAPTCHA 错误?
    当 reCAPTCHA 出错时,向用户提供明确的错误消息非常重要,以便他们了解问题并采取措施。

  3. 为什么禁用 reCAPTCHA 时模态关闭?
    禁用 reCAPTCHA 可以防止在用户单击模态外部时触发加载状态,从而防止页面冻结。

  4. 为什么使用 "onEscape" 事件侦听器进行模态关闭?
    "onEscape" 事件侦听器确保当用户按 "Esc" 键关闭模态时,reCAPTCHA 小部件被禁用。

  5. 为什么需要检查 reCAPTCHA 状态?
    在提交表单之前检查 reCAPTCHA 状态可确保用户已完成 reCAPTCHA 验证,从而防止提交无效的表单。