2010-09-03 63 views
1

我有与多个控件关联的标注标签,当它们中的任何一个都出错时应该变为红色。jquery为特定类型的儿童设置类

<tr> 
    <th> 
     <asp:Label for="test">jquery will make my class as updnValidationErrorLabel</asp:Label> 
    </th> 
    <td > this text is right 
     <asp:TextBox class='textboxWide taskListCheckPreVital' /> 
    </td> 
    <td>this is wrong text hence it has updnValidationErrorInput 
     <asp:TextBox class='dummyclass updnValidationErrorInput'/></td> 

</tr> 
​ 

我想这种做法,但不知道为什么mainparent儿童元素不带班updnValidationErrorInput

//if my sturcture has updnValidationErrorInput 
$('.updnValidationErrorInput').each(function() { 
    // go to tr element 
    var mainParent = $(this).parents('tr:first'); 
    // under tr element find updnValidationErrorInput 
    if(mainParent.children('.updnValidationErrorInput').length > 0){ 
    // set label which has for attribute with updnValidationErrorLabel 
    mainParent.children('label').attr('for').removeClass().addClass('updnValidationErrorLabel');   
    } 
}); 

任何帮助将不胜感激显示。

+0

请格式化代码。 – AMIT 2010-09-03 23:59:15

+0

-1表示格式不正确,代码不可读。 – 2010-09-04 00:01:03

+0

没有-1票。 – 2010-09-04 00:53:04

回答

0

既然你从来<input>.length检查必须是真实的,所以你可以删除它们。你可以缩短它归结为这个总:

$('.updnValidationErrorInput').each(function() { 
    $(this).cloesest('tr').find('label[for]') 
      .removeClass().addClass('updnValidationErrorLabel'); 
}); 

而不是.parents('tr:first')可以使用当量(便宜).closest(),然后找到任何<label>元素与for=""属性,并改变它们的类。

+0

嗨尼克,'.parents()'和'最接近()'之间的区别是什么? – 2010-09-04 06:00:32

+0

@Avinash - '.parents()'抓取所有的父母,然后*过滤*如果给定一个选择器,给它一个':first'使它成为第一个,因为它们是按照向上的DOM顺序。 '.closest()'抓取DOM并在找到选择器匹配时立即停止,在这种情况下结果相同,效率更高。父母越多,'.closest()'节省的成本就越多。 – 2010-09-04 09:42:47

+0

感谢尼克,它工作。 – user420054 2010-09-07 19:47:21