Jak ustawić fokus dla konkretnego pola w modale Bootstrap, gdy tylko się pojawi


182

Widziałem kilka pytań dotyczących modów bootstrap, ale nie dokładnie tak, więc pójdę dalej.

Mam modal, który nazywam kliknięciem tak ...

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

Działa to dobrze, ale kiedy pokazuję modal, chcę skupić się na pierwszym elemencie wejściowym ... Może pierwszy element wejściowy ma identyfikator #photo_name.

Więc próbowałem

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

Ale to nie pomogło. Wreszcie próbowałem powiązać zdarzenie „show”, ale mimo to dane wejściowe nie będą się koncentrować. Na koniec tylko do testowania, ponieważ miałem suspiscion, chodzi o kolejność ładowania js, ustawiłem setTimeout, aby zobaczyć, czy opóźnię sekundę, czy fokus zadziała i tak, działa! Ale ta metoda jest oczywiście bzdura. Czy jest jakiś sposób na uzyskanie takiego samego efektu jak poniżej bez użycia setTimeout?

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

Odpowiedzi:


371

Spróbuj tego

Oto stare DEMO :

EDYCJA: (Oto działające DEMO z Bootstrap 3 i jQuery 1.8.3)

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

Uruchamiając bootstrap 3 należy użyć zdarzenia pokazanego.bs.modal:

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

3
Dziękuję Ci. Nie widziałem wydarzenia „pokazanego”. Dokładnie tego szukałem.
jdkealy

dzięki! demo już nie działa, ale fragment kodu działa.
Kreker

@keyur at codebins.com To wydarzenie rozpoczyna się po wyświetleniu modalu, co jeśli muszę rozpocząć wydarzenie przed wyświetleniem modalu
Thomas Shelby

okej, powinienem użyć „show.bs.modal” zamiast „pokazanego.bs.modal”
Thomas Shelby

jeśli chodzi o moduł obsługi fokusa, wymaga to nieco opóźnienia, więc należy go ustawić w takich rzeczach jak setInterval: setInterval (function () {$ ("# your-input"). focus ();}, 50);
Nguyen Minh Hien

76

Chciałem tylko powiedzieć, że Bootstrap 3 traktuje to nieco inaczej. Nazwa zdarzenia to „pokazano.bs.modal”.

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

lub skoncentruj się na pierwszym widocznym wejściu w ten sposób:

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

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


Działa dla mnie, gdybym użył .on ('show.bs.modal') nie pokazano
Peter Graham

Zajęło mi to dużo czasu, zanim zobaczyłem, że powinno być „pokazane.bs ...” zamiast „show.bs ...”. Show nie działało dla mnie. W rzeczywistości ich oboje działają i są to różne wydarzenia. Przepraszam, zignoruj ​​moje pierwsze zdanie.
Vladyn

@PeterGraham może używasz bootstrap 2?
FindOutIslamNow

10

Używam tego w moim układzie do przechwytywania wszystkich modów i skupienia się na pierwszym wejściu

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

Słodkie. Mój pierwszy element wejściowy jest jednak ukryty, więc myślę, że musiałbym zrobić: $ (this) .find ('input: not ([type = hidden])'). Focus ();
jdkealy

2
Lub$(this).find('input:visible').focus();
Stephan Muller,

2
powinno być $ (this) .find ('input'). first (). focus () jeśli nie chcesz skupiać się na wszystkich wejściach
Jacek Pietal

9

Miałem ten sam problem z bootstrap 3, skupiałem się, kiedy klikam link, ale nie, gdy wyzwalam zdarzenie za pomocą javascript. Rozwiązanie:

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

Prawdopodobnie chodzi o animację!


Z pewnością coś się dzieje z animacją modalną. Nawet jeśli wyłączę modalne zanikanie w opcjach, nie wyrenderuje się, jeśli zaraz po wyskakującym modalnym pojawi się zadanie wymagające dużej mocy procesora. Wykorzystanie tego limitu czasu jest jedynym sposobem, w jaki mogę go uruchomić.
krx,

8

Miałem problem z złapaniem zdarzenia „pokazano.bs.modal”. I to jest moje rozwiązanie, które działa idealnie ..

Zamiast prostego on ():

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

Użyj on () z delegowanym elementem:

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

6

Wydaje się, że dzieje się tak, ponieważ animacja modalna jest włączona ( fadew klasie okna dialogowego), po wywołaniu .modal('show')okno dialogowe nie jest natychmiast widoczne, więc nie można w tym momencie ustawić ostrości.

Mogę wymyślić dwa sposoby rozwiązania tego problemu:

  1. Usuń fadez klasy, aby okno dialogowe było natychmiast widoczne po wywołaniu .modal('show'). Możesz zobaczyć http://codebins.com/bin/4ldqp7x/4 na demo. (Przepraszamy, @keyur, przez pomyłkę edytowałem i zapisałem jako nową wersję Twojego przykładu)
  2. Zadzwoń focus()w shownprzypadku, jak napisał @keyur.

Dziękuję Ci. Chciałbym oznaczyć dwie odpowiedzi jako corrent: s. Tak, nawet nie chciałem efektu „zanikania”, więc usunięcie go działa. Usunąłem przenikanie i dodałem pokazane zdarzenie.
jdkealy

4

Stworzyłem dynamiczny sposób automatycznego wywoływania każdego zdarzenia. Idealnie jest skupić pole, ponieważ wywołuje zdarzenie tylko raz, usuwając je po użyciu.

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

Wystarczy zadzwonić modalEvents()na gotowy dokument.

Posługiwać się:

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

Możesz więc użyć tego samego modalu, aby załadować to, co chcesz, bez obaw o usuwanie zdarzeń za każdym razem.


To jest to, czego potrzebuję! Dzięki stary!
Deweloper

3

Miałem ten sam problem z bootstrap 3 i rozwiązałem w ten sposób:

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

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


0

Modalne zdarzenie pokazujące bootstrap

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

})


-1

Trochę czystszym i bardziej modułowym rozwiązaniem może być:

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

Lub zamiast tego użyj swojego identyfikatora jako przykładu:

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

Mam nadzieję, że to pomoże ..


Brak takiej funkcji powodzenia.
Avinash,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.