views:

813

answers:

3

I have the following select:

<select name="end" id="end"> 
    <optgroup label="Morning"> 
        <option value="12:00a">12:00 am</option> 
        <option value="12:30a">12:30 am</option> 
        <option value="1:00a">1:00 am</option> 
        <option value="1:30a">1:30 am</option> 
    </optgroup> 
    <optgroup label="Evening"> 
        <option value="12:00p">12:00 pm</option> 
        <option value="12:30p">12:30 pm</option> 
        <option value="1:00p" selected="selected">1:00 pm</option> 
        <option value="1:30p">1:30 pm</option> 
    </optgroup> 
</select> 

I need to find the overall index of the selected option, but the optgroup is making that difficult. In other words, the selected one should return 6, but it is returning 2. I tried this:

var idx = $('#end :selected').prevAll().size();

But that returns the index within that optgroup, not the overall index. I can't change the format or values of the select options.

A: 
var index = -1;
$('#end option').each(function(i, option) {
  if (option.selected) index = i;
});

A little ugly but I think that'd work.

Pointy
+7  A: 

Use the index() function to find an element within a set. Construct a set of all the options using $("#end option"). Find the selected option using the :selected pseudo-element. Note: indexes are 0-based.

var options = $("#end option");
var idx = options.index(options.filter(":selected"));
cletus
oh that's good to know. (oo that's a new 1.4 thing; I can't wait to upgrade.)
Pointy
@Pointy: nothing there requires jQuery 1.4. I've linked to those docs but as far as I can tell, this will work in any version.
cletus
Beautiful! That's perfect. Thanks.
Tauren
FWIW, this exact code works fine and I'm using jquery 1.3.
Tauren
@cletuus Oh OK then; I was going by what it says in the jQuery API docs for "index(selector)" - "version added: 1.4"
Pointy
@Pointy: yes thats new but I'm using `index(element)` which is "since 1.0".
cletus
@cletus, thanks again for your solution, it is certainly a great jquery-only way to do this. But I'm switching my choice to the answer given by @bobince as it is far more efficient.
Tauren
@Tauren: thanks for the comment. I appreciate it.
cletus
+5  A: 

Erm... whyever not good old DOM methods? For a single-select:

var idx= document.getElementById('end').selectedIndex;

// or $('#end')[0].selectedIndex if you must

Or, which will also work on multi-selects, get the option element node you're interested in and fetch option.index on it.

This is massively faster and simpler than getting jQuery to process complex selectors.

bobince
Heh, *exactly*. Cripes, I'm just gonna go ahead and remove the "javascript" tag from this show of DOM ignorance.
Crescent Fresh
But will this work with the optgroup? I should test it I suppose.
Tauren
Yes, `selectedIndex` will be `6`, as stated in the question.
bobince
Yes indeed it does work. Much more efficient than the jquery way! I'm switching the answer to this solution. Thanks!
Tauren
@Cresent - I just added back the javascript tag. Since I've now chosen a javascript answer, it seemed appropriate to do.
Tauren
+1 good solution
cletus
@Tauren: sweet, I got your attention then ;)
Crescent Fresh