【发布时间】:2018-05-31 09:23:01
【问题描述】:
我正在处理表单验证我想一次验证基于 attr(type) 的字段,所有文本字段都应该被验证。像这样,我要验证
例子
if($(myForm + " input").attr("type") == "email") {
// Validate Email Here
}
我的代码工作正常,但是如果我再添加一个额外的字段,我将无法进行多重验证。谁能帮助我如何进行验证,如上所述 任何帮助将不胜感激
var Validator = function(form) {
this.form = $(form);
var Elements = {
name: {
selector: $('input[type=text]'),
reg: /^[a-zA-Z]{2,20}$/
},
email: {
selector: $('input[type=email]'),
reg: /^[a-z-0-9_+.-]+\@([a-z0-9-]+\.)+[a-z0-9]{2,7}$/i
},
message: {
selector: $('textarea'),
reg: /^\s+$/
}
};
var handleError = function(element, message) {
element.addClass('input-error');
var $err_msg = element.parent('div');
var error = $('<div class="error"></div>').text(message);
error.appendTo($err_msg);
element.keyup(function() {
$(error).fadeOut(1000, function() {
element.removeClass('input-error');
});
});
};
this.validate = function() {
this.form.submit(function(e) {
for (var i in Elements) {
var type = i;
var validation = Elements[i];
switch (type) {
case 'name':
if (!validation.reg.test(validation.selector.val())) {
handleError(validation.selector, 'Not a valid name.');
}
break;
case 'email':
if (!validation.reg.test(validation.selector.val())) {
handleError(validation.selector, 'Not a valid e-mail address.');
}
break;
case 'message':
if (validation.reg.test(validation.selector.val()) || validation.selector.val() == '') {
handleError(validation.selector, 'Message field cannot be empty.');
}
break;
default:
break;
}
}
e.preventDefault();
});
};
};
var validator = new Validator('#test');
validator.validate();
body {
background: #fff;
color: #333;
font: 76% Verdana, sans-serif;
}
form {
margin: 1em 0 0 2em;
width: 90%;
}
fieldset {
margin: 0;
border: 1px solid #ccc;
padding-bottom: 1em;
}
legend {
font-weight: bold;
text-transform: uppercase;
}
label {
float: left;
width: 5em;
padding-right: 2em;
font-weight: bold;
}
div {
margin-bottom: 30px;
}
input {
font: 1em Verdana, sans-serif;
}
fieldset ul li input {
float: left;
width: 120px;
border: 1px solid #ccc;
}
textarea {
width: 300px;
height: 200px;
border: 1px solid #ccc;
font: 1em Verdana, sans-serif;
}
form p {
margin: 0;
padding: 0.4em 0 0 7em;
}
form p input {
background: #666;
color: #fff;
font-weight: bold;
}
div.error {
clear: left;
margin-left: 5.3em;
color: red;
padding-right: 1.3em;
height: 100%;
padding-bottom: 0.3em;
line-height: 1.3;
}
.input-error {
background: #ff9;
border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="#" method="post" id="test">
<fieldset>
<legend>Contact information</legend>
<div>
<label for="name">Name:</label>
<input type="text" name="name" id="name" />
</div>
<!--<div>
<label for="lastname">LastName:</label>
<input type="text" name="lastname" />
</div>-->
<div>
<label for="email">Email:</label>
<input type="email" name="email" id="email" />
</div>
<div>
<label for="message">Message:</label>
<textarea id="message" name="message" cols="30" rows="15"></textarea>
</div>
<p><input type="submit" name="send" id="send" value="Send" /></p>
</fieldset>
</form>
【问题讨论】:
-
您不应该循环遍历表单字段而不是验证器吗?按照您现在的方式,您只能拥有与 Elements 对象中的元素一样多的字段(当前为 3 个)。您应该改为遍历表单字段并将它们中的每一个传递给验证器(可能需要稍微重写)。
-
@cjs1978 谢谢你能帮我怎么做我是 jquery 的新手。实际上,我尝试了很多方法但没有运气。如果您需要完全更改代码也没有问题,但条件将是我上面提到的。
-
您可以使用类似 $("form#test input").each(function(field){/* 在这里验证“field”的值 - 您可以使用 $ (field).attr("type") 获取类型,$(field).val() 获取值等 */})
-
@cjs1978 我在问题中尝试了上述条件,但无法实现。你能重写我上面的代码吗?
-
不,我不能(现在没有时间)。但从概念上讲,您应该想象您的表单可能有 100 个字段(原则上它们可以是同一类型(即所有“名称”字段)或混合类型)。然后,遍历字段,并为每个字段检查字段的类型,选择正确的验证方法(基于类型),并相应地验证字段的值。您可能需要稍微重构一下现有代码。
标签: javascript jquery html validation