2009-09-15 11 views
3

En utilisant Jquery ...éléments JQuery et imbriqués

Je veux être en mesure de prendre un div parent, et la recherche à travers des éléments internes pour trouver un élément particulier qui pourrait être imbriqué avec PARTOUT dans l'élément parent.

je puis prendre ces éléments et la recherche à travers eux et en fonction de leur valeur, la désactivation/activation élément différent ...

Je veux aussi faire cela d'une manière pour que je puisse avoir plusieurs ensembles de divs parents qui permettent à la fonctionnalité de travailler de la même manière avec les éléments particuliers en son sein ...

donc si je ...

<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> 

Tout changement que je fais dans le premier ensemble de texte boîtes activer/désactiver le bouton de soumission pour t Le premier groupe .. et le même pour le 2ème groupe.

Maintenant, j'ai le jquery réglé pour que cela fonctionne si elles ne sont pas imbriqués plus loin dans que la div parent en définissant la classe de la div parent SubmitDisable ....

$(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'); 
      } 
     }); 

    }); 
}); 

Toute pensée? En fin de compte, je veux être en mesure de prendre n'importe quelle page avec cette jquery sur et mettre un div autour d'un groupe de zones de texte et soumettre des boutons et cela va désactiver le bouton si toutes les zones de texte dans le même "groupe" ne sont pas remplies.

pour aider à visualiser la façon dont cela doit fonctionner, j'ai ajouté un bloc hypothétique de code qui peut être testé contre cette

<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> 

maintenant, honnêtement, ce genre de mise en place serait horriblement mauvais conception en premier lieu ... MAIS je ne vais pas toujours avoir le contrôle de la conception. dans ce cas, si vous tapez sur l'une des trois zones de texte, il doit vérifier que tous ont des données, s'ils ont tous des données, la soumission est activée, sinon elle est désactivée.

+0

Si vous pouvez effectuer le même type de recherche sur un formulaire plutôt que sur un div, le problème devient beaucoup plus simple. Essayez-vous d'utiliser un div au lieu d'un formulaire? –

+0

oui ... chaque groupe doit être indépendant les uns des autres dans la fonctionnalité – Patrick

Répondre

1

2 mots ... force brute ... Je suis vraiment pas sûr s'il y a une autre façon de le faire ...

$(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'); 
      } 
     }); 
    }); 
}); 

Je prends essentiellement cet objet et pas en arrière jusqu'à l'un des parents à la fois jusqu'à ce que je trouve la div « parent », puis de trouver mon redescendre ... bravo à pixeline pour avoir suggéré la trouvaille

Si quelqu'un peut trouver une meilleure façon de faire cela, il serait grandement apprécié.

1

OK, puisque les seules données que le conteneur div.parent, tout travail autour:

Je suppose que vous vouliez désactiver boutons de soumission se rapportant à un groupe d'entrée si toutes ces entrées étaient vides.

$(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', ''); 
       } 
    }); 

    }); 


    }); 

vous pouvez le voir travailler here (vous devez d'abord saisir quelque chose, puis supprimez-le, parce que le code ne fonctionne que sur keyup)

+0

qui ne fonctionnerait pas même dans l'exemple que j'ai ci-dessus ...dis que j'ai une touche dans la première zone de texte et exécute cette requête sur keyup, son va chercher la zone de texte/zone dans le parent de la zone de texte .. qui va être son parent direct (le td son dedans) – Patrick

+0

J'ai révisé ma réponse en conséquence. – pixeline

+0

encore un problème ... cela doit fonctionner sur toutes les circonstances ... pas exactement w/i une table. une zone de texte pourrait être dans un td dans un tr dans une table dans un div à l'intérieur du parent tandis que le soumettre pourrait être juste à l'intérieur du parent alors qu'une deuxième zone de texte pourrait être de 3 divs profonds. – Patrick

Questions connexes