gpt4 book ai didi

javascript - 隐形谷歌 Recaptcha 和 ajax 形式

转载 作者:技术小花猫 更新时间:2023-10-29 12:30:09 25 4
gpt4 key购买 nike

我有一个 ajax 表单:

  <form id="my_form">
<input type="text" id="field1" />
<input type="submit" value="submit" />
</form>

以及js代码:

document.getElementById("my_form").onsubmit = function(e) {
e.preventDefault();

var xhr = new XMLHttpRequest();
//.............. send request to a server

在文档中,它假定表单是普通表单,而不是 ajax。我究竟应该如何将不可见的 reCaptcha 集成到我的 ajax 表单中?例如:

  <form id="my_form">
<input type="text" id="field1" />
<div class="g-recaptcha" data-sitekey="12345" data-callback="????></div>
<input type="submit" value="submit" />
</form>

特别是,我应该为“数据回调”处理程序指定什么?同样,在文档中,它的数据回调提交了一个表单,但是是一个普通的表单,而我的是 ajax。我是否需要“数据回调”?我不应该在我的处理程序中调用 recaptcha 吗?怎么办?

有“呈现”、“getResponse”和“执行”。我应该使用哪一个?从文档中不清楚。

最佳答案

我同意“隐形”recaptcha 文档不够全面。在了解如何使用它之前,我不得不花一些时间深入研究“可见”recaptcha 的代码示例和文档。

先说recaptcha API:

grecaptcha.render(htmlEl, options, inherit) 是在页面上呈现验证码 HTML 的 JS API 方法。默认情况下,recaptcha 脚本将尝试查找具有 class="g-recaptcha 的任何元素并尝试立即呈现,但可以通过附加 ?render=explicit 查询来覆盖此行为recaptcha 脚本 src url 的参数。当您的 recaptcha .g-recaptcha 元素在脚本加载后的某个时间点附加到 DOM 时,您可能还希望使用此 api 按需呈现 recaptcha html。此 api 返回一个 ID 值,可以传递给其他 api 方法,但如果不传递,那些 api 的查找和引用首先在页面上 repcaptcha。

grecaptcha.getResponse(optional_id) 返回 token 。如果 token 为空字符串,则表示用户尚未通过验证,即用户尚未完成验证码挑战。

grecaptcha.execute(optional_id) api 以编程方式按需触发 recaptcha 挑战。此 api 仅适用于“隐形”recaptcha。当用户点击 recaptcha 模块时,会触发可见的 recaptcha 挑战。

grecaptcha.reset(optional_id) 将重置挑战,即每次服务器无法使用 recaptcha api 服务器验证 token 时都必须完成(因为 token 是一次性使用的),但这取决于您实现,您可以决定随时重置。

现在,让我们谈谈数据回调:

data-callback 是一个属性,您可以在其中传递全局命名空间函数的名称,即一些可以作为 window['nameOfFunction'] 访问的函数。每次使用您最终将传递给服务器的 token 值成功验证用户时,都会调用此回调。这与 grecaptcha.getResponse() 返回的 token 相同,因此从技术上讲,您根本不需要此功能。但它可以作为回调,让您知道用户已通过验证,以防您需要更新 UI 或其他内容。

如果出于某种原因您不希望从窗口命名空间访问此回调,您可以在选项对象中将此方法与 callback 键传递给 grecaptcha.render()。注意:options.callback 可以取一个字符串值,相当于在 HTML 中传递 data-callback 属性,即必须是 window 命名空间中的函数。但是 options.callback 也可以采用“函数”值。


现在是一些示例代码:

HTML

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

JS

window.onScriptLoad = function () {
// this callback will be called by recaptcah/api.js once its loaded. If we used
// render=explicit as param in script src, then we can explicitly render reCaptcha at this point

// element to "render" invisible captcha in
var htmlEl = document.querySelector('.g-recaptcha');

// option to captcha
var captchaOptions = {
sitekey: '6Lck',
size: 'invisible',
// tell reCaptcha which callback to notify when user is successfully verified.
// if this value is string, then it must be name of function accessible via window['nameOfFunc'],
// and passing string is equivalent to specifying data-callback='nameOfFunc', but it can be
// reference to an actual function
callback: window.onUserVerified
};

// Only for "invisible" type. if true, will read value from html-element's data-* attribute if its not passed via captchaOptions
var inheritFromDataAttr = true;

// now render
recaptchaId = window.grecaptcha.render(htmlEl, captchaOptions, inheritFromDataAttr);
};

// this is assigned from "data-callback" or render()'s "options.callback"
window.onUserVerified = function (token) {
alert('User Is verified');
console.log('token=', token);
};


// click handler for form's submit button
function onSubmitBtnClick () {
var token = window.grecaptcha.getResponse(recaptchaId);

// if no token, mean user is not validated yet
if (!token) {
// trigger validation
window.grecaptcha.execute(recaptchaId);
return;
}

var xhrData = {
'g-recaptcha-response': token
// more ajax body/data here
};

// proceed with appending more ajax call data to xhrData and then rest of ajax call process
// var xhr = new XMLHttpRequest();
// ... ... .... ... ...
}

关于javascript - 隐形谷歌 Recaptcha 和 ajax 形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42859813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com