我正在构建一个表单,如果用户在不填写提交的情况下按下提交,我想使用:invalid
选择器为“必需”输入字段提供红色边框,但使用此选项会使它们在正确时突出显示页面加载。在给予他至少一次填充它们的机会之前,向用户发出这种警告似乎是不友好的。
是否有一种方法可以在尝试提交表单后突出显示这些字段,用另一种方式说,是否有办法在单击提交后运行验证(或者至少失去对所需输入字段的关注?)
答案 0 :(得分:7)
我将此方法用于我的项目,因此只有在提交后才会突出显示无效字段:
HTML:
<form>
<input type="email" required placeholder="Email Address">
<input type="password" required placeholder="Password">
<input type="submit" value="Sign in">
</form>
CSS:
input.required:invalid {
color: red;
}
JS(jQuery):
$('[type="submit"]').on('click', function () {
// this adds 'required' class to all the required inputs under the same <form> as the submit button
$(this)
.closest('form')
.find('[required]')
.addClass('required');
});
答案 1 :(得分:5)
非常简单,只需使用#ID:invalid:focus
这仅在关注时进行验证,而不是在页面加载时进行验证
答案 2 :(得分:4)
没有开箱即用。
Mozilla有一个类似于'-moz-ui-invalid'的非常类似的假类。如果你想实现这样的东西,你必须使用约束验证DOM-API:
if(document.addEventListener){
document.addEventListener('invalid', function(e){
e.target.className += ' invalid';
}, true);
}
您还可以使用webshims lib polyfill,它不仅会填充无法使用的浏览器,还会为所有浏览器添加类似-moz-ui-invalid的内容(.form-ui-invalid)。
答案 3 :(得分:2)
另一种方法是在加载JavaScript时向输入添加hide-hints
类。当用户修改字段时,您将删除该类。
然后在CSS中将样式应用于input:not(.hide-hints):invalid
。这意味着将为没有JavaScript的用户显示错误样式。
答案 4 :(得分:1)
旧问题,但是对于那些可能会觉得有用的人:我创建了一个小脚本,在尝试提交表单时为表单添加一个类,以便您可以设置已经尝试过但尚未尝试过的表单。提交方式不同:
window.addEventListener('load', function() {
/**
* Adds a class `_submit-attempted` to a form when it's attempted to be
* submitted.
*
* This allows us to style invalid form fields differently for forms that
* have and haven't been attemted to submit.
*/
function addFormSubmitAttemptedTriggers() {
var formEls = document.querySelectorAll('form');
for (var i = 0; i < formEls.length; i++) {
function addSubmitAttemptedTrigger(formEl) {
var submitButtonEl = formEl.querySelector('input[type=submit]');
if (submitButtonEl) {
submitButtonEl.addEventListener('click', function() {
formEl.classList.add('_submit-attempted');
});
}
}
addSubmitAttemptedTrigger(formEls[i]);
}
}
addFormSubmitAttemptedTriggers();
});
现在尝试提交的表单将获得一个类_submit-attempted
,因此您只能为这些字段指定一个红色框阴影:
input {
box-shadow: none;
}
form._submit-attempted input {
box-shadow: 0 0 5px #F00;
}
答案 5 :(得分:1)
除了@Alexander Farkas的帖子,Dave Rupert在这里还有一个非常可行的解决方案:Happier HTML5 Form Validation。
本质上,它的作用是添加CSS类以形成输入元素,该输入元素仅在用户尝试提交表单后才显示。这是更好的UX,因为这些元素默认情况下不会显示无效的样式,或者当用户通过它们进行制表时也不会显示无效的样式。
在找到此元素之前,我尝试使用:invalid:focus
和其他伪元素对元素进行样式设置,但没有获得理想的效果。尽管我尝试尽可能地使用纯CSS进行样式设计,但这似乎是一个用例,其中高效的JS是切实可行的解决方案。
答案 6 :(得分:1)
我在网站上尝试过此操作
<style id="validation"></style>
<script>
function verify() {
document.getElementById("validation").innerHTML = "input:invalid { border: 1px solid red!important;}input:valid { border: 1px solid green;}";
}
</script>
然后将onclick="verify()"
添加到您的提交按钮,就像这样:
<input type="submit" onclick="verify()">
答案 7 :(得分:0)
要求&#39;验证
方式1 - 设置&#39;必需&#39;表单提交
上每个元素的属性<html>
<head>
<title></title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script>
function Registration() {
$.ajax({
url: "<?php echo base_url() . 'index.php/ravi/get_registration' ?>",
type: 'POST', //the way you want to send data to your URL
success: function (data) {
if (data) {
$("div#view").html(data);
}
}
});
}
function View() {
$.ajax({
url: "<?php echo base_url() . 'index.php/ravi/view' ?>",
type: 'POST', //the way you want to send data to your URL
success: function (data) {
if (data) {
$("div#view").html(data);
}
}
});
}
function Login() {
$.ajax({
url: "<?php echo base_url() . 'index.php/ravi/get_login' ?>",
type: 'POST', //the way you want to send data to your URL
success: function (data) {
if (data) {
$("div#view").html(data);
}
}
});
}
function Logout() {
$.ajax({
url: "<?php echo base_url() . 'index.php/ravi/Logout' ?>",
type: 'POST', //the way you want to send data to your URL
success: function (data) {
if (data) {
$("div#view").html(data);
}
}
});
}
</script>
</head>
<body style="background-color: #99BC99">
<div id="mydiv" align="center">
<a href="javascript:ravi();"><b>Home</b></a>
<a href="javascript:Registration();"><b>Registration</b></a>
<a href="javascript:View();"><b>View Users</b></a>
<a href="javascript:Login();"><b>Login</b></a>
<a href="javascript:Logout();"><b>Logout</b></a>
</div>
<div id="view">
<?php
if ($this->session->flashdata('ravi')) {
echo $this->session->flashdata('ravi');
}
if ($this->session->flashdata('f1')) {
echo $this->session->flashdata('f1');
}
if ($this->session->flashdata('f2')) {
echo $this->session->flashdata('f2');
}
if ($this->session->flashdata('f3')) {
echo $this->session->flashdata('f3');
}
if ($this->session->flashdata('f4')) {
echo $this->session->flashdata('f4');
}
?>
</div>
</body>
</html>
方式2 - 使用&#39;数据&#39;属性
// submit button event
$('#form-submit-btn').click(function(event) {
// set required attribute for each element
$('#elm1, #elm2').attr('required','true');
// since required attribute were not set (before this event), prevent form submission
if(!$('#form')[0].checkValidity())
return;
// submit form if form is valid
$('#form').submit();
});
答案 8 :(得分:0)
您可以通过链接伪类来实现:
<style>
input:required:focus:invalid {
...
}
</style>
这样,仅当该输入字段需要并集中显示时,输入字段才会显示无效的样式。
这是一篇很有帮助的文章:https://alistapart.com/article/forward-thinking-form-validation/
与此有关的另一个堆栈溢出线程:https://stackoverflow.com/a/7921385/11102617