views:

66

answers:

3

Hi all, I am trying to get the first input field in a form that isn't disabled or hidden. I need to be able to exclude radio buttons, selects, and particular IDs.

The following code works perfectly, EXCEPT when a select comes before the text or password field that I want:

$("form :input:visible:enabled:first:not('select')");

If I exclude the :not('select'), the select is returned as the first input field (correctly so, as :input returns pretty much all form elements). However, when I include the :not('select'), nothing is picked up. Any ideas?

Second part to this question - I assume it is ok to chain :nots so I could have something like:

$("form :input:visible:enabled:first:not('select'):not(#specific_id):not(type[radio])");

Thanks a lot!

Al

+7  A: 

Would it work if you swap the :not and the :first?

`$("form :input:visible:enabled:not('select'):first");`

The way you have it, it selects the first enabled tag, which a set of just one. If that one is a select, you get nothing. With this version, it gets everything that isn't a select, and then takes the first element of that set.

Tesserex
Thanks a million - that did the trick!! This was driving me nuts all morning - you da man (or woman)!! ;-) Al
Al
A: 

it would be better to use the 'type=select' or 'type=xxx' in this case rather than the ':not' selector.

alternatively, you can use the .is() function.

contagious
+2  A: 

Using Tesserex's answer, you can also join several not's.

$("form :input:visible:enabled:not('select, :radio, #id, .class'):first");

Just separate by commas as you would in any other jQuery tag.

Capt Otis
Thanks a bunch - for some reason I thought that you had to use multiple :nots...way cleaner this way!
Al