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

在Nuxt3中无外部库使用Google ReCAPTCHA v3遇onSubmit函数找不到问题

Nuxt3 无外部库使用Google ReCAPTCHA:解决"找不到onSubmit函数"问题

问题根源很明确:<script setup> 里定义的函数属于模块局部作用域,不会自动挂载到全局 window 对象上,而Google ReCAPTCHA是从全局作用域查找指定的回调函数的,所以会触发找不到函数的错误。

以下是具体的解决步骤:

1. 将回调函数挂载到全局window对象

在<script setup>中,把你的提交逻辑函数挂载到window上,让ReCAPTCHA能访问到:

import { onUnmounted } from 'vue'

// 定义实际的登录处理逻辑
const handleLogin = () => {
  // 这里写你的表单验证、登录请求逻辑
  console.log('执行登录操作')
}

// 将回调函数挂载到全局window
window.onSubmit = () => {
  handleLogin()
}

// 组件卸载时清理全局函数,避免内存泄漏
onUnmounted(() => {
  delete window.onSubmit
})

2. 确保脚本加载顺序正确

如果是动态加载ReCAPTCHA脚本,要先挂载全局函数,再加载脚本,避免脚本加载完成时回调函数还未全局可用:

import { onMounted, onUnmounted } from 'vue'

onMounted(() => {
  // 先挂载全局回调
  window.onSubmit = () => {
    // 你的业务逻辑
  }

  // 再加载ReCAPTCHA脚本
  const script = document.createElement('script')
  script.src = 'https://www.google.com/recaptcha/api.js'
  script.async = true
  script.defer = true
  document.head.appendChild(script)
})

onUnmounted(() => {
  delete window.onSubmit
})

3. 检查按钮的回调属性设置

模板里的提交按钮,data-callback属性必须是字符串形式的函数名,不能用Vue的绑定语法传递函数对象:

<!-- 正确写法 -->
<button 
  class="g-recaptcha"
  data-sitekey="你的ReCAPTCHA Site Key"
  data-callback="onSubmit"
>
  登录
</button>

<!-- 错误写法:不要用:data-callback绑定函数 -->
<!-- <button :data-callback="onSubmit">登录</button> -->

内容的提问来源于stack exchange,提问作者morteza mortezaie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:10:20