Focus first text field using jQuery
Monday, April 14, 2008
When it comes to focus the first text field on a page using jQuery , the usual solution would be:
- $(“:text:visible:enabled:eq(0)”).focus();
This query means to find the first of input text field(s), which is/are visible and enabled. However, this would also extract text field(s) which is/are under a display:none parent(s). So a more complete way would be:
- $(“:text:visible:enabled”).filter(function(){
- return $(this).parents(“:hidden”).size()==0;
- }).slice(0,1).focus();
The filter here would try to determine if the text field is a descendant of a hidden ancestor. The usage of slice(0,1) instead of get(0) is to keep the chainability. A test page is put up here .
Finally, you may wrap it up with a plugin:
- (function($){
- $.fn.focusFirstField = function(){
- $this = this;
- $this.find(“:text:visible:enabled”).filter(function(){
- return $(this).parents(“:hidden”).size() == 0;
- }).slice(0,1).focus();
- return this;
- }
- })(jQuery)
So that you can do this:
- $(“#form1,#form2”).focusFirstField(); //form1 or form2 may be ‘hidden’ dynamically
I just wonder if there is any ‘selector-only’ solution for this?
Update: It turns out that the child’s visiblity would override parent’s visibility. So the filter should only check display none:
- $(":text:visible:enabled").filter(function(){
- return $(this).parents.filter(function(){
- return this.style.display == "none"; })
- .size()==0;
- }).slice(0,1).focus();
I’ve updated the demo page .





