Як встановити фокус для певного поля в режимі Bootstrap, як тільки воно з’явиться


182

Я бачив кілька запитань щодо моделей завантаження, але жодного точно немає, тому я продовжуватиму.

У мене є спосіб, який я так називаю onclick ...

$(".modal-link").click(function(event){
  $("#modal-content").modal('show');
});

Це добре працює, але коли я показую модальний, я хочу зосередити увагу на першому вхідному елементі ... У випадку може, перший елемент введення має ідентифікатор #photo_name.

Тому я спробував

   $(".modal-link").click(function(event){
     $("#modal-content").modal('show');
     $("input#photo_name").focus();
   });

Але це було безрезультатно. Нарешті, я спробував прив’язатись до події "шоу", але навіть так, вхід не зосередиться. Нарешті, лише для тестування, оскільки у мене виникло подозрення, це стосується порядку завантаження js, я поставив setTimeout лише для того, щоб побачити, чи затримаю я на секунду, чи буде фокусування, і так, це працює! Але цей метод, очевидно, лайно. Чи може бути такий ефект, як нижче, не використовуючи setTimeout?

  $("#modal-content").on('show', function(event){
    window.setTimeout(function(){
      $(event.currentTarget).find('input#photo_name').first().focus()
    }, 0500);
  });

Відповіді:


371

Спробуйте це

Ось стара DEMO :

EDIT: (Ось робочий DEMO з Bootstrap 3 та jQuery 1.8.3)

$(document).ready(function() {
    $('#modal-content').modal('show');
    $('#modal-content').on('shown', function() {
        $("#txtname").focus();
    })
});

Для запуску завантажувального пристрою 3 потрібно використовувати події show.bs.modal:

$('#modal-content').on('shown.bs.modal', function() {
    $("#txtname").focus();
})

3
Дякую. Я не бачив "показаної" події. Саме те, що я шукав.
jdkealy

Дякую! демонстрація більше не працює, але фрагмент робить.
Крекер

@keyur на codebins.com Ця подія починається після модального відображення, що робити, якщо я повинен розпочати подію до модального відображення
Томас Шелбі

okej, я повинен використовувати 'show.bs.modal' замість 'показаний.bs.modal'
Thomas Shelby

що стосується обробника фокусу, він вимагає трохи затримки, тому ви повинні, але це в setInterval речі, такі: setInterval (function () {$ ("# ваш вхід"). focus ();}, 50);
Nguyen Minh Hien

76

Просто хотів сказати, що Bootstrap 3 справляється з цим дещо інакше. Назва події "показано.bs.modal".

$('#themodal').on('shown.bs.modal', function () {
   $("#txtname").focus();
});

або поставте фокус на перший видимий вхід, як-от цей:

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

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


Це працювало для мене, якщо я .on ('show.bs.modal') не відображався
Peter Graham

Минуло багато часу, поки я побачив, що це має бути "показано.bs ..." замість "show.bs ...". Шоу не працювало на мене. Насправді їх обоє працюють, і це різні події. Вибачте, ігноруйте моє перше речення.
Владін

@PeterGraham, можливо, ви використовуєте bootstrap 2?
FindOutIslamNow

10

Я використовую це у своєму макеті, щоб захопити всі модалі та зосередитись на першому вході

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

Солодке. Мій перший вхідний елемент приховано, тому я думаю, що мені доведеться зробити: $ (this) .find ('input: not ([type = hidden])' '). Focus ();
jdkealy

2
Або$(this).find('input:visible').focus();
Стефан Мюллер

2
має бути $ (this) .find ('input'). first (). focus (), якщо ви не хочете зосередити всі входи
Jacek Pietal

9

У мене була така ж проблема з завантажувальним пристроєм 3, фокусування, коли я натискаю посилання, але не тоді, коли викликає подія за допомогою JavaScript. Рішення:

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

Напевно, це щось про анімацію!


З модальною анімацією напевно щось відбувається. Навіть якщо я вимкну модальне зменшення в параметрах, воно не відображатиметься, якщо після модального спливаючого вікна з’явиться інтенсивне завдання процесора. Використання цього тайм-ауту - єдиний спосіб змусити його працювати.
krx

8

У мене була проблема впіймати "події show.bs.modal" .. І це моє рішення, яке ідеально працює ..

Замість простого на ():

$('#modal').on 'shown.bs.modal', ->

Використовувати на () з делегованим елементом:

$('body').on 'shown.bs.modal', '#modal', ->

6

Здається, це тому, що модальна анімація включена ( fadeу класі діалогового вікна) після виклику.modal('show') діалогове вікно не видно одразу, тому на даний момент він не може отримати фокус.

Я можу придумати два способи вирішення цієї проблеми:

  1. Видалити fadeз класу, тож діалог буде видно відразу після виклику .modal('show'). Ви можете побачити http://codebins.com/bin/4ldqp7x/4 для демонстрації. (Вибачте @keyur, я помилково відредагував і зберег як нову версію вашого прикладу)
  2. Телефонуйте focus()на shownвипадок, як те, що написав @keyur.

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

4

Я створив динамічний спосіб автоматичного виклику кожної події. Ідеально фокусувати поле, оскільки він викликає подію лише один раз, видаляючи його після використання.

function modalEvents() {
    var modal = $('#modal');
    var events = ['show', 'shown', 'hide', 'hidden'];

    $(events).each(function (index, event) {
        modal.on(event + '.bs.modal', function (e) {
            var callback = modal.data(event + '-callback');
            if (typeof callback != 'undefined') {
                callback.call();
                modal.removeData(event + '-callback');
            }
        });
    });
}

Вам просто потрібно зателефонувати modalEvents() на документ готовий.

Використання:

$('#modal').data('show-callback', function() {
    $("input#photo_name").focus();
});

Отже, ви можете використовувати один і той же модал, щоб завантажувати що завгодно, не турбуючись про видалення подій кожного разу.


Ось що мені потрібно! Спасибі, брате!
розробник

3

У мене була така ж проблема з завантажувальним пристроєм 3 і вирішено так:

$('#myModal').on('shown.bs.modal', function (e) {
    $(this).find('input[type=text]:visible:first').focus();
})

$('#myModal').modal('show').trigger('shown');


0

Подія модального шоу Bootstrap

$('#modal-content').on('show.bs.modal', function() {
$("#txtname").focus();

})


-1

Трохи чистішим і модульнішим рішенням може бути:

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

Або використовувати замість свого ідентифікатора як приклад:

$(document).ready(function(){
    $('#modal-content').modal('show').success(function() {
        $('input:text:visible:first').focus();
    });  
});

Сподіваюся, що це допомагає ..


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