99

Is there a simple way to set the focus (input cursor) of a web page on the first input element (textbox, dropdownlist, ...) on loading the page without having to know the id of the element?

I would like to implement it as a common script for all my pages/forms of my web application.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
splattne
  • 102,760
  • 52
  • 202
  • 249
  • 7
    REMARK if form is placed down in page in a way user has to scroll down page to see the form,by setting the focus will automatically scroll down the page like an anchor would do. This is not very good cause the user getting to such page would see it immediately scrolled down to the form position. I tested on Safari and FF (IE7 does not perform the page scrolling). – Marco Demaio Jun 05 '10 at 16:53
  • @Marco_Demaio My web app is structured in a way that every page has its input boxes near the top of the window. – splattne Jun 05 '10 at 20:34
  • 3
    what if the user resized the browser window height to something smaller than 768px. Page would scroll to the where you set focus. Anyway I wanted only to warn you in case you did not know about such minor issue, I didn't know about it either before doing some tests. – Marco Demaio Jun 07 '10 at 10:36

18 Answers18

158

Although this doesn't answer the question (requiring a common script), I though it might be useful for others to know that HTML5 introduces the 'autofocus' attribute:

<form>
  <input type="text" name="username" autofocus>
  <input type="password" name="password">
  <input type="submit" value="Login">
</form>

Dive in to HTML5 has more information.

µBio
  • 10,668
  • 6
  • 38
  • 56
Jacob Stanley
  • 4,704
  • 3
  • 33
  • 36
  • 2
    autofocus is the attributename . What about its value ?Somethig like autofocus=true not needed ? What does it mean not to set any value ? – Geek Feb 05 '13 at 18:14
  • 7
    In HTML5, some attributes do not need to have a value, 'checked' is another attribute where this is the case. I believe that when the value is left off, it is implied that the it is the same as the name (e.g. autofocus="autofocus" and checked="checked"). – Jacob Stanley Feb 07 '13 at 09:03
  • My Spring app breaks when I try to use `autofocus` with no value on `spring:form`. `autofocus="autofocus"` works fine, though. Thanks, @Jacob. – Sergei Tachenov Mar 19 '16 at 08:07
  • 2
    @Geek The autofocus attribute, as many other, is a boolean attribute type. That's why it is used only in a declarative way, not by assigning a value to it. See more details in w3c spec: https://www.w3.org/TR/html5/infrastructure.html#boolean-attribute – n1kkou May 09 '17 at 12:08
  • 1
    Note that this does not seem to work by itself on an input that is initially hidden, e.g. in a bootstrap pop-up modal, because the attribute is handled when the element is inserted into the DOM at which point it is still hidden and thus not focusable. See [this answer](https://stackoverflow.com/a/65936624/1571426) – user9645 Feb 04 '21 at 14:47
104

You can also try jQuery based method:

$(document).ready(function() {
    $('form:first *:input[type!=hidden]:first').focus();
});
Marko Dumic
  • 9,848
  • 4
  • 29
  • 33
  • It Works! I'm starting to integrate jQuery in my web application. So, I think I will stick with this approach! Many thanks, Marko! – splattne Nov 11 '08 at 11:55
  • 3
    What happens if the first form on the page is hidden in this case? Or if the first element on the form is hidden via CSS? Surely this would fail. I am being pedantic of course but that's how I roll. – James Hughes Nov 11 '08 at 12:26
  • In my case (using ASP.NET) I have just ONE form which is never hidden. So this works for me. – splattne Nov 11 '08 at 14:53
  • @Jame Hughes, you can write it as a function and call it when u need it, and you can make exceptions. For me this solution really helped. – Luci Dec 06 '13 at 10:48
  • this is not working for me for some reason. shouldn't I see a cursor. – Chris Dec 20 '13 at 16:59
  • @AdonisSMU Please, paste your HTML somewhere. – Marko Dumic Dec 22 '13 at 13:29
  • This slightly simpler version should suffice: `$(':input[type!=hidden]:first').focus()` – mpartel Dec 02 '14 at 17:27
42
document.forms[0].elements[0].focus();

This can be refined using a loop to eg. not focus certain types of field, disabled fields and so on. Better may be to add a class="autofocus" to the field you actually do want focused, and loop over forms[i].elements[j] looking for that className.

Anyhow: it's not normally a good idea to do this on every page. When you focus an input the user loses the ability to eg. scroll the page from the keyboard. If unexpected, this can be annoying, so only auto-focus when you're pretty sure that using the form field is going to be what the user wants to do. ie. if you're Google.

bobince
  • 528,062
  • 107
  • 651
  • 834
21

The most comprehensive jQuery expression I found working is (through the help of over here)

$(document).ready(function() {
    $('input:visible:enabled:first').focus();
});
ngeek
  • 7,733
  • 11
  • 36
  • 42
  • 1
    I was using this, noticed it runs extremely slowly on IE when have a large number >1000 of checkboxes in a table. Not sure what to do about it, might have to just give up on focusing the first input field. – Sam Watkins Nov 05 '14 at 02:01
11

I needed to solve this problem for a form that is being displayed dynamically in a modal div on my page, and unfortunately autofocus isn't honored when the containing div is shown by changing the display property (at least not in Chrome). I don't like any of the solutions that require my code to infer which control I should set the focus to, because of the complications of hidden or zero-sized inputs, etc. My solution was to set the autofocus attribute on my input anyway, then set the focus in my code when I show the div:

form.querySelector('*[autofocus]').focus();
Scott Means
  • 635
  • 6
  • 8
7

If you're using the Prototype JavaScript framework then you can use the focusFirstElement method:

Form.focusFirstElement(document.forms[0]);
Dave Powers
  • 2,051
  • 2
  • 30
  • 34
John Topley
  • 113,588
  • 46
  • 195
  • 237
6

There's a write-up here that may be of use: Set Focus to First Input on Web Page

Galwegian
  • 41,475
  • 16
  • 112
  • 158
5

You also need to skip any hidden inputs.

for (var i = 0; document.forms[0].elements[i].type == 'hidden'; i++);
document.forms[0].elements[i].focus();
Marko Dumic
  • 9,848
  • 4
  • 29
  • 33
  • I might be wrong, but this loop doesn't have defined behaviour if forms[0] has no hidden inputs. – xtofl Nov 10 '08 at 11:21
  • Exactly. It is used to skip any leading hidden inputs. And it is written under assumption that there are non-hidden fields in the form. I could have done it with jQuery as well (I'll post another answer) but you didn't mention you want jQuery involved. – Marko Dumic Nov 10 '08 at 21:00
  • 1
    @MarkoDumic Why waste memory if you can use a `while` statement? – Lucio Feb 21 '13 at 02:42
4

I'm using this:

$("form:first *:input,select,textarea").filter(":not([readonly='readonly']):not([disabled='disabled']):not([type='hidden'])").first().focus();
Robert Brooker
  • 2,148
  • 24
  • 22
4

Putting this code at the end of your body tag will focus the first visible, non-hidden enabled element on the screen automatically. It will handle most cases I can come up with on short notice.

<script>
    (function(){
        var forms = document.forms || [];
        for(var i = 0; i < forms.length; i++){
            for(var j = 0; j < forms[i].length; j++){
                if(!forms[i][j].readonly != undefined && forms[i][j].type != "hidden" && forms[i][j].disabled != true && forms[i][j].style.display != 'none'){
                    forms[i][j].focus();
                    return;
                }
            }
        }
    })();
</script>
James Hughes
  • 6,194
  • 4
  • 31
  • 44
  • 1
    One thing to consider here is it may match elements that are not themselves hidden but an ancestor is. That would require tracking back up the DOM and testing each ancestors visibility which I feel is serious overkill for this kind of situation. – James Hughes Nov 10 '08 at 13:05
  • What about I think you should add such a case to your code. Normally people don't want focus on a readonly input text field. Anyway nice code and +1 thanks! – Marco Demaio May 31 '10 at 15:15
  • Untested but I updated it with !forms[i][j].readonly != undefined – James Hughes Jun 01 '10 at 07:46
3

Tried lots of the answers above and they weren't working. Found this one at: http://www.kolodvor.net/2008/01/17/set-focus-on-first-field-with-jquery/#comment-1317 Thank you Kolodvor.

$("input:text:visible:first").focus();
Max West
  • 755
  • 7
  • 11
2

This gets the first of any visible common input, including textareas and select boxes. This also makes sure they aren't hidden, disabled or readonly. it also allows for a target div, which I use in my software (ie, first input inside of this form).

$("input:visible:enabled:not([readonly]),textarea:visible:enabled:not([readonly]),select:visible:enabled:not([readonly])", 
    target).first().focus();
splattne
  • 102,760
  • 52
  • 202
  • 249
Dave K
  • 757
  • 7
  • 15
2

without jquery, e.g. with regular javascript:

document.querySelector('form input:not([type=hidden])').focus()

works on Safari but not Chrome 75 (april 2019)

localhostdotdev
  • 1,795
  • 16
  • 21
1

For those who use JSF2.2+ and cannot pass autofocus as an attribute without value to it, use this:

 p:autofocus="true"

And add it to the namespace p (Also often used pt. Whatever you like).

<html ... xmlns:p="http://java.sun.com/jsf/passthrough">
feder
  • 1,849
  • 2
  • 25
  • 43
0

With AngularJS :

angular.element('#Element')[0].focus();
EpokK
  • 38,062
  • 9
  • 61
  • 69
0

This includes textareas and excludes radio buttons

$(document).ready(function() {
    var first_input = $('input[type=text]:visible:enabled:first, textarea:visible:enabled:first')[0];
    if(first_input != undefined){ first_input.focus(); }
});
HectorPerez
  • 744
  • 6
  • 11
0

You should be able to use clientHeight instead of checking for the display attribute, since a parent could be hiding this element:

function setFocus() {
    var forms = document.forms || [];
        for (var i = 0; i < forms.length; i++) {
            for (var j = 0; j < forms[i].length; j++) {
            var widget = forms[i][j];
                if ((widget && widget.domNode && widget.domNode.clientHeight > 0) && typeof widget.focus === "function")
                 && (typeof widget.disabled === "undefined" || widget.disabled === false)
                 && (typeof widget.readOnly === "undefined" || widget.readOnly === false)) {
                        widget.focus();
                        break;
                }
            }
        }
    }   
}
thecoolmacdude
  • 2,036
  • 1
  • 23
  • 38
0

Without third party libs, use something like

  const inputElements = parentElement.getElementsByTagName('input')
  if (inputChilds.length > 0) {
    inputChilds.item(0).focus();
  }

Make sure you consider all form element tags, rule out hidden/disabled ones like in other answers and so on..

cghislai
  • 1,751
  • 15
  • 29