Як встановити фокус на перше введення тексту в режимі завантажувальної програми після відображення


116

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

$('#modalContainer').on('show', function () {
   $('input:text:visible:first').focus();
});

Але тепер зосередимось на вході на мить, потім автоматично відійдіть, чому це відбувається і як вирішити?


2
Чи можете ви надати демонстрацію на jsfiddle.net ?
визначено

Спробуйте встановити тайм-аут для цього, можливо, щось інше заважатиме. setTimeout(function() { /* Your code */ }, 100);
qwerty

чи можете ви спробувати це для мене ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (індекс) {$ ('input: текст: видимий: перший'). focus (); }
chirag ghiyad

Відповіді:


187

@scumah має відповідь для вас: завантажувальна програма Twitter - зосередите увагу на textarea всередині модального клацання

Для Bootstrap 2

modal.$el.on('shown', function () {
$('input:text:visible:first', this).focus();
});  

Оновлення: для Bootstrap 3

$('#myModal').on('shown.bs.modal', function () {
    $('#textareaID').focus();
})  

========== Оновити ======

У відповідь на запитання ви можете використовувати це з декількома модалами на одній сторінці, якщо вказати різні цілі даних, перейменувати свої ідентифікатори модалів на відповідність та оновити ідентифікатори полів введення форми і, нарешті, оновити свій JS, щоб відповідати цим новим Ідентифікатори:
див. Http://jsfiddle.net/panchroma/owtqhpzr/5/

HTML

...
<button ... data-target="#myModal1"> ... </button> 
... 
<!-- Modal 1 -->
<div class="modal fade" id="myModal1" ...>
... 

<div class="modal-body"> <textarea id="textareaID1" ...></textarea></div>

JS

$('#myModal1').on('shown.bs.modal', function() {
  $('#textareaID1').focus();
})

це працює, лише якщо на сторінці є один модальний режим? що робити, якщо більше одного?
Рамеш Парік

чудовий, швидкий відгук! Я зробив дурну помилку, працює зараз!
Рамеш Парік

+1 Зміна мого коду з "показати" на "показано", як я читав у вашій відповіді після майже години, намагаючись змусити це працювати.
Ексель Гамбоа

Це дає максимальну помилку ставок виклику при запуску перевірки jquery !. Отже, це мені не приносить користі.
Вандіта

@Vandita, якщо ви хочете запустити ручку на codepen.io, яка ілюструє описану вами проблему, я би радий розглянути її.
Девід

80

Я знайшов найкращий спосіб зробити це без jQuery.

<input value="" autofocus>

працює чудово.

Це атрибут html5. Підтримується всіма основними браузерами.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Провівши пару годин, намагаючись зробити цю роботу як слід (натисніть або на обробниках), я знайшов лише один метод, який працює, атрибут html5 <input type="text" class="form-control" placeholder="" autofocus>
autofocus

1
Ось як це можна зробити на контролі MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Блоха

19
Це не спрацювало для мене ... після показу модального завантаження вхід втрачає фокус
Дієго Котіні

Я також бачу фокус посилення входу на мить після появи модального режиму завантаження під час використання автофокусування. Однак вхід потім втрачає фокус. Довелося реалізувати обробник .on ().
raddevus

7
Це працює, якщо ви видалите його tabdindex="-1"зі свого модалу, однак він працює лише один раз. Закриття та повторне відкриття не фокусується.
Мемет Олсен

42

Відповідь Девіда Таяроа є правильною, але не працює, тому що час "зникати" в модалі не дозволяє вам налаштувати фокус на введення. Вам потрібно створити затримку:

$('#myModal').on('shown.bs.modal', function () {
    ...
    setTimeout(function (){
        $('#textareaID').focus();
    }, 1000);

})

2
Ти єдиний тут. Ваше рішення - єдине, що працює. Я намагався встановити менше значення для timeOut, але не вийшло. Здається модальним "закінчує завантаження" на 1000мс :(
Енріке

1
так, але сьогодні у своєму новому проекті я <input value="" autofocus>цього разу використовував і добре працював, дивно
Marcos Furquim

3
Правильним є використання події показана.bs.modal
Akhorus

2
Замість використання setTimeout () ви можете використовувати затримку (), наприклад, наступне ... $ ('# textareaID'). Затримка (1000) .фокус (). Select ();
Тоні

Однозначно рішення для корекції.
Френк Томас

18

Звичайний код (нижче) для мене не працює:

$('#myModal').on('shown.bs.modal', function () {
  $('#myInput').focus()
})

Я знайшов рішення :

$('body').on('shown.bs.modal', '#myModal', function () {
    $('input:visible:enabled:first', this).focus();
})

дивіться більше тут


9

Я отримав, що завантажувач додав таку інформацію на свою сторінку:

Завдяки тому, як HTML5 визначає свою семантику, HTML-атрибут автофокусування не впливає в режимах Bootstrap. Щоб домогтися того ж ефекту, використовуйте деякі власні JavaScript:

$('#myModal').on('shown.bs.modal', function () {
  $('#myInput').focus()
})

http://getbootstrap.com/javascript/#modals


7

Це простий код, який найкраще підійде для всіх спливаючих вікон, які мають будь-яке поле введення, фокусуючи його

$(".modal").on('shown.bs.modal', function () {
    $(this).find("input:visible:first").focus();
});

4

Я вважаю, що найбільш правильною відповіддю, припускаючи використання jQuery, є консолідація аспектів усіх відповідей на цій сторінці, а також використання події, яку проходить Bootstrap:

$(document).on('shown.bs.modal', function(e) {
  $('input:visible:enabled:first', e.target).focus();
});

Вона також буде працювати зміни $(document)в $('.modal')або додати клас до модальним , що сигнали , що основне увага повинна відбутися, як$('.modal.focus-on-first-input')


2
Це найкраще, найзагальніше рішення, яке я тут бачив :)
Мартін Т.

Якщо ви також хочете, щоб вона ігнорувала текстові поля, які читаються лише для редагування, змініть рядок таким чином: $ ('input: видима: увімкнено: not ([readonly]): first', e.target) .focus ();
Дуглас Тіммс


1

Перший крок, ви повинні встановити свій autofocusатрибут при введенні форми.

<input name="full_name" autofocus/>

І тоді вам доведеться додати декларацію, щоб встановити автофокусування вводу після того, як з'явиться ваш модальний режим.
Спробуйте цей код:

$(document).on('ready', function(){
    // Set modal form input to autofocus when autofocus attribute is set
    $('.modal').on('shown.bs.modal', function () {
        $(this).find($.attr('autofocus')).focus();
    });
});

я використав $ (this) .find ('[autofocus]'). focus (); і це працює
SummerRain

0

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

$('.modal').on('shown.bs.modal', function () {
  $(this).find('input:first').focus();
})

0

якщо ви шукаєте фрагмент, який би працював для всіх ваших модалів, і автоматично шукати перший текст введення у відкритому, слід скористатися цим:

$('.modal').on('shown.bs.modal', function () {
    $(this).find( 'input:visible:first').focus();
});

Якщо ваш модал завантажується за допомогою ajax, використовуйте це замість:

$(document).on('shown.bs.modal', '.modal', function() {
    $(this).find('input:visible:first').focus();
});

0

це найбільш загальне рішення

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • працює з режимами, доданими до DOM після завантаження сторінки
  • працює з введенням, текстовою областю, вибирайте, а не кнопкою
  • опускає приховані, відключені, лише заново
  • працює з вимкненими модами, немає необхідності в setInterval

0

Спробуйте видалити властивість tabIndex з модального режиму , коли вхід / текстове поле відкрито. Поверніть його до того, що це було , коли ви закриваєте поле вводу / текстового вікна. Це дозволить вирішити проблему незалежно від версії завантажувача та без шкоди для потоку користувачів .


0

За даними Bootstrap 4 документи:

Завдяки тому, як HTML5 визначає свою семантику, HTML-атрибут автофокусування не впливає в режимах Bootstrap. Щоб домогтися такого ж ефекту, використовуйте якийсь спеціальний JavaScript.

Наприклад:

$('#idOfMyModal').on('shown.bs.modal', function () {
    $('input:first').trigger('focus')
});

Link .


0

Використовуйте автофокус для пошуку потрібного елемента форми:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});

-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • Саме "# кнопка" викликає модальну форму,

  • "#mymodal" - модальна форма,

  • "#myinput" - це вхід, на який ви хочете отримати фокус

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