使用JavaScript submit() 函数时如何运行 HTML5 表单验证?
How to run HTML5 form verification when using JavaScript submit() function?
当有这样的输入时:
<form action="go" method="post">
<input name='submitthingy' required>
</form>
它应该只有在字段被填写时才能提交。当我使用这样的提交按钮时这有效:
<button type='submit'>Click Me</button>
它会出现一个小弹出窗口,要求填写该字段。但是,当我用 javascript 提交时,像这样:
document.querySelector('form').submit();
它提交发件人但不验证该字段是否已先填写。我应该怎么做?
尝试调用提交按钮的点击操作而不是表单的提交操作:
document.getElementsByTagName("button")[0].click();
你可以给按钮一个id然后调用
document.getElementById("btnsubmit").点击()
如果您不希望显示按钮,请添加显示 none。
<button id='btnsubmit' type='submit' style='display:none;'>Click Me</button>
处理此问题的 JavaScript 方法是使用 constraint validation API 在用户与之交互时检查每个字段,然后在表单提交时再次检查。
使用 keyUp
事件侦听器监视每个字段的更改以检查其有效性,然后使用 submit
事件侦听器在发送前再次检查每个字段的值。下面我创建了一个示例,无耻地从链接的 MDN 页面中提取并仅进行了轻微编辑。
您的表单可能如下所示:
<!-- form disables HTML validation -->
<form novalidate>
<label for='submitthingy'>
<!-- input field and error span are in the same label -->
<input id='submittable' name='submitthingy' required>
<!-- error to be called by JavaScript -->
<span class='error' aria-live='polite'></span>
</label>
<button type='submit'>Click Me</button>
</form>
你的 JS 是这样的:
var form = document.getElementsByTagName('form')[0];
var submitthingy = document.getElementById('submittable');
var error = document.querySelector('.error');
// One of these for each field, or you could DRY it up somehow
email.addEventListener("keyup", function (event) {
if (submitthingy.validity.valid) {
error.innerHTML = "";
error.className = "error";
}
}, false);
form.addEventListener("submit", function (event) {
if (!submitthingy.validity.valid) {
error.innerHTML = "This field is not valid per CSS pseudo class!";
error.className = "error active";
event.preventDefault();
}
}, false);
然后您可以使用 CSS 设置错误消息的样式以默认隐藏它们,然后应用基于 class(es) error active
.
的样式
根据我的评论说明 API:
var myform = document.getElementById('myform');
var fields = myform.querySelectorAll('input,textarea,select');
var test = document.getElementById('test');
test.addEventListener('click', function(evt) {
var valid = Array.prototype.every.call(fields, function(field) {
return field.checkValidity();
});
test.style.backgroundColor = valid ? "green" : "red";
});
<form id="myform">
<p>
<label for="dog">Dog:</label>
<input pattern="Dog" id="dog" name="dog">
</p>
</form>
<button id="test">Test</button>
当有这样的输入时:
<form action="go" method="post">
<input name='submitthingy' required>
</form>
它应该只有在字段被填写时才能提交。当我使用这样的提交按钮时这有效:
<button type='submit'>Click Me</button>
它会出现一个小弹出窗口,要求填写该字段。但是,当我用 javascript 提交时,像这样:
document.querySelector('form').submit();
它提交发件人但不验证该字段是否已先填写。我应该怎么做?
尝试调用提交按钮的点击操作而不是表单的提交操作:
document.getElementsByTagName("button")[0].click();
你可以给按钮一个id然后调用 document.getElementById("btnsubmit").点击()
如果您不希望显示按钮,请添加显示 none。
<button id='btnsubmit' type='submit' style='display:none;'>Click Me</button>
处理此问题的 JavaScript 方法是使用 constraint validation API 在用户与之交互时检查每个字段,然后在表单提交时再次检查。
使用 keyUp
事件侦听器监视每个字段的更改以检查其有效性,然后使用 submit
事件侦听器在发送前再次检查每个字段的值。下面我创建了一个示例,无耻地从链接的 MDN 页面中提取并仅进行了轻微编辑。
您的表单可能如下所示:
<!-- form disables HTML validation -->
<form novalidate>
<label for='submitthingy'>
<!-- input field and error span are in the same label -->
<input id='submittable' name='submitthingy' required>
<!-- error to be called by JavaScript -->
<span class='error' aria-live='polite'></span>
</label>
<button type='submit'>Click Me</button>
</form>
你的 JS 是这样的:
var form = document.getElementsByTagName('form')[0];
var submitthingy = document.getElementById('submittable');
var error = document.querySelector('.error');
// One of these for each field, or you could DRY it up somehow
email.addEventListener("keyup", function (event) {
if (submitthingy.validity.valid) {
error.innerHTML = "";
error.className = "error";
}
}, false);
form.addEventListener("submit", function (event) {
if (!submitthingy.validity.valid) {
error.innerHTML = "This field is not valid per CSS pseudo class!";
error.className = "error active";
event.preventDefault();
}
}, false);
然后您可以使用 CSS 设置错误消息的样式以默认隐藏它们,然后应用基于 class(es) error active
.
根据我的评论说明 API:
var myform = document.getElementById('myform');
var fields = myform.querySelectorAll('input,textarea,select');
var test = document.getElementById('test');
test.addEventListener('click', function(evt) {
var valid = Array.prototype.every.call(fields, function(field) {
return field.checkValidity();
});
test.style.backgroundColor = valid ? "green" : "red";
});
<form id="myform">
<p>
<label for="dog">Dog:</label>
<input pattern="Dog" id="dog" name="dog">
</p>
</form>
<button id="test">Test</button>