gpt4 book ai didi

javascript - 为新的表单字段扩展 jQuery 表单验证脚本

转载 作者:可可西里 更新时间:2023-11-01 12:51:14 26 4
gpt4 key购买 nike

我有一个简单的 HTML 表单,最初是一系列带有是/否单选按钮的问题(A1 到 A5 和 B1 到 B3),如下所示:

<tr>
<td width="88%" valign="top" class="field_name_left">A1</td>
<td width="12%" valign="top" class="field_data">
<input type="radio" name="CriteriaA1" value="Yes">Yes<input type="radio" name="CriteriaA1" value="No">No</td>
</tr>

用户只能回答 A 系列问题或 B 系列问题之一,但不能同时回答这两个问题。此外,他们必须完成 A 或 B 系列中的所有问题。

我现在有一系列额外的问题 - C1 到 C6 - 并且需要扩展我的验证脚本以确保用户输入 A、B 或 C 并回答每个系列中的所有问题。

我的 A 和 B 原始脚本如下所示:

    $(function() {

$("#editRecord").submit(function(){

// is anything checked?
if(!checkEmpty()){
$("#error").html("Please check something before submitting");
//alert("nothing Checked");
return false;
}
// Only A _OR_ B
if(isAorB()){
$("#error").html("Please complete A or B, not both");
//alert("please complete A or B, not both");
return false;
};
// all A's or all B's
if(allAorBChecked()){
$("#error").html("It appears you have not completed all questions");
//alert("missing data");
return false;
};
if(haveNo()){
// we're going on, but sending "type = C"
}
//alert("all OK");
return true;
});
});


function checkEmpty(){
var OK = false;
$(":radio").each(function(){
if (this.checked){
OK = true;
}
});
return OK;
}
function isAorB(){
var OK = false;
var Achecked = false;
var Bchecked = false;
$(":radio").each(function(){
var theChar=this.name.charAt(8);
// if we have an A checked remember it
if(theChar == "A" && this.checked && !Achecked){
Achecked = true;
}
if(Achecked && theChar == "B" && !Bchecked){
if(this.checked){
Bchecked = true;
}
}
if (Achecked && Bchecked){
OK = true;
}
});
return OK;
}
function allAorBChecked(){
var notOK = false;
var Achecked = false;
$(":radio").each(function(){
// skip through to see if we're doing A's or B's
var theChar=this.name.charAt(8);
// check the A's
if(theChar == "A" && this.checked && !Achecked){
Achecked = true;
}

});
if(Achecked){
// set the input to A
$("#type").val("A");
// check _all_ a's are checked
var thisName;
var thisChecked = false;

$(":radio").each(function(){
var theChar=this.name.charAt(8);
var checked = this.checked;
if (theChar == "A"){
if (this.name == thisName && !thisChecked){
// Yes wasn't checked - is No?
if(!checked){
notOK = true;
}
}
thisChecked = checked;
thisName = this.name;
}
});
}else{
// set the input to B
$("#type").val("B");
// check _all_ b's are checked
var thisName;
var thisChecked = false;
$(":radio").each(function(){
var theChar=this.name.charAt(8);
var checked = this.checked;
if (theChar == "B"){
if (this.name == thisName && !thisChecked){
// A wasn't checked - is B?
if(!checked){
notOK = true;
}
}
thisChecked = checked;
thisName = this.name;
}
});
}
return notOK;
}
function haveNo(){
var thisName;
var notOK = false;
$(":radio").each(function(){
var checked = this.checked;
if (this.name == thisName){
//Is this checked
if(checked){
notOK = true;
$("#type").val("C");
}

}
thisName = this.name;
});

return notOK;
}

这很好用,但我完全坚持扩展它以包括 C 系列。我现在必须检查用户是否没有回答任何 A 和 B、A 和 C 以及 B 和 C 问题。我尝试过的一切都无法验证。这是我现在使用我的新脚本所处的位置:

    $(function() {

$("#editRecord").submit(function(){

// is anything checked?
if(!checkEmpty()){
$("#error").html("Please check something before submitting");
//alert("nothing Checked");
return false;
}
// Only A or B or C
if(isAorBorC()){
$("#error").html("Please complete A or B or C, not both");
//alert("please complete A or B, not both");
return false;
};
// all A's or all B's or all C's
if(allAorBorCChecked()){
$("#error").html("It appears you have not completed all questions");
//alert("missing data");
return false;
};
if(haveNo()){
// we're going on, but sending "type = C"
}
//alert("all OK");
return true;
});
});


function checkEmpty(){
var OK = false;
$(":radio").each(function(){
if (this.checked){
OK = true;
}
});
return OK;
}
function isAorBorC(){
var OK = false;
var Achecked = false;
var Bchecked = false;
var Cchecked = false;
$(":radio").each(function(){
var theChar=this.name.charAt(8);
// if we have an A checked remember it
if(theChar == "A" && this.checked && !Achecked){
Achecked = true;
}
if(theChar == "B" && this.checked && !Achecked){
Bchecked = true;
}
if(theChar == "C" && this.checked && !Achecked){
Cchecked = true;
}
if(Achecked && theChar == "B" && !Bchecked){
if(this.checked){
Bchecked = true;
}
}
if(Achecked && theChar == "C" && !Cchecked){
if(this.checked){
Cchecked = true;
}
}
if(Bchecked && theChar == "C" && !Cchecked){
if(this.checked){
Cchecked = true;
}
}
if (Achecked && Bchecked){
OK = true;
}
if (Achecked && CBchecked){
OK = true;
}
if (Bchecked && Cchecked){
OK = true;
}
});
return OK;
}
function allAorBorCChecked(){
var notOK = false;
var Achecked = false;
$(":radio").each(function(){
// skip through to see if we're doing A's or B's
var theChar=this.name.charAt(8);
// check the A's
if(theChar == "A" && this.checked && !Achecked){
Achecked = true;
}

});
if(Achecked){
// set the input to A
$("#type").val("A");
// check _all_ a's are checked
var thisName;
var thisChecked = false;

$(":radio").each(function(){
var theChar=this.name.charAt(8);
var checked = this.checked;
if (theChar == "A"){
if (this.name == thisName && !thisChecked){
// Yes wasn't checked - is No?
if(!checked){
notOK = true;
}
}
thisChecked = checked;
thisName = this.name;
}
});
}elseif{
// set the input to B
$("#type").val("B");
// check _all_ b's are checked
var thisName;
var thisChecked = false;
$(":radio").each(function(){
var theChar=this.name.charAt(8);
var checked = this.checked;
if (theChar == "B"){
if (this.name == thisName && !thisChecked){
// A wasn't checked - is B?
if(!checked){
notOK = true;
}
}
thisChecked = checked;
thisName = this.name;
}
});
}
return notOK;
}

}else{
// set the input to C
$("#type").val("C");
// check _all_ c's are checked
var thisName;
var thisChecked = false;
$(":radio").each(function(){
var theChar=this.name.charAt(8);
var checked = this.checked;
if (theChar == "C"){
if (this.name == thisName && !thisChecked){
// A wasn't checked - is B?
if(!checked){
notOK = true;
}
}
thisChecked = checked;
thisName = this.name;
}
});
}
return notOK;
}
function haveNo(){
var thisName;
var notOK = false;
$(":radio").each(function(){
var checked = this.checked;
if (this.name == thisName){
//Is this checked
if(checked){
notOK = true;
$("#type").val("C");
}

}
thisName = this.name;
});

return notOK;
}

有人看到我做错了什么吗?

最佳答案

首先,我认为最好的可用性是使表单更易于使用,从而更不容易出错。如果您使用的是 javascript 和 jQuery,您也可以将其设置为用户必须先选择一个部分才能选择其中的任何项目。你可以很容易地支持显示所有问题的要求,但允许他们执行不必要的工作(例如错误地填写多个部分)对用户来说是一种损害,而计算机可以很容易地阻止这种情况。

如果您想看看它会是什么样子,请发表评论,我会为您解决一些问题。

与此同时,按照您当前的设计,这里是 a fiddle demonstrating one possible technique .它适用于任意数量的部分。

请查看完整列表的代码,但这里是执行繁重验证的脚本。

function validate(ev) {
var sectionsTouched = $('ol').has(':checked'),
inputs = {},
errorMessage = '';

if (sectionsTouched.length === 0) {
errorMessage = 'Please check something before submitting.';
} else if (sectionsTouched.length > 1) {
errorMessage = 'Please complete only one of sections ' + namesCommaDelimited(seriesNames(), 'or') + '.';
} else {
sectionsTouched.find('input').each(function(i, e) {
var me = $(e), name = me.attr('name');
inputs[name] = !!inputs[name] || me.is(':checked');
});
$.each(inputs, function(k, v) {
if (!v) {
errorMessage = 'Please complete all questions in your selected section.';
}
return v;
});
}
if (errorMessage !== '') {
$('#error').html(errorMessage);
ev.preventDefault();
return false;
}
return true;
}

基本逻辑:如果没有任何部分有选中的项目,则显示相应的消息。如果一个以上的部分有一个检查项目,太多的部分有答案。如果恰好有一个部分有答案,则遍历输入并收集那些检查了相应控件名称的列表。如果存在未选中的任何名称,则某些控制组未选中,并显示相应的消息。

我不得不采取一些自由来构造一个非常适合要求的表单,以便进行适当的演示。这是它的样子:

My demonstration fiddle

希望对您有所帮助!

附言为了完整起见,我想提几个风格方面的考虑:

  • 当您发现自己在重复代码时,请尝试将重复抽象出来——创建一个函数,或声明一个变量。例如,与其多次执行 $('#error').html(),不如设置一个值,然后仅执行一次 html 设置。
  • 尝试编写不 secret 依赖文档结构的代码,例如采用特定格式的表单字段名称(在某个位置具有特定字符)。您的 javascript 严重依赖于返回“A”或“B”的 charAt(8) 函数,这使它变得脆弱——如果其他人(甚至您 future 的自己)不小心破坏了控制名称? javascript 突然中断,两者之间的联系不明显。您可以对其进行编码,这样您甚至不需要知道哪个部分是哪个部分,只要您有一些可以指示每个单独部分的选择器即可。使用类名是可以的,因为 javascript 中的类名显然必须与 html 中的类名相匹配。

关于javascript - 为新的表单字段扩展 jQuery 表单验证脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13502492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com