在reCAPTCHA之前的HTML5表单验证

Jul*_*rra 26 html5 recaptcha html5-validation

我集成了新的隐藏reCAPTCHA(v2)框架,该框架默认使用click提交按钮的事件验证用户.但是在内置HTML5表单验证之前触发此事件.我正在寻找一种方法,使其按预期的顺序进行:首先是表单验证,然后是reCAPTCHA.

Jul*_*rra 33

由于采用了新的v2 grecaptcha方法,您必须以编程方式执行此操作:grecaptcha.execute()因此,recaptcha不会替换按钮的默认单击事件,这会阻止默认的HTML5表单验证.

事件路径是:

  1. 提交按钮单击事件:浏览器内置表单验证
  2. 表单提交事件:致电 grecaptcha.execute()
  3. reCAPTCHA回调:提交表单

$('#form-contact').submit(function (event) {
    event.preventDefault();
    grecaptcha.reset();
    grecaptcha.execute();
  });

function formSubmit(response) {
  // submit the form which now includes a g-recaptcha-response input
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js"></script>
<form action="?">
  <div class="g-recaptcha" 
       data-sitekey="your-key"
       data-size="invisible"
       data-callback="formSubmit">
  </div>
  <button type="submit">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 使用此代码,表单将永远不会提交,因为它阻止了默认操作(即提交)。如果你想提交,你不能因为条件而阻止操作,就像我在下面的回答,请检查那里。 (4认同)
  • `formSubmit()` 必须为空?! (3认同)
  • @JulioGuerra 你是对的,但不幸的是它没有使用浏览器验证默认值。我想我的下面有。尝试检查一下。 (2认同)
  • @Black 不一定。[文档说明](https://developers.google.com/recaptcha/docs/display)“用户的响应 g-recaptcha-response 将成为您的回调函数的输入。” 我更改了示例以包含它而不是忽略它(因为一旦验证,您还可以从表单中的隐藏输入中读取它)。 (2认同)

ByS*_*pts 6

这是我获得 HTML5 验证 + Invisible recaptcha 的解决方案:

HTML:

<form id="my-form">
    <!-- Your form fields ... -->
    <div class="g-recaptcha"
        data-sitekey="..."
        data-callback="submitMyForm"
        data-size="invisible">
    </div>
    <button type="submit">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

JS:

var myForm = $('my-form');

function submitMyForm () {
    myForm.trigger('submit', [true]);
}

$(function () {
    myForm.on('submit', function (e, skipRecaptcha) {
        if(skipRecaptcha) {
            return;
        }

        e.preventDefault();
        grecaptcha.execute();
    });
  })
Run Code Online (Sandbox Code Playgroud)


小智 6

您好,这里有一个可行的解决方案。使用隐形 Recaptcha。

jQuery(document).ready(function() {
    var commentform = jQuery("#commentform");
    commentform.on("click", "#submit-comment", function(e) {
      if(commentform[0].checkValidity()) {
        e.preventDefault();
        grecaptcha.execute();
      }
    });
});

function submitCommentForm(data) {
    document.getElementById("commentform").submit();
}
Run Code Online (Sandbox Code Playgroud)
<form action="blaba.php" method="post" id="commentform" class="comment-form">
  <div class="form-submit">
    <div data-callback="submitCommentForm" data-sitekey="yourkey" class="g-recaptcha" data-size="invisible">
    <button id="submit-comment">Leave a comment</button>
  </div>
</form>
Run Code Online (Sandbox Code Playgroud)