更新2
看起来我在使用隐形reCAPTCHA注册的回调(onSubmit函数)中访问文档元素(包括表单)时遇到了问题。更新了以下代码。
在浏览器控制台中,当JS到达" document.getElementById(" info_form")。时,我收到以下错误消息:submit()"打电话给JS:
10:26:47.556 TypeError:document.getElementById(...)。submit不是函数1 selector.php:13:9
启动时图像CAPTCHA正确解决,警告对话框正确显示。但是,我无法在回调中向我的后端明确提交表单。请注意,根据以下链接中的Google说明,我需要按照下面的说明调用preventDefault()。如果我删除它,reCAPTCHA流将被中断。
更新
所以,它看起来像" event.preventDefault();"这是关键路线。如果我拥有它,则显示reCAPTCHA(即图像选择网格),并且我可以与小部件交互。但是,POST参数不会被发送。如果我注释掉preventDefault(),POST会正确进行 - 但是reCAPTCHA流程没有启动。这意味着,当其他POST参数被发送时,重要的reCAPTCHA数据不会被发送,因为根本不执行该流程。
那么,我该怎么做呢?看起来我需要拨打" preventDefault"之前" grecaptcha.execute()"启用reCAPTCHA流程(Google也在其代码段中显示)。但这样做会以某种方式弄乱POST数据。我也明确地调用" document.getElementById(" info_form")。submit()",但没有帮助。任何想法都会很棒。 THX!
此外,谷歌的隐形reCAPTCHA是一个相对较新的构造,仍处于测试阶段。可能是一些核心问题:那。我们经常习惯的是他们常规的reCAPTCHA,我们看到"我不是机器人"复选框。不可见的reCAPTCHA没有第一行的UI小部件 - 只有在你需要的时候才会让你成像CAPTCHA。
原始帖子
我需要你的帮助来弄清楚为什么我的1)按钮onclick =验证功能和2)我的表格POST不能共存。
具体来说,如果我注释掉" document.getElementById(' submit')。onclick = validate"下面,我的表格POST顺利通过。但是,如果我注册验证功能,表单POST不起作用。谷歌告诉我(下面提供的谷歌链接),如果我想在执行隐形reCAPTCHA之前验证输入,我需要调用" grecaptcha.execute();"在按钮onclick事件期间。
所以,我的一般问题是,在执行(或在)按钮onclick = validate函数之后,我如何确保通过POST正常提交info_form,这样我就可以在我的后端PHP?不一定是POST"本身"没有工作 - 但是通过POST提交的参数可能会以某种方式搞砸 - 只是一个想法。
下面的源代码和进一步的代码特定注释。此外,请注意我已经在Google链接中使用了另外两种形式的reCAPTCHA绑定。 " grecaptcha.execute()"变种是唯一一个我遇到麻烦的人。
<?php
include 'msg_recaptcha.php'; // use the debugMessage output
?>
<html>
<head>
<script>
function onSubmit(callbackInput)
{
var message = "g-recaptcha-response token successfully received.\n";
message += "Token = ";
message += callbackInput;
alert(message);
document.getElementById("info_form").submit();
}
function validate(event) {
event.preventDefault();
if (!document.getElementById('firstname').value) {
alert("Please enter name");
} else {
grecaptcha.execute();
}
}
</script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
<form id='info_form' action="invisible_recaptcha_form.php" method="post">
First name: <input id="firstname" name="firstname">
Second name: <input id="secondname" name="secondname">
<div id='recaptcha' class="g-recaptcha"
data-sitekey="<Site key (public) from Google>"
data-callback="onSubmit"
data-size="invisible">
</div>
<button id='submit'>submit</button>
如果我注释掉&#34; onclick = validate&#34;在下面的行中,我的服务器PHP将通过POST接收表单详细信息 - 包括名字。但是,我无法在最终解决方案中对其进行评论,因为我需要运行recaptcha&#34;执行&#34;根据Google的说明https://developers.google.com/recaptcha/docs/invisible在validate()函数中运行。 Google的说明问题在于,他们没有显示如何执行POST以及他们的grecaptcha.execute()要求 - 我需要同时确保来自reCAPTCHA操作的有效负载被发送到POST到我的后端,以便我的后端可以与Google服务器通话以验证reCAPTCHA有效负载。
<script>
document.getElementById('submit').onclick = validate;
</script>
<div id="debugmessage"><?=$debugMessage?> </div>
谢谢大家!
答案 0 :(得分:0)
您必须更改 onSubmit JS函数,以便在重新验证后执行表单提交。
function onSubmit(token) {
alert('thanks ' + document.getElementById('firstname').value);
document.getElementById("info_form").submit();
}
<强>更新强>
当您在onsubmit eventHandler上调用event.preventDefault()
时,您说浏览器默认情况下不执行表单提交,并且您将在需要时执行此操作。
答案 1 :(得分:0)
我可以看到你接受参数进入验证功能
function validate(event) {
event.preventDefault();
if (!document.getElementById('firstname').value) {
alert("Please enter name");
} else {
grecaptcha.execute();
}
但您没有传递任何参数来验证
document.getElementById('submit').onclick = validate
这就是它给你错误的原因。
修改你的验证函数不带参数。我在想你为什么不在任何地方使用验证函数时需要参数?