Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery: Setting select list 'selected' based on text, failing strangely

I have been using the following code (with jQuery v1.4.2) to set the 'selected' attribute of a select list based on its 'text' description rather than its 'value':

$("#my-Select option[text=" + myText +"]").attr("selected","selected") ; 

This code worked fine, until I noticed one select list on which it failed, depending on the text that was being matched. After some hair-pulling I realized that it was failing only in cases where the text was a single word (no spaces, no non-alpha characters). (All of my previous uses of this code had worked fine with select lists comprised solely of multi-word chemical names.)

For example, within the one select list, it worked fine with:
pharbitic acid
25-D-spirosta-3,5-diene
pogostol (#Pogostemon#)

It failed with:
glucose
adenine

I have tried any way I could think of to surround the text variable with quotes (both single and double) to no avail. (But why should a single word need quotes when a two word phrase does not?)

I have tried hard coding the text in there and had the same result.

This works:

$("#constituent option[text=#a#-allocryptopine]").attr('selected', 'selected'); 

This works:

$("#constituent option[text=5-O-methylrisanrinol]").attr('selected', 'selected'); 

This did not work:

$("#constituent option[text=adenine]").attr('selected', 'selected'); 

I tried hard coding quotes. This did not work:

$("#constituent option[text='glucose']").attr('selected', 'selected'); 

I could not get hard coded quotes (single or double) to work with any text at all.

It's worth noting that quotes are acceptable when using the 'value' attribute. E.g., both of these work fine:

$("#constituent option[value='3']").attr('selected', 'selected');  $("#constituent option[value=3]").attr('selected', 'selected'); 

Below is some code to demonstrate the problem. Two select lists, the first of which is comprised of simple words, the second of two word phrases. When the page loads it tries to set the value of each select list. The jQuery code works for the second list but not the first. (I tried putting a space in 'monkey' to get 'mon key' and it worked!)

A working demo of the code below is here.

I would greatly appreciate any insight into what I am doing wrong here. Or even an alternative selector syntax for using the 'text' attribute. Thanks in advance to all who have the time to assist.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">   <head>    <script type="text/javascript" src="../js/jquery/jquery.js"></script>    <script type="text/javascript">    $(document).ready(function(){      var text1 = 'Monkey';     $("#mySelect1 option[text=" + text1 + "]").attr('selected', 'selected');      var text2 = 'Mushroom pie';     $("#mySelect2 option[text=" + text2 + "]").attr('selected', 'selected');            });    </script>   </head>  <body>    <select id="mySelect1">     <option></option>     <option>Banana</option>     <option>Monkey</option>     <option>Fritter</option>   </select>     <select id="mySelect2">     <option></option>     <option>Cream cheese</option>     <option>Mushroom pie</option>     <option>French toast</option>   </select>   </body>  </html> 
like image 958
Stuart Allen Avatar asked Sep 04 '10 23:09

Stuart Allen


1 Answers

When an <option> isn't given a value="", the text becomes its value, so you can just use .val() on the <select> to set by value, like this:

var text1 = 'Monkey'; $("#mySelect1").val(text1);  var text2 = 'Mushroom pie'; $("#mySelect2").val(text2); 

You can test it out here, if the example is not what you're after and they actually have a value, use the <option> element's .text property to .filter(), like this:

var text1 = 'Monkey'; $("#mySelect1 option").filter(function() {     return this.text == text1;  }).attr('selected', true);  var text2 = 'Mushroom pie'; $("#mySelect2 option").filter(function() {     return this.text == text2;  }).attr('selected', true);​ 

You can test that version here.

like image 81
Nick Craver Avatar answered Oct 05 '22 20:10

Nick Craver