So setzen Sie den Fokus auf die erste Texteingabe in einem Bootstrap-Modal nach der Abbildung

116

Ich lade ein dynamisches Bootstrap-Modal und es enthält nur wenige Texteingaben. Das Problem, mit dem ich konfrontiert bin, ist, dass der Cursor sich auf die erste Eingabe in diesem Modal konzentrieren soll, und dies geschieht nicht standardmäßig.
Also habe ich diesen Code geschrieben, um es zu tun:

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

Aber jetzt konzentriert es sich für einen Moment auf die Eingabe und verschwindet dann automatisch. Warum passiert das und wie kann man es lösen?

Amr Elgarhy
quelle
2
Können Sie eine Demo auf jsfiddle.net bereitstellen ?
undefiniert
Versuchen Sie, eine Zeitüberschreitung festzulegen, da möglicherweise etwas anderes stört. setTimeout(function() { /* Your code */ }, 100);
QWERTY
kannst du das für mich versuchen ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (index) {$ ('Eingabe: Text: sichtbar: zuerst'). focus (); }
Chirag Ghiyad
Mögliches Duplikat des modalen Eingabefeldfokus
Muhammad Rehan Saeed

Antworten:

186

@scumah hat die Antwort für Sie: Twitter Bootstrap - Konzentrieren Sie sich auf den Textbereich innerhalb eines Modals beim Klicken

Für Bootstrap 2

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

Update: Für Bootstrap 3

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

========== Update ======

Als Antwort auf eine Frage können Sie diese Option mit mehreren Modalen auf derselben Seite verwenden, wenn Sie unterschiedliche Datenziele angeben, Ihre Modal-IDs entsprechend umbenennen und die IDs der Formulareingabefelder aktualisieren und schließlich Ihre JS entsprechend diesen neuen aktualisieren IDs:
siehe 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();
})
David Taiaroa
quelle
Dies funktioniert nur, wenn es ein Modal auf der Seite gibt? Was ist, wenn mehr als eine?
Ramesh Pareek
tolle, schnelle Antwort! Ich habe einen dummen Fehler gemacht, funktioniert jetzt!
Ramesh Pareek
+1 Ändern meines Codes von "anzeigen" in "angezeigt", während ich Ihre Antwort lese, nachdem ich fast eine Stunde lang versucht habe, dies zum Laufen zu bringen.
Exel Gamboa
Dies ergibt einen maximalen Callstack-Fehler, wenn die jquery-Validierung ausgelöst wird!. Daher nützt mir das nichts.
Vandita
@Vandita, wenn Sie einen Stift auf codepen.io starten möchten, der das von Ihnen beschriebene Problem veranschaulicht, würde ich ihn gerne für Sie prüfen.
David Taiaroa
80

Ich habe den besten Weg gefunden, dies ohne jQuery zu tun.

<input value="" autofocus>

funktioniert perfekt.

Dies ist ein HTML5-Attribut. Unterstützt von allen gängigen Browsern.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input

tmarois
quelle
Nachdem ich ein paar Stunden damit verbracht hatte, diese Arbeit so zu machen, wie sie sollte (klicken oder auf Handler), fand ich nur eine Methode, die funktioniert, nämlich das HTML5-Autofokus-Attribut:<input type="text" class="form-control" placeholder="" autofocus>
lot0logs
1
Hier ist, wie Sie es auf einem MVC3-Steuerelement tun können:@Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Floh
19
Es hat bei mir nicht funktioniert ... nachdem Bootstrap Modal gezeigt wurde, verliert der Eingang den Fokus
Diego Cotini
Ich sehe auch den Fokus der Eingangsverstärkung für einen Moment, nachdem das Bootstrap-Modal bei Verwendung des Autofokus angezeigt wird. Die Eingabe verliert dann jedoch den Fokus. Musste den .on () Handler implementieren.
Raddevus
7
Dies funktioniert, wenn Sie tabdindex="-1"von Ihrem Modal entfernen , funktioniert jedoch nur einmal. Das Schließen und Wiedereröffnen konzentriert sich nicht.
Memet Olsen
42

Die Antwort von David Taiaroa ist richtig, funktioniert aber nicht, da Sie sich bei der Zeit zum "Einblenden" des Modals nicht auf die Eingabe konzentrieren können. Sie müssen eine Verzögerung erstellen:

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

})
Marcos Furquim
quelle
2
Du bist der einzige hier. Ihre Lösung ist die einzige, die funktioniert. Ich habe versucht, einen kleineren Wert für timeOut festzulegen, aber es hat nicht funktioniert. Scheint modal "beendet das Laden" bei 1000ms :(
Enrique
1
Ja, aber heute, in meinem neuen Projekt, habe <input value="" autofocus>ich dieses Mal gut für mich gearbeitet, seltsam
Marcos Furquim
3
Das richtige ist, das gezeigte.bs.modal-Ereignis zu verwenden: getbootstrap.com/javascript/#modals-events
Akhorus
2
Anstatt setTimeout () zu verwenden, können Sie delay () wie folgt verwenden ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony
Auf jeden Fall die Korrekturlösung.
Frank Thomas
18

Der übliche Code (unten) funktioniert bei mir nicht:

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

Ich habe die Lösung gefunden :

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

Sehen Sie hier mehr

Éderson T. Szlachta
quelle
9

Ich habe diesen Bootstrap die folgenden Informationen auf ihrer Seite hinzugefügt:

Aufgrund der Definition der Semantik von HTML5 hat das Autofokus-HTML-Attribut in Bootstrap-Modalen keine Auswirkung. Verwenden Sie benutzerdefiniertes JavaScript, um den gleichen Effekt zu erzielen:

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

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

Amr Elgarhy
quelle
7

Dies ist der einfache Code, der am besten für alle Popups geeignet ist, die ein Eingabefeld mit Fokussierung haben

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

Ich denke, die richtigste Antwort unter der Annahme der Verwendung von jQuery ist eine Konsolidierung von Aspekten aller Antworten auf dieser Seite sowie die Verwendung des Ereignisses, das Bootstrap übergibt:

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

Es wäre auch zu ändern arbeiten $(document)zu $('.modal')oder eine Klasse zu dem modalen hinzufügen , dass Signale , dass diese Konzentration auftreten sollen, wie$('.modal.focus-on-first-input')

Phil Hodgson
quelle
2
Dies ist die beste, allgemeinste Lösung, die ich hier gesehen habe :)
Martin T.
Wenn Sie auch schreibgeschützte Textfelder ignorieren möchten, ändern Sie die folgende Zeile: $ ('Eingabe: sichtbar: aktiviert: nicht ([schreibgeschützt]): zuerst', e.target) .focus ();
Douglas Timms
3

Versuchen Sie diesen Code, es könnte für Sie funktionieren

$(this).find('input:text')[0].focus();
Jitesh Tukadiya
quelle
1
Hier ist, was ich benutze:$(this).find('input:text').first().focus()
Jimmy
1

Im ersten Schritt müssen Sie Ihr autofocusAttribut für die Formulareingabe festlegen .

<input name="full_name" autofocus/>

Und dann müssen Sie eine Deklaration hinzufügen, um den Autofokus Ihrer Eingabe einzustellen, nachdem Ihr Modal angezeigt wird.
Versuchen Sie diesen Code:

$(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();
    });
});
Fendi Septiawan
quelle
Ich habe $ (this) .find ('[Autofokus]'). focus () verwendet. und es funktioniert
SummerRain
0

Wenn Sie nur ein offenes Modal automatisch fokussieren möchten, können Sie Muster oder lib-Funktionen in dieses Snippet einfügen, das sich auf die erste Eingabe konzentriert:

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

Wenn Sie nach einem Snippet suchen, das für alle Ihre Modalitäten geeignet ist, und automatisch nach dem ersten Eingabetext im geöffneten suchen, sollten Sie Folgendes verwenden:

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

Wenn Ihr Modal mit Ajax geladen wird, verwenden Sie stattdessen Folgendes:

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

Dies ist die allgemeinste Lösung

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • Funktioniert mit Modals, die nach dem Laden der Seite zu DOM hinzugefügt wurden
  • funktioniert mit Eingabe, Textbereich, Auswahl und nicht mit Schaltfläche
  • ommits versteckt, deaktiviert, schreibgeschützt
  • funktioniert mit ausgeblendeten Modalen, setInterval ist nicht erforderlich
DanCZ
quelle
0

Versuchen Sie , die tabIndex-Eigenschaft des Modals zu entfernen , wenn Ihre Eingabe / Ihr Textfeld geöffnet ist. Stellen Sie es wieder auf das ein, was es war , wenn Sie die Eingabe / das Textfeld schließen. Dies würde das Problem unabhängig von der Bootstrap-Version beheben , ohne den Benutzererlebnisfluss zu beeinträchtigen .

Pathik
quelle
0

Laut Bootstrap 4-Dokumenten:

Aufgrund der Definition der Semantik von HTML5 hat das Autofokus-HTML-Attribut in Bootstrap-Modalen keine Auswirkung. Verwenden Sie benutzerdefiniertes JavaScript, um den gleichen Effekt zu erzielen.

Z.B:

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

Link .

Hass
quelle
0

Verwenden Sie den Autofokus, um nach dem richtigen Formularelement zu suchen:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});
gal007
quelle
-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • Es ist "#button", der die modale Form aufruft,

  • "#mymodal" ist die modale Form,

  • "#myinput" ist die Eingabe, auf die Sie sich konzentrieren möchten

Jenrry Leguia
quelle