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

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
Возможный дубликат фокуса модального поля ввода для загрузки Twitter
Мухаммад Рехан Саид

Ответы:

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

tmarois
источник
Потратив пару часов на то, чтобы заставить эту работу работать так, как должно (щелкнуть мышью или обработчики), я нашел только один работающий метод, а именно атрибут автофокуса 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 ();
Дуглас Тиммс
3

попробуйте этот код, он может сработать для вас

$(this).find('input:text')[0].focus();
Джитеш Тукадия
источник
1
Вот что я использую:$(this).find('input:text').first().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
DanCZ
источник
0

Попробуйте удалить свойство tabIndex модального окна , когда ваше поле ввода / текстовое поле открыто. Верните его к тому, что когда-либо было , когда вы закрываете ввод / текстовое поле. Это решит проблему независимо от версии начальной загрузки и без ущерба для взаимодействия с пользователем .

Pathik
источник
0

Согласно документам Bootstrap 4:

Из-за того, как HTML5 определяет свою семантику, атрибут HTML autofocus не действует в модальных окнах Bootstrap. Чтобы добиться того же эффекта, используйте собственный JavaScript.

Например:

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

Ссылка .

hatef
источник
0

Используйте автофокус для поиска нужного элемента формы:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});
gal007
источник
-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • "#Button" вызывает модальную форму,

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

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

Дженрри Легия
источник