2009-11-06 1 views
1

J'essaie d'utiliser jQuery pour vérifier l'existence d'un <option> qui contient une chaîne de texte particulière. Mes tentatives jusqu'ici ne fonctionnent pas comme je m'attends. Voici le code HTML:Vérification de l'existence d'une option avec certain texte

<select> 
    <option value="13">General</option> 
    <option value="3">Innovation</option> 
    <option value="8">Marketing</option> 
    <option value="9">Operations</option> 
    <option value="11">Research</option> 
</select> 

est ici le script:

var topicSelect = $("select"); 
var haveTopic = topicSelect.val("Not Here"); 
alert(haveTopic); 

Je me attends à l'alerte pour voir « undefined » mais il semble redonner l'objet select. Existe-t-il un moyen de vérifier l'existence d'une option sans boucler tout le monde?

Clarifications:

  • chaîne de texte doit être adaptée, pas valeur à
  • la recherche d'une exacte, cas de correspondance sensible
  • peut retourner true/false ou non défini
+0

Voulez-vous la valeur réelle de l'option ou le contenu du texte? –

+0

Je ne sais pas exactement ce que vous voulez faire correspondre - doit-il correspondre complètement? est-ce un match sensible à la casse? Si le code doit faire une correspondance partielle, comment gérez-vous les correspondances qui renvoient deux options différentes? et vous voulez qu'il retourne 'undefined' si aucune correspondance n'est trouvée, true? – artlung

Répondre

1

Je crois que cela devrait trouver ce que vous cherchez:

if ($("option:contains('not here')").length > 1) { } 

La raison pour laquelle votre code d'origine ne fonctionnait pas parce que vous définissez l'attribut de valeur du sélecteur, et il était renvoyer le select car les méthodes jQuery retourneront (presque) toujours l'ensemble de nœuds (dans votre cas généré par "$ ('select')") afin que la méthode puisse être intégrée dans une chaîne.

1

Pour tester une valeur:

var haveTopic = $("select option[value='not here']").length != 0 

Modifier

Pour tester le texte:

var haveTopic = $.inArray('Not Here',$("select").text().replace(/ /g,'').split("\n")) != -1 
+2

Cela trouverait la valeur de "pas ici" - OP cherche le contenu du texte de "pas ici". –

+0

@Mark: Oui @Frank DeRosa a raison. J'ai corrigé la question maintenant, désolé à ce sujet. –

+0

@Alex: Je l'ai réécrit pour tester le texte, voir ci-dessus. – Mark

0

Je n'ai pas regardé comment .filter (fn) est mis en œuvre, mais vous pouvez l'utiliser comme une solution.

$.fn.hasOptionWithText = function(text) { 

    var options = $("option", $(this)).filter(function(){ 
     return $(this).text() === text; 
    }); 

    return options.length > 0; 
}; 


$(document).ready(function() { 
    var hasNotHere = $("select").hasOptionWithText('Not Here'); 
    var hasGeneral = $("select").hasOptionWithText('General'); 

    alert(hasNotHere + ' ' + hasGeneral); 
}); 
Questions connexes