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?


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

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

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


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

})

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


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


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

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


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

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

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

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

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

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 .


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 .


0

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

$('.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();
    })
  });
});
  • Es ist "#button", der die modale Form aufruft,

  • "#mymodal" ist die modale Form,

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.