2009-08-28 11 views
4

J'essaie d'utiliser les parents/frères de jquery pour trouver des éléments d'entrée particuliers, mais je n'arrive pas à le comprendre.Naviguer dom en utilisant jquery pour obtenir des éléments spécifiques

J'ai le code HTML suivant:

<div id="ExtrasOptions"> 
<div class="selectItem"> 
    <div class="selectPrice"><span>Qty: <input name="qty" type="text" value="0" maxlength="2" id="qty" class="AccessoryQuantity" /></span></div> 
    <div class="selectIt"><span><input name="extraselected" type="checkbox" id="extraselected" value="9" /><label for="extrasID">Add this</label></span></div> 
</div> 
<div class="selectItem"> 
    <div class="selectPrice"><span>Qty: <input name="qty2" type="text" value="0" maxlength="2" id="qty2" class="AccessoryQuantity" /></span></div> 
    <div class="selectIt"><span><input name="extraselected2" type="checkbox" id="extraselected2" value="9" /><label for="extrasID">Add this</label></span></div> 
</div> 
</div> 

Q1: Quand quelqu'un cochée une case à cocher Je veux la zone de texte dans le même div.selectItem d'avoir un « 1 » mis. Si elles décochent la case, je veux que la valeur soit supprimée.

Q2: Je souhaite également que la case à cocher soit cochée si une valeur est entrée dans la zone de texte et non cochée si la zone de texte est vide.

Merci pour votre aide.

Répondre

4

Quelque chose comme ça devrait fonctionner. (Non testé pour la syntaxe précise, mais l'algorithme est solide.)

// Bind an event to each of your checkboxes, for when they are clicked 
$("input[type=checkbox]").click(function() { 
    if ($(this).attr("checked")) { 
    // The checkbox is checked, so find the associated text input and change its value 
    $(this).parents(".selectItem").find("input[type=text]").val("1"); 
    } else { 
    // The checkbox is unchecked, so find the associated text input and remove its value 
    $(this).parents(".selectItem").find("input[type=text]").val(""); 
    } 
}); 

// Bind an event to each of your text inputs, for when they have text entered into them 
$("input[type=text]").keypress(function() { 
    if ($(this).val() != "")) { 
    // There is something in the text input box, so check the associated checkbox 
    $(this).parents(".selectItem").find("input[type=checkbox]").attr("checked","checked"); 
    } else { 
    // There is nothing in the text input box, so uncheck the associated checkbox 
    $(this).parents(".selectItem").find("input[type=checkbox]").attr("checked",""); 
    } 
}); 
+0

Cela ne fonctionne pas du tout, $ (this) .parent () se réfère à une envergure, vous devez monter deux niveaux et obtenir le prochain frère de la div. – karim79

+0

Comme je l'ai dit, l'algorithme est solide, et parfaitement une réponse parfaitement appropriée à cette question. –

+0

Je pense qu'il me manque quelque chose ici. Si j'essaie votre code pour les cases à cocher rien ne se passe. Si vous utilisez $ (this) .parents(), je peux obtenir la valeur pour aller dans la zone de texte mais, évidemment, elle entre la valeur dans toutes les zones de texte. Des idées comment avoir la valeur entrer dans la bonne zone de texte? Merci de votre aide! –

1

Cela fonctionne avec votre balisage (testé):

$(document).ready(function() { 
    $('input:checkbox').change(function() { 
     if($(this).is(':checked')) { 
      $(this).val('1'); 
     } else { 
      $(this).val(''); 
     } 
    }); 

    $('input[type=text]').keyup(function() { 
     if($(this).val() != "") { 
      $(this).parent() 
        .parent() 
        .next('.selectIt') 
        .find('span > input:checkbox') 
        .attr('checked','checked') 
        .val('1'); 
     } else { 
      $(this).parent() 
        .parent() 
        .next('.selectIt') 
        .find('span > input:checkbox') 
        .removeAttr('checked') 
        .val(''); 
     } 
    }); 
}); 
Questions connexes