Как установить фокус на первый ввод текста в модальном окне начальной загрузки после показа


116

Я загружаю модальный динамический загрузчик, и он содержит несколько текстовых полей. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы курсор фокусировался на первом вводе в этом модальном окне, а по умолчанию этого не происходит.
Итак, я написал этот код, чтобы сделать это:

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

Но теперь он на мгновение фокусируется на вводе, а затем автоматически исчезает, почему это происходит и как решить?


2
Можете ли вы предоставить демонстрацию на jsfiddle.net ?
— undefined

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

можешь попробовать это для меня ... var index = 0; $ ('# modalContainer'). on ('показать', функция () {index = 1;}); если (индекс) {$ ('ввод: текст: видимый: первый'). фокус (); }
— chirag ghiyad 06

Ответы:


187

@scumah имеет для вас ответ: бутстрап Twitter - сосредоточьтесь на текстовой области внутри модального окна при нажатии

Для Bootstrap 2

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

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

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

========== Обновление ======

В ответ на вопрос вы можете использовать это с несколькими модальными окнами на одной странице, если вы укажете разные целевые данные, переименуете идентификаторы модальных окон, чтобы они соответствовали и обновили идентификаторы полей ввода формы, и, наконец, обновите свой JS для соответствия этим новым ID:
см. 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 Изменение моего кода с "показать" на "показано", как я прочитал в вашем ответе после почти часа попыток заставить это работать.
— Exel Gamboa

Это дает максимальную ошибку стека вызовов при срабатывании проверки jquery !. Следовательно, это бесполезно для меня.
— Vandita

@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>
— lot0logs

1
Вот как это можно сделать на элементе управления MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
— Flea,

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>и на этот раз отлично работал, странно
— Маркос Фурким

3
Правильно использовать событие shown.bs.modal
— Akhorus

2
Вместо использования setTimeout () вы можете использовать delay (), например, следующий ... $ ('# textareaID'). Delay (1000) .focus (). 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 autofocus не действует в модальных окнах 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: visible: enabled: 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

Если вы хотите просто автоматически сфокусировать любое открытое модальное окно, вы можете добавить в свои шаблоны или функции библиотеки этот фрагмент, который будет фокусироваться на первом вводе:

$('.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 autofocus не действует в модальных окнах Bootstrap. Чтобы добиться того же эффекта, используйте собственный JavaScript.

Например:

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

Ссылка .


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();
    })
  });
});
  • "#Button" вызывает модальную форму,

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

  • "#myinput" - это ввод, на котором вы хотите сфокусироваться

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.