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.