Jak ustawić fokus na pierwsze wprowadzenie tekstu w trybie ładowania początkowego po wyświetleniu


116

Ładuję dynamiczny modal bootstrap i zawiera kilka danych wejściowych. Problem, z którym się spotykam, polega na tym, że chcę, aby kursor koncentrował się na pierwszym wejściu w tym trybie, a to nie dzieje się domyślnie.
Więc napisałem ten kod, aby to zrobić:

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

Ale teraz skupia się przez chwilę na wejściu, a następnie znika automatycznie, dlaczego tak się dzieje i jak rozwiązać?


2
Czy możesz udostępnić demo na jsfiddle.net ?
niezdefiniowany

Spróbuj ustawić dla niego limit czasu, coś innego może przeszkadzać. setTimeout(function() { /* Your code */ }, 100);
qwerty

czy możesz to dla mnie wypróbować ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (indeks) {$ ('input: text: visible: first'). focus (); }
chirag ghiyad

Odpowiedzi:


187

@scumah ma dla Ciebie odpowiedź: Twitter bootstrap - skup się na textarea wewnątrz modalu po kliknięciu

Dla Bootstrap 2

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

Aktualizacja: dla Bootstrap 3

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

========== Aktualizacja ======

W odpowiedzi na pytanie możesz użyć tego z wieloma modałami na tej samej stronie, jeśli określisz różne cele danych, zmienisz nazwy identyfikatorów modali, aby pasowały i zaktualizowały identyfikatory pól wejściowych formularza, a na koniec zaktualizujesz JS, aby pasował do tych nowych Identyfikatory:
patrz 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();
})

to działa tylko wtedy, gdy na stronie jest jeden modal? co jeśli więcej niż jeden?
Ramesh Pareek

świetna, szybka odpowiedź! Zrobiłem głupi błąd, teraz działa!
Ramesh Pareek

+1 Zmieniam mój kod z „pokaż” na „pokazany”, gdy przeczytałem Twoją odpowiedź po prawie godzinie, próbując ją uruchomić.
Exel Gamboa

Daje to maksymalny błąd stosu wywołań podczas odpalania walidacji jQuery !. Dlatego to mi się nie przyda.
Vandita

@Vandita, jeśli chcesz uruchomić pióro na codepen.io, które ilustruje opisywany przez Ciebie problem, z przyjemnością przyjrzę się temu za Ciebie.
David Taiaroa

80

Znalazłem najlepszy sposób na zrobienie tego bez jQuery.

<input value="" autofocus>

działa świetnie.

To jest atrybut HTML5. Obsługiwane przez wszystkie główne przeglądarki.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Po spędzeniu kilku godzin na próbach uzyskania tego, jak powinno (kliknij lub na handlerach), znalazłem tylko jedną metodę, która działa, czyli atrybut autofocus html5:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs

1
Oto jak możesz to zrobić na kontrolerze MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Pchła

19
Dla mnie to nie zadziałało ... po pokazaniu modalu bootstrap wejście traci koncentrację
Diego Cotini,

Ja również widzę fokus wzmocnienia wejściowego przez chwilę po pojawieniu się modalu bootstrap podczas używania autofokusa. Jednak wejście traci wtedy ostrość. Musiałem zaimplementować procedurę obsługi .on ().
raddevus

7
Działa to po usunięciu tabdindex="-1"z modalu, jednak działa tylko raz. Zamykanie i ponowne otwieranie nie koncentruje się.
Memet Olsen

42

Odpowiedź Davida Taiaroa jest poprawna, ale nie działa, ponieważ czas na "zanikanie" modalu nie pozwala skupić się na wejściu. Musisz utworzyć opóźnienie:

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

})

2
Jesteś tu jedyny. Twoje rozwiązanie jest jedynym, które działa. Próbowałem ustawić mniejszą wartość dla timeOut, ale nie zadziałało. Wygląda na to, że modalne "kończy się ładowanie" o 1000 ms :(
Enrique

1
tak, ale dzisiaj, w moim nowym projekcie, <input value="" autofocus>tym razem
użyłem i działałem

3
Prawidłowe to użycie zdarzenia shown.bs.modal
Akhorus

2
Zamiast używać setTimeout (), możesz użyć delay (), jak następujący ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony

Zdecydowanie rozwiązanie korekcyjne.
Frank Thomas

18

Zwykły kod (poniżej) nie działa dla mnie:

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

Znalazłem rozwiązanie :

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

zobacz więcej tutaj


9

Mam, że bootstrap dodał następujące informacje na swojej stronie:

Ze względu na to, jak HTML5 definiuje swoją semantykę, atrybut autofocus HTML nie ma wpływu na modały Bootstrap. Aby osiągnąć ten sam efekt, użyj niestandardowego JavaScript:

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

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


7

To jest prosty kod, który będzie działał najlepiej we wszystkich wyskakujących okienkach, które mają dowolne pole wejściowe z fokusem

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

4

Myślę, że najbardziej poprawną odpowiedzią, zakładając użycie jQuery, jest konsolidacja aspektów wszystkich odpowiedzi na tej stronie, plus użycie zdarzenia, które przechodzi Bootstrap:

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

To również będzie działać zmienia $(document)się $('.modal')lub dodać klasę do modalnym, że powinno nastąpić to nacisk sygnały, jak$('.modal.focus-on-first-input')


2
To najlepsze, najbardziej ogólne rozwiązanie, jakie tu widziałem :)
Martin T.

Jeśli chcesz, aby również ignorował pola tekstowe tylko do odczytu, zmodyfikuj wiersz tak, aby brzmiał: $ ('input: visible: enabled: not ([readonly]): first', e.target) .focus ();
Douglas Timms

3

wypróbuj ten kod, może zadziałać dla Ciebie

$(this).find('input:text')[0].focus();

1
Oto czego używam:$(this).find('input:text').first().focus()
Jimmy

1

Najpierw musisz ustawić swój autofocusatrybut w formularzu.

<input name="full_name" autofocus/>

A potem musisz dodać deklarację, aby ustawić autofokus twojego wejścia po wyświetleniu twojego modalu.
Wypróbuj ten kod:

$(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();
    });
});

użyłem $ (this) .find ('[autofocus]'). focus (); i to działa
SummerRain

0

Jeśli chcesz po prostu automatycznie ustawić ostrość dowolnego otwartego modalu, możesz umieścić w sobie wzorce lub funkcje lib ten fragment, który skupi się na pierwszym wejściu:

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

0

jeśli szukasz fragmentu, który działałby dla wszystkich twoich modali, i automatycznie wyszukujesz pierwszy tekst wejściowy w otwartym, powinieneś użyć tego:

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

Jeśli twój modal jest ładowany przy użyciu Ajax, użyj tego zamiast tego:

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

0

jest to najbardziej ogólne rozwiązanie

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • działa z modami dodanymi do DOM po załadowaniu strony
  • działa z wejściem, obszarem tekstu, zaznaczaniem, a nie przyciskiem
  • pomija ukryte, wyłączone, tylko do odczytu
  • działa z wyblakłymi modami, nie ma potrzeby ustawiania setInterval

0

Spróbuj usunąć właściwość tabIndex modalu , gdy twoje pole wejściowe / tekstowe jest otwarte. Po zamknięciu pola wprowadzania / pola tekstowego ustaw go z powrotem na to, co kiedykolwiek było . To rozwiązałoby problem niezależnie od wersji bootstrap i bez uszczerbku dla przepływu doświadczenia użytkownika .


0

Według dokumentacji Bootstrap 4:

Ze względu na to, jak HTML5 definiuje swoją semantykę, atrybut autofocus HTML nie ma wpływu na modały Bootstrap. Aby osiągnąć ten sam efekt, użyj niestandardowego JavaScript.

Na przykład:

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

Link .


0

Użyj autofokusa, aby wyszukać odpowiedni element formularza:

$('.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();
    })
  });
});
  • To „#button” wywołuje formularz modalny,

  • „#mymodal” to forma modalna,

  • „#myinput” to wejście, na którym chcesz się skupić

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.