javascript - 使用ajax同步隐形recaptcha
问题描述
所以我试图弄清楚如何从 Recaptcha 获取令牌或有效响应,然后运行 ajax 调用。有谁知道我怎么能同步做到这一点?
当用户单击提交时,过程将是:
- 能够通过所需的属性和模式验证表单字段
- 获取 Recaptcha 令牌或响应
- 如果 Recaptcha 响应良好,则运行 Ajax
function onSubmit(token) {
grecaptcha.execute()
var response = grecaptcha.getResponse();
return response.length;
}
$('#contact-form').submit(function(event) {
event.preventDefault();
if (onSubmit()) {
jQuery.ajax({
url: "/ipostal-office/send-email.php",
data: $('#contact-form').serialize(),
type: "POST",
complete: function(data) {
console.log(data.responseText);
},
success: function(data) {
// console.log(data);
$('#contact-form').fadeOut();
$('#success').fadeIn();
},
error: function(data) {
console.log(data.responseText);
$('#error').fadeIn();
$('#contact-form').fadeOut();
}
});
}
});
#form-div {
border-radius: 4px;
border: 1px solid #e8e8e8;
padding: 1rem 1rem 1.5rem 1rem;
}
#form-div .hide {
display: none;
text-align: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div id="form-div">
<h2>Contact Us to Learn More</h2>
<div id="success" class="hide">
<p>Your message was sent successfully! </p>
</div>
<div id="error" class="hide">
<p>Something went wrong, <br> try refreshing and submitting the form again.</p>
</div>
<form id="contact-form" action="send-email.php" method="post">
<div class="input-field-div">
<input type="text" id="name" name="name" placeholder=" " minlength='2' pattern="^[a-zA-Z ]*$" title="Only letters and white space allowed" required>
<label for="name">Name*</label>
</div>
<div class="input-field-div">
<input type="text" id="title" name="title" placeholder=" ">
<label for="title">Title</label>
</div>
<div class="input-field-div">
<input type="text" id="company" name="company" minlength='2' placeholder=" " required>
<label for="company">Company*</label>
</div>
<div class="input-field-div">
<input type="text" id="address" name="address" placeholder=" ">
<label for="address">Address</label>
</div>
<div class="input-field-div">
<input type="email" id="email" name="email" placeholder=" " required>
<label for="email">Email*</label>
</div>
<div class="input-field-div">
<input type="tel" id="phone" name="phone" placeholder=" ">
<label for="phone">Phone</label>
</div>
<div class="message-field-div">
<textarea name="message" id="message" rows="7" placeholder=" " minlength='2' required></textarea>
<label for="message">Message</label>
</div>
<div id='recaptcha' class="g-recaptcha" data-sitekey="6LebLMwZAAAAAEGMbnSYotyk9do2pAXL97t0-6C8" data-callback="onSubmit" data-size="invisible"></div>
<button id="submit-btn" type="submit">
Submit <i class="fas fa-paper-plane"></i>
</button>
</form>
</div>
解决方案
如果您调用grecaptcha.execute()
表单submit
事件处理程序,这应该可以工作,并将 AJAX 调用移动到该onSubmit
函数。
表单提交处理程序将阻止实际提交并启动异步 reCAPTCHA。当 reCAPTCHA 响应可用时,它将在表单中插入一个隐藏的输入字段并调用 onSubmit。
function onSubmit(token) {
//Submit via AJAX
alert($('#contact-form').serialize());
}
$('form').submit(function(e) {
event.preventDefault();
grecaptcha.execute();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<form id="contact-form">
<input type="text" name="name" required>
<div id='recaptcha' class="g-recaptcha" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI" data-callback="onSubmit" data-size="invisible"></div>
<button type="submit">Submit</button>
</form>
请注意,由于来源无效,示例在此处嵌入时无法正常工作。
推荐阅读
- r - 如何使用 dplyr 根据另一个逻辑列计算平均值?
- python - 如何将列表中的转换集转换为行
- html - 指向 https://simtelnet.com/mudstealthy.php?option=0 的未知外部链接
- php - Codeception 引导代码中的访问设置
- reactjs - 如何使用 redux 操作更新 d3 图?
- c# - ICU包安装Linux
- json - 如何在 json 文件中显示带有图像的 html 内容?反应
- python - BeautifulSoup,我如何提取不在标签中的所有实例
- r - 有没有办法在for循环中使用ggplot生成pdf并将其保存在R中?
- python - 在 Django 中,如何使用 GET 表单仅更改模板中 url 上的特定参数?