2009-09-15 88 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