2009-09-15 86 views
3

使用jQuery ...jQuery和嵌套元素

我希望能够把父DIV,并通过搜索任何内部元件,用于查找任何地方在父元素嵌套在特定的元素。

然后我以这些元素,并通过他们的搜索和基于其数值,禁用/启用不同的元素...

我也想这样做的方式,这样我可以有多个套家长的div允许功能在其内的特定元素相同的方式工作...

所以如果我有...

<div class="parent"> 
    <table> 
     <tr> 
      <td> 
       <input type="text" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="text" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="text" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="submit" /> 
      </td> 
     </tr> 
    </table> 
</div> 

<div class="parent"> 
    <table> 
     <tr> 
      <td> 
       <input type="text" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="text" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="text" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="submit" /> 
      </td> 
     </tr> 
    </table> 
</div> 

任何变化,我做的第一组文本的框将启用/禁用t的提交按钮他第一组......和第二组相同。

现在我有jQuery的设置,使得它的工作原理,如果他们没有嵌套在比设置父div的类SubmitDisable父DIV更远的地方....

$(document).ready(function() { 

    $('.SubmitDisable > input[type=submit]').attr('disabled', 'disabled'); 


    $('.SubmitDisable > input[type=text], input[type=textarea]').keyup(function() { 
     $(this).siblings('input[type=submit]').removeAttr('disabled'); 

     $.each($(this).parent().children('input[type=text], input[type=textarea]'), function() { 
      if ($(this).val() == "") { 
       $(this).siblings('input[type=submit]').attr('disabled', 'disabled'); 
      } 
     }); 

    }); 
}); 

有什么想法?最终,我希望能够使用此jquery的任何页面,并围绕一组文本框并提交按钮,它会导致按钮(s)禁用,如果所有的文本框在同一个“组”未填写。

为了帮助直观了解这个需要的功能我添加的代码假设块,可能对这个

<div class="SubmitDisable"> 
<div><div><div><input type="text" /></div></div></div> 
<div><table><tr><td><div><input type="text" /></div></td></tr></table> 
<span><div><b><input type="text" /></b></div></span> 
<input type="submit" /> 
</div> 

现在说实话那种建立将是可怕的坏测试首先设计......但我并不总是会控制设计。在这种情况下,如果您需要检查3个文本框中的任意一个,确保所有数据都有数据,如果它们都有数据,则启用提交(如果不是其禁用)。

+0

如果您可以在窗体而不是div上执行相同类型的搜索,问题会变得更加简单。你想用div而不是表单吗? – 2009-09-15 18:30:22

+0

是的......每个组都需要在功能 – Patrick 2009-09-15 18:32:02

回答

1

2个字...蛮力......我真的不知道是否有任何其他方式做到这一点...

$(document).ready(function() { 
    $('.SubmitDisable').find('input[type=submit]').attr('disabled', 'disabled'); 
    $('.SubmitDisable').find('input[type=text], textarea').keyup(function() { 
     var objParent = $(this).parent(); 
     while (!($(objParent).attr('class') == 'SubmitDisable')) { 
      var objParent = $(objParent).parent(); 
     } 
     $(objParent).find('input[type=submit]').removeAttr('disabled'); 
     $.each($(objParent).find('input[type=text], textarea'), function() { 
      if ($(this).val() == "") { 
       $(objParent).find('input[type=submit]').attr('disabled', 'disabled'); 
      } 
     }); 
    }); 
}); 

我基本上采取这一目标,并在时光倒流了一个家长,直到我找到了“家长” DIV,然后找到我方式回落...赞扬pixeline暗示发现

如果有人可以找到更好的方法来做到这一点,将不胜感激。

1

OK,因为唯一可以肯定的数据是容器div.parent,一切工作围绕它:

我假设你想禁止提交有关输入组按钮,如果所有这些投入都是空的。

$(document).ready(function() { 
$('.SubmitDisable > input[type=submit]').attr('disabled', 'disabled'); 
$('div.parent input[type="text"], div.parent input[type="textarea"]').keyup(function(){ 

var parent = $(this).parents('div.parent'); 
$('input[type="submit"]',parent).attr('disabled','disabled'); 

    $('input[type="text"], input[type="textarea"]', parent).each(function(){ 
    if ($(this).val() !== "") { 
        $('input[type=submit]',parent).attr('disabled', ''); 
       } 
    }); 

    }); 


    }); 

你可以看到它的工作here(你必须先输入一些东西,然后将其删除,因为代码只运行在KEYUP)

+0

中彼此独立,即使在上面的示例中我也不会工作......假设我在第一个文本框中有一个按键,并在键控上运行该查询,它将在文本框的父级中查找文本框/区域..这将是其直接父级(其td在其中) – Patrick 2009-09-16 14:31:02

+0

我已经相应地修改了我的答案。 – pixeline 2009-09-16 14:49:04

+0

仍然是一个问题...这必须在任何情况下工作...不完全是w /我的桌子。一个文本框可以放在父节点内的表格中的tr中,而提交可以在父节点内,而第二个文本框可以是3节深度。 – Patrick 2009-09-16 14:53:42