Як встановити фокус на перший елемент введення у формі HTML, незалежній від ідентифікатора?


84

Чи є простий спосіб встановити фокус (вхідний курсор) веб-сторінки на перший елемент введення (текстове поле, випадаючий список, ...) при завантаженні сторінки, не знаючи ідентифікатора елемента?

Я хотів би застосувати його як загальний сценарій для всіх моїх сторінок / форм мого веб-додатку.


7
ЗАБЕЗПЕЧИТИ, якщо форма розміщена на сторінці таким чином, щоб користувач повинен прокручувати сторінку вниз, щоб побачити форму, встановивши фокус, він автоматично прокрутить сторінку вниз, як це робить якір. Це не дуже добре, тому що користувач, потрапивши на таку сторінку, побачить, що вона відразу прокручується вниз до позиції форми. Я тестував на Safari та FF (IE7 не виконує прокрутку сторінки).
Marco Demaio

@Marco_Demaio Мій веб-додаток побудований таким чином, що кожна сторінка має свої поля введення вгорі вікна.
splattne

3
що, якби користувач змінив розмір вікна браузера до розміру менше 768px. Сторінка буде прокручуватися до місця, де ви встановили фокус. У будь-якому випадку я хотів лише попередити вас на випадок, якщо ви не знали про таку незначну проблему, я не знав про це і перед тим, як робити тести.
Марко Демайо

Відповіді:


96

Ви також можете спробувати метод на основі jQuery:

$(document).ready(function() {
    $('form:first *:input[type!=hidden]:first').focus();
});

Це працює! Я починаю інтегрувати jQuery у свій веб-додаток. Отже, я думаю, що буду дотримуватися цього підходу! Велике спасибі, Марко!
splattne

3
Що станеться, якщо в цьому випадку перша форма на сторінці прихована? Або якщо перший елемент форми прихований за допомогою CSS? Звичайно, це не вдасться. Звичайно, я педантичний, але саме так я кочуюсь.
Джеймс Хьюз,

У моєму випадку (за допомогою ASP.NET) я маю лише ОДНУ форму, яка ніколи не приховується. Отже, це працює для мене.
splattne

@Jame Hughes, ти можеш написати це як функцію і викликати, коли тобі це потрібно, і ти можеш робити винятки. Для мене це рішення справді допомогло.
Luci

це у мене чомусь не працює. я не повинен бачити курсор.
Кріс

136

Хоча це не відповідає на запитання (вимагає поширеного сценарію), хоча іншим може бути корисно знати, що HTML5 вводить атрибут "автофокус":

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

Пориньте в HTML5 , щоб отримати більше інформації.


2
автофокус - це ім’я атрибута. Що з його цінністю? Щось на зразок автофокусу = true не потрібно? Що означає не встановлювати жодного значення?
Geek

4
У HTML5 деякі атрибути не повинні мати значення, "check" - це ще один атрибут, де це так. Я вважаю, що коли значення залишено, мається на увазі, що воно збігається з назвою (наприклад, автофокус = "автофокус" і перевірено = "перевірено").
Jacob Stanley

Мій додаток Spring переривається, коли я намагаюся використовувати autofocusбез значення spring:form. autofocus="autofocus"працює добре. Дякую, @Jacob.
Сергій Таченов

2
@Geek Атрибут автофокусу, як і багато інших, є булевим типом атрибута. Ось чому він використовується лише декларативно, а не шляхом присвоєння йому значення. Детальніше див. У специфікації w3c: w3.org/TR/html5/infrastructure.html#boolean-attribute
n1kkou

34
document.forms[0].elements[0].focus();

Це можна уточнити, використовуючи цикл, наприклад. не фокусувати певні типи полів, відключені поля тощо. Краще може бути , щоб додати клас = «автофокус» в поле ви на самому справі дійсно зосереджені хочете, і перебрати форми [я] .elements [J] шукає для цього Classname.

Як би там не було: зазвичай це не гарна ідея робити це на кожній сторінці. Коли ви фокусуєте вхід, користувач втрачає можливість, наприклад. прокрутити сторінку з клавіатури. Якщо це несподівано, це може дратувати, тому виконуйте автофокус лише тоді, коли ви впевнені, що використання поля форми буде тим, що користувач хоче зробити. тобто якщо ви Google.


3
Має бути правильною відповіддю, оскільки запитання не має тегу jquery.
Калле Х. Веравас,

@ KalleH.Väravas ні, його слід проголосувати проти, оскільки він робить припущення, про які ніде не йдеться, наприклад. є принаймні одна форма. Як правило, це не працює.
9ilsdx 9rvj 0lo

18

Найбільш вичерпний вираз jQuery, який я знайшов працюючим, (за допомогою тут )

$(document).ready(function() {
    $('input:visible:enabled:first').focus();
});

1
Я використовував це, помітив, що він працює дуже повільно на IE, коли в таблиці є велика кількість> 1000 прапорців. Не знаючи, що з цим робити, можливо, доведеться просто відмовитись від фокусування першого поля введення.
Sam Watkins



5

Вам також потрібно пропустити будь-які приховані введення.

for (var i = 0; document.forms[0].elements[i].type == 'hidden'; i++);
document.forms[0].elements[i].focus();

Можливо, я помиляюся, але цей цикл не має визначеної поведінки, якщо форми [0] не мають прихованих входів.
xtofl

Точно так. Він використовується для пропуску будь-яких провідних прихованих входів. І це написано з припущенням, що у формі є неприховані поля. Я міг зробити це і з jQuery (я розміщу іншу відповідь), але ви не згадали, що хочете, щоб jQuery був задіяний.
Марко Думіч

1
@MarkoDumic Навіщо витрачати пам'ять, якщо ви можете скористатися whileтвердженням?
Lucio

3

Поставивши цей код в кінці bodyтегу, ваш перший видимий, не прихований ввімкнений елемент буде автоматично сфокусовано на екрані. Він розгляне більшість справ, які я можу придумати за короткий термін.

<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>

1
Тут слід врахувати одне, це може збігатися з елементами, які самі по собі не приховані, а є предком. Це вимагало б відстеження резервної копії DOM і перевірки видимості кожного предка, що, на мою думку, є серйозним надмірним для такої ситуації.
Джеймс Хьюз,

Як щодо <input type = "text" readonly = "readonly"> Я думаю, вам слід додати такий регістр до свого коду. Зазвичай люди не хочуть зосереджуватися на текстовому полі введення лише для читання. У будь-якому разі приємний код та +1 спасибі!
Марко Демайо

Неперевірене, але я оновив його!! Form [i] [j] .readonly! = Undefined
James Hughes


3

Я використовую це:

$("form:first *:input,select,textarea").filter(":not([readonly='readonly']):not([disabled='disabled']):not([type='hidden'])").first().focus();

2

Це отримує перше з усіх видимих ​​загальних введень, включаючи текстові області та поля вибору. Це також гарантує, що вони не будуть приховані, вимкнені чи лише для читання. це також дозволяє цільовий div, який я використовую у своєму програмному забезпеченні (тобто, перший ввід всередині цієї форми).

$("input:visible:enabled:not([readonly]),textarea:visible:enabled:not([readonly]),select:visible:enabled:not([readonly])", 
    target).first().focus();

1

Для тих, хто використовує JSF2.2 + і не може передавати автофокус як атрибут без значення для нього, використовуйте це:

 p:autofocus="true"

І додайте його до простору імен p (Також часто використовується pt. Що завгодно).

<html ... xmlns:p="http://java.sun.com/jsf/passthrough">


0

Це включає текстові області та виключає перемикачі

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

0

Ви повинні мати можливість використовувати clientHeight замість того, щоб перевіряти атрибут display, оскільки батько міг приховувати цей елемент:

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;
                }
            }
        }
    }   
}

0

Без сторонніх бібліотек використовуйте щось на зразок

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

Обов’язково розгляньте всі теги елементів форми, виключіть приховані / відключені, як у інших відповідях тощо.


0

без jquery, наприклад із звичайним javascript:

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

працює на Safari, але не на Chrome 75 (квітень 2019)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.