2017-05-19 4 views
1

J'ai ce genre de blocs html:Sélectionnez élément enfant à partir des données parent attributs valeur

<div data-target="TargeID" data-action="toggle" data-trigger="Yes"> 
    ... 

    <ul> 
     <li> 
      <label class="radio"> 
      <input id="cpMainContent_ctl24_rptAnswers_rbAnswer_0" type="radio" name="cpMainContent_ctl24" value="ctl00$cpMainContent$ctl24$rptAnswers$ctl01$rbAnswer"> 
      Yes    
      </label> 
     </li> 

     <li> 
      <label class="radio"> 
      <input id="cpMainContent_ctl24_rptAnswers_rbAnswer_1" type="radio" name="cpMainContent_ctl24" value="ctl00$cpMainContent$ctl24$rptAnswers$ctl02$rbAnswer"> 
      No    
      </label> 
     </li> 

     <li> 
      <label class="radio"> 
      <input id="cpMainContent_ctl24_rptAnswers_rbAnswer_2" type="radio" name="cpMainContent_ctl24" value="ctl00$cpMainContent$ctl24$rptAnswers$ctl03$rbAnswer"> 
      maybe    
      </label> 
     </li> 
    </ul> 
</div> 

J'ai besoin de sélectionner chaque entrée à l'intérieur des éléments avec data-action="toggle"

et Im en utilisant ce sélecteur jQuery: $('[data-action="toggleQuestions"] :input');

mais j'ai besoin de sélectionner les entrées dont la valeur text est égale à la valeur parente data-trigger.

Est-il possible directement avec un sélecteur?

+0

Pourquoi at-il besoin d'être directement avec un sélecteur? Vous ne pouvez pas utiliser un appel 'filter'? – Jamiec

+0

@Jamiec je me demandais s'il y avait une façon plus concise de le faire – giammin

Répondre

3

La logique est trop complexe à mettre en un seul sélecteur. Au lieu de cela, vous pouvez utiliser filter() pour trouver les éléments :input, puis faire correspondre le text() de leur parent label à la valeur data-trigger sur le conteneur. Essayez ceci:

var $container = $('[data-action="toggle"]'); 
 
var $input = $container.find(':input').filter(function() { 
 
    return $(this).closest('label').text().trim() == $container.data('trigger'); 
 
}) 
 

 
$input.prop('checked', true);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div data-target="TargeID" data-action="toggle" data-trigger="Yes"> 
 
    <ul> 
 
    <li> 
 
     <label class="radio"> 
 
     <input id="cpMainContent_ctl24_rptAnswers_rbAnswer_0" type="radio" name="cpMainContent_ctl24" value="ctl00$cpMainContent$ctl24$rptAnswers$ctl01$rbAnswer"> 
 
     Yes    
 
     </label> 
 
    </li> 
 
    <li> 
 
     <label class="radio"> 
 
     <input id="cpMainContent_ctl24_rptAnswers_rbAnswer_1" type="radio" name="cpMainContent_ctl24" value="ctl00$cpMainContent$ctl24$rptAnswers$ctl02$rbAnswer"> 
 
     No    
 
     </label> 
 
    </li> 
 
    <li> 
 
     <label class="radio"> 
 
     <input id="cpMainContent_ctl24_rptAnswers_rbAnswer_2" type="radio" name="cpMainContent_ctl24" value="ctl00$cpMainContent$ctl24$rptAnswers$ctl03$rbAnswer"> 
 
     maybe    
 
     </label> 
 
    </li> 
 
    </ul> 
 
</div>

+0

merci, c'était la route que j'essayais mais j'espérais qu'il y avait une syntaxe de sélecteur comme '' '$ ('[data-action =" toggleQuestions "]: entrée: valeur = [data-trigger]')' '' – giammin

0

utiliser le code ci-dessous

$('[data-action="toggle"]').each(function() { 
    var triggerValue = $(this).attr("data-trigger"); 

    $(this).find('input[type=radio]').each(function() { 
     if ($(this).parent().text().trim() === triggerValue) { 
      $(this).prop("checked", true); 
     } 
    }); 
}); 
+1

La valeur de déclenchement est le texte de 'label'. Ce n'est pas la «valeur» de la radio que votre code utilise –

+0

La réponse a été mise à jour avec le changement. –