2012-02-11 69 views
0
<TD> 
<input type="text" name="name1" size="35" class="mustEnter" /> 
</TD> 

<TD> 
<input type="radio" name="name2" value="val1" class="mustCheck"/> 
<input type="radio" name="name2" value="val2" class="mustCheck"/> 
<input type="radio" name="name2" value="val3" class="mustCheck"/> 
</TD> 

<TD> 
<input type="checkbox" name="name3" value="valA" class="mustCheck"/> 
<input type="checkbox" name="name3" value="valB" class="mustCheck"/> 
<input type="checkbox" name="name3" value="valC" class="mustCheck"/> 
</TD> 

我要测试是否为必填字段(在这种情况下,无线电和复选框)进行了检查,但它不工作。

each()三次通过单选按钮(或复选框)和$(this).length总是1.我想避免按名称测试,因为列表可能很长。解决方案是什么?

valid = true; 
$("#studentForm input.mustEnter, #studentForm input.mustCheck").each(function() { 
    if(($(this).hasClass('mustEnter') && $(this).val() != false) 
    || ($(this).hasClass('mustCheck') && $(this).length > 0)) { 
    $(this).parent().removeClass("errorHighlight"); 
} 
else { 
    $(this).parent().addClass('errorHighlight'); 
    valid = false; 
} 

回答

0

我找到了办法:

正如我有两个班,mustEnter为常规字段并且mustCheck无线电和检查盒中,我使用mustCheck类来获得元素的名称,然后使用该名称来检查是否至少检查了一个组(这种情况下是三个)。我只需要在组中的一个项目中使用mustCheck类。

function validate_v3(frm) { 
    valid = true; 
    $("#studentForm input.mustEnter").each(function() { 
     if ($(this).val() != false) { 
      $(this).parent().removeClass("errorHighlight"); 
      } 
     else { 
      $(this).parent().addClass('errorHighlight'); 
      valid = false; 
      } 
    }); 
    $("#studentForm input.mustCheck").each(function() { 
     elmtName = $(this).attr("name"); 
     if ($("#studentForm input[name='"+elmtName+"']:checked").length > 0) { 
      $(this).parent().removeClass("errorHighlight"); 
      } 
     else { 
      $(this).parent().addClass('errorHighlight'); 
      valid = false; 
      } 
    }); 
    return valid; 
} ; 
3

.each()环内$(this)总是SINGLE dom元素 - 当前元素从主搜索结果的列表中被处理。如果你没有

$('#studentFor input.mustEnter').length 

你会得到所有匹配元素的总数。

+0

我需要检查是否有任何复选框或单选按钮进行了检查,而不是计算所有匹配的元素。 – 2012-02-11 14:27:54

+0

然后使用'$('input.mustEnter:checked').length()'。没有必要自己循环和测试每个单独的元素。 – 2012-02-11 14:47:32

+0

在上面的例子中,如果radio被选中并且复选框不是,'$('input.mustCheck:checked').length()'会给我1,对吧?,如何从​​类中移除'errorHighlight'类选中的一个,并将其添加到另一个? – 2012-02-11 17:25:03

0

.each里面,this是指单个项目,而不是集合。要访问集合,你可能想$(this).parent().length

+0

不,'$(this).parent()'指的是当前元素的父元素。 – gilly3 2012-02-11 04:59:08

+0

这通常是收集,因此可能。 – Joe 2012-02-11 05:00:10

+1

否。一个dom节点总是只有一个父节点,但“document.documentElement”的父节点为空。理解1.)'this'是一个dom节点,2)'$(this)'是一个包含单个节点的新jQuery对象(它对包含相同元素的任何其他jQuery对象一无所知),以及3。 )'.parent()'是一个返回'element.parentNode'的包装器,它是一个单独的元素或者是null。 – gilly3 2012-02-11 05:19:30