我们正在使用Google Recaptcha v3编写表单。表单需要在实际提交之前获取令牌。一位同事编写了此代码,即可正常工作,该表单提交没有任何问题。但是我对为什么会起作用感到困惑?为什么递归调用.submit()函数时,它没有陷入无限循环?
jQuery.fn.extend({
grecaptcha: function (options) {
this.submit(function (e) {
e.preventDefault();
var key = options["recaptcha_site_key"];
var acdata = options["action_data"];
var ele = this;
grecaptcha.execute(key, { action: acdata }).then(function (token) {
$("<input>")
.attr({
type: "hidden",
name: "g-recaptcha-response",
value: token,
}).appendTo($(ele));
ele.submit();
});
});
},
});
$("#formID").grecaptcha(option);
在提交之前是否还有其他更好的方法来请求令牌?
每:https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
此方法与激活表单的Submit类似,但不相同。但是,当直接调用此方法时:
没有引发提交事件。特别是,表单的onsubmit事件处理程序不会运行。
您的代码示例未调用jQuery方法来触发表单上的Submit事件。实际上,这将导致循环。尝试包装ele
变量jQuery。 $(ele).submit ()
应该导致循环。通过不在jQuery对象中包装对this
(e.currentTarget)的引用,而不是调用DOM提交功能,可以在不触发事件或运行处理程序的情况下提交表单。
了解吗?