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' dynamicallyI 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 .