[英]Using a button outside a form to submit form and trigger jQuery validation
[英]jQuery Validation with "formnovalidate" in submit button outside the <form>
我有一个使用 jQuery Validation 插件的编辑表单。 它是 ASP.NET Core 项目的一部分,也使用 ASP.NET 的 Unobtrusive Validation 插件。 该表单有两个提交按钮,发布到服务器端的不同处理程序:
“提交更改”工作正常,但我希望“删除”按钮跳过任何客户端验证。 目前,如果缺少任何必填字段(或任何其他验证条件未通过),它将不会发布表单。
我在“删除”按钮上尝试了 HTML5 formnovalidate
属性,但没有成功。 jQuery Validation 插件中是否有等效功能? 如果不是,您将如何绕过仅针对特定提交按钮的验证?
编辑:
“删除”按钮实际上在<form>
标记之外,但通过form
属性通过 ID 引用表单:
<form id="my-form">
<!-- form fields and submit button here -->
</form>
<button type="submit" form="my-form" noformvalidate asp-page-handler="Delete">
Delete entry
</button>
我发现在<form>
中移动“删除”按钮时, noformvalidate
属性按预期工作。 我真的很想将此按钮保留在<form>
标记之外(由于页面的布局),但如果没有其他方法,我可能可以解决它。
关于如何使它在放置在表单之外时跳过验证的任何想法?
您遇到的问题似乎已在此问题中进行了总结:
典型的保存与提交按钮,其中保存不验证而提交。 保存按钮使用 formnovalidate 属性声明。 唯一的问题是这些按钮在表单本身之外。
看,插件希望提交按钮在您的表单中。 它实际上仍然处理“预防”标志 - cancel
类和formnovalidate
属性 - 在单击处理程序中从按钮传播到表单顶部( source ):
// "this" is jQuery-wrapped HTMLFormElement with validator attaching
this.on( "click.validate", ":submit", function( event ) {
// Track the used submit button to properly handle scripted
// submits later.
validator.submitButton = event.currentTarget;
// Allow suppressing validation by adding a cancel class to the submit button
if ( $( this ).hasClass( "cancel" ) ) {
validator.cancelSubmit = true;
}
// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
validator.cancelSubmit = true;
}
} );
...如果按钮在表单DOM层次结构之外,这显然不起作用,就像你的情况一样。 只有submit.validate
处理程序被触发,但它希望检查validator.cancelSubmit
标志(如果它是真实的,则将其设置为 false)。
想到的一个想法是将您自己的单击处理程序放在将覆盖该标志的Delete
按钮上。 验证器实例可以通过表单 $.data 访问,就像通常使用 jQuery 插件一样:
const validator = $.data(form, 'validator');
也许您正在寻找这样的东西:
var $frm = $('#my-form')
, frm = $frm[0]
, $btnsubmit = $('button[type="submit"]');
frm.addEventListener('submit', (evt) => {
var skipValidation = evt.submitter.hasAttribute('formnovalidate')
, validator = $frm.data('validator');
skipValidation && validator !== undefined
? (validator.cancelSubmit = true)
: ($frm.valid() && $btnsubmit.prop('disabled', true));
})
在这里,我混合使用vanilla JS 和 JQuery,因为并非所有提交事件属性都在 JQuery 中可用,因此不建议使用vanilla JS 访问 JQuery data
。 在这种情况下,无论在哪里声明您的提交按钮,但是......您应该确保在$.validator.unobtrusive.parse(document)
之前执行上述脚本,这意味着在validator.unobtrusive
变得引人注目之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.