我尝试使用jQuery验证进行一些表单验证。在表单中,我有一个序列号的textarea,并且textarea用户将粘贴一个特殊格式的序列号,每行一个(如从Excel复制)。我想遍历textarea中的每一行并验证每个序列号是否格式正确。如果没有,抛出错误。如果所有序列号都签出,则允许表单提交。每个序列号的格式为XXXX-XXXX-XXXX-XXXX-XXXX,其中X可以是任何数字或大写字母。
我有这样的工作,整个表单验证按照我想要的方式工作,除了它目前只检查序列号textarea的一行,而不是循环遍历每一行以找到不正确的格式化串行。
这是表单代码(我使用ColdFusion,但为此它不应该重要):
<form name="requestForm" id="requestForm" method="post" action="">
<!-- Serial Numbers -->
<label for="txtSerialNumbers">Serial Numbers
<textarea name="txtSerialNumbers" id="txtSerialNumbers"></textarea>
<!-- Action Buttons -->
<button type="submit" name="addTokens" id="addTokens" >Add Tokens</button>
</form>
这是适用于一行的jQuery Validation代码:
<script>
$(document).ready( function () {
$.validator.addMethod("checkSerials", function(value, element) {
if (/^[0-9A-Z]{4}(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})$/.test(value)) {
return true; // pass when validation is correct
} else {
return false; // fail when validation fails
};
}, "Please enter a valid Serial Number."
);
$('#requestForm').validate( {
rules: {
txtSerialNumbers: {
checkSerials: true
}
}
});
});
</script>
我假设我需要循环,因为我不认为Regex本身可以单独检查textarea的每一行而不循环,或者它可以吗?我还在学习Javascript,所以我不知道应该把循环放在哪里,或者当它到达一个坏的序列号时如何摆脱循环(如果发生故障,解析整个textarea没有意义)第1行。
提前感谢您的建议!
答案 0 :(得分:1)
在验证程序方法中,您可以使用split()
拆分值,然后如果任何行不匹配则返回false。像这样:
$.validator.addMethod("checkSerials", function(value, element) {
var pattern = /^[0-9A-Z]{4}(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})$/;
var allLines = value.split('\n');
foreach (var i = 0; i < allLines.length; i++)
{
if (!pattern.test(allLines[i])
{
return false;
}
}
return true; // pass when validation is correct
}, "Please enter a valid Serial Number."
);
答案 1 :(得分:1)
好的,感谢大家的帮助。特别感谢Stephen对99%的解决方案。只需要进行一些调整,它就像我想要的那样工作:
$.validator.addMethod("checkSerials", function(value, element) {
var pattern = /^[0-9A-Z]{4}(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})(\-[0-9A-Z]{4})$/;
var allLines = $('#txtSerialNumbers').val().split('\n');
for (var i = 0; i < allLines.length; i++)
{
if (!pattern.test(allLines[i]))
{
return false;
}
}
return true; // pass when validation is correct
}, "Please enter a valid Serial Number."
);
答案 2 :(得分:0)
在JavaScript中,您可以使用var lines = $('textarea').val().split('\n')
拆分新行。这会创建一个数组(类似于列表),其中所有行都是&#39; terms&#39;。然后,您可以执行for循环以完成所有这些术语:
$.each(terms, function(index, value) {
// Do regex on value variable here for just the current line
});