jQuery - sélectionnez l'option d'une boîte de sélection à l'aide de la valeur ou le texte avec des options imbriquées dans optgroups

Donc je suis en train d'écrire une application qui nécessite une entrée d'adresse et j'ai un select élément pour l'utilisateur de sélectionner l'état/province. Il a besoin pour soutenir la US et Canada de sorte qu'il est imbriqué optgroups séparer ces et un seul, le premier niveau option car c'est la valeur par défaut. Voici un exemple de base:

<select name="state" id="state">
  <option class="co" value="" data-placeholder="true" disabled selected>Choose your state...</option>
  <optgroup label="United States">
    <option class="co" value="AL">Alabama</option>
    <option class="co" value="AK">Alaska</option>
    <option class="co" value="AZ">Arizona</option>
  </optgroup>
  <optgroup label="Canada">
    <option class="co" value="AB">Alberta</option>
    <option class="co" value="BC">British Columbia</option>
    <option class="co" value="MB">Manitoba</option>
  </optgroup>

Maintenant, j'ai besoin de programmation pour sélectionner l'option qui correspond à l'entrée à partir d'une source externe et je veux vérifier une correspondance basée sur la valeur de l'élément ou de son texte. Quelle que soit l'option est un match devrait être défini comme l'option sélectionnée. Je sais que vous pouvez régler l'option sélectionnée par valeur à l'aide de

$("#state").val(myValue)

et je sais que vous pouvez définir une option basée sur le texte de cette façon

var myText = "The state I want.";
$("#state").children().filter(function() {
  return $(this).text() == myText;
}).prop('selected', true);

Est-il un moyen propre de faire cela sans avoir à courir à travers chaque enfant et de vérifier si c'est un "optgroup" et puis en l'exécutant à travers tous ses enfants afin de vérifier, pour un match? Est-il un moyen facile grâce à jQuery pour combiner la valeur de texte et de méthodes de réglage de l'option sélectionnée?

Une autre complication, je vais faire cela au sein d'un externe plugin jQuery. Au sein de la fonction que j'ai besoin de modifier j'ai le sélectionner l'élément en tant que variable

$element

j'ai donc besoin d'un moyen de le faire un peu comme ce si possible:

$element.descendents(":option").filter(function() {
  //do the selecting here
}).prop('selected', true);
peut-être à l'aide de l'a() de la classe de jquery. api.jquery.com/has
$('#state option').filter(function(){ return $(this).text()===mytext;}).prop('selected', true); ?
Un autre problème, je suis en train de faire cela à l'intérieur d'un plugin jQuery de sorte que la fonction reçoit le sélectionner l'élément en tant que paramètre. J'ai ajouté à cela le fond de la question.

OriginalL'auteur climbak | 2013-07-25