Cara Menetapkan fokus ke input teks pertama dalam modal bootstrap setelah ditampilkan

116

Saya memuat modal bootstrap dinamis dan berisi beberapa input teks. Masalah yang saya hadapi adalah saya ingin kursor fokus pada masukan pertama dalam modal ini, dan ini tidak terjadi secara default.
Jadi saya menulis kode ini untuk melakukannya:

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

Tapi sekarang fokus pada masukan sejenak kemudian hilang secara otomatis, mengapa ini terjadi dan bagaimana mengatasinya?

Amr Elgarhy
sumber
2
Bisakah Anda memberikan demo di jsfiddle.net ?
tidak ditentukan
Coba tetapkan waktu tunggu untuk itu, ada hal lain yang mungkin mengganggu. setTimeout(function() { /* Your code */ }, 100);
qwerty
dapatkah Anda mencobanya untuk saya ... var index = 0; $ ('# modalContainer'). on ('show', function () {index = 1;}); if (indeks) {$ ('input: text: visible: first'). focus (); }
chirag ghiyad
Kemungkinan duplikat fokus bidang input modal bootstrap Twitter
Muhammad Rehan Saeed

Jawaban:

187

@scumah memiliki jawaban untuk Anda: Twitter bootstrap - Fokus pada textarea di dalam modal on click

Untuk Bootstrap 2

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

Pembaruan: Untuk Bootstrap 3

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

========== Perbarui ======

Menanggapi pertanyaan, Anda dapat menggunakan ini dengan beberapa modals pada halaman yang sama jika Anda menentukan target data yang berbeda, mengganti nama ID modals Anda untuk mencocokkan dan memperbarui ID dari field input form, dan terakhir memperbarui JS Anda agar sesuai dengan yang baru ini. ID:
lihat 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
sumber
ini hanya berfungsi jika ada satu modal di halaman? bagaimana jika lebih dari satu?
Ramesh Pareek
bagus, tanggapan cepat! Saya membuat kesalahan konyol, bekerja sekarang!
Ramesh Pareek
+1 Mengubah kode saya dari "tampilkan" menjadi "ditampilkan" seperti yang saya baca dalam jawaban Anda setelah hampir satu jam mencoba membuatnya berfungsi.
Exel Gamboa
Ini memberikan kesalahan callstack maksimum ketika validasi jquery diaktifkan !. Karenanya ini tidak ada gunanya bagiku.
Vandita
@Vandita, jika Anda ingin memulai pena di codepen.io yang menggambarkan masalah yang Anda gambarkan, saya akan dengan senang hati melihatnya untuk Anda.
David Taiaroa
80

Saya menemukan cara terbaik untuk melakukan ini, tanpa jQuery.

<input value="" autofocus>

bekerja dengan sempurna.

Ini adalah atribut html5. Didukung oleh semua browser utama.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input

tmarois
sumber
Setelah menghabiskan beberapa jam mencoba untuk mendapatkan pekerjaan ini sebagaimana mestinya (klik atau pada penangan) saya menemukan hanya satu metode yang berfungsi yaitu atribut autofocus html5:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs
1
Berikut adalah bagaimana Anda dapat melakukannya pada kontrol MVC3: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Flea
19
Itu tidak berhasil untuk saya ... setelah menunjukkan modal bootstrap, input kehilangan fokus
Diego Cotini
Saya juga melihat input mendapatkan fokus sesaat setelah modal bootstrap muncul saat menggunakan fokus otomatis. Namun, masukan tersebut kemudian kehilangan fokus. Harus menerapkan penangan .on ().
raddevus
7
Ini berfungsi jika Anda menghapus tabdindex="-1"dari modal Anda, namun ini hanya berfungsi sekali. Menutup dan membuka kembali tidak fokus.
Memet Olsen
42

Jawaban David Taiaroa benar, tetapi tidak berhasil karena waktu untuk "menghilang" dalam modal tidak memungkinkan Anda menetapkan fokus pada masukan. Anda perlu membuat penundaan:

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

})
Marcos Furquim
sumber
2
Anda satu-satunya di sini. Solusi Anda adalah satu-satunya yang berhasil. Saya mencoba menetapkan nilai yang lebih kecil untuk timeOut tetapi tidak berhasil. Sepertinya modal "selesai memuat" pada 1000ms :(
Enrique
1
ya, tapi hari ini, dalam proyek baru saya, saya menggunakan <input value="" autofocus>dan bekerja dengan baik untuk saya kali ini, aneh
Marcos Furquim
3
Yang benar adalah menggunakan acara shown.bs.modal
Akhorus
2
Daripada menggunakan setTimeout (), Anda dapat menggunakan delay () seperti berikut ... $ ('# textareaID'). Delay (1000) .focus (). Select ();
Tony
Pasti solusi koreksi.
Frank Thomas
18

Kode biasa (di bawah) tidak berfungsi untuk saya:

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

Saya menemukan solusinya :

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

lihat lebih lanjut di sini

Éderson T. Szlachta
sumber
9

Saya mendapat bootstrap itu menambahkan info berikut di halaman mereka:

Karena cara HTML5 mendefinisikan semantiknya, atribut HTML fokus otomatis tidak berpengaruh dalam mode Bootstrap. Untuk mendapatkan efek yang sama, gunakan beberapa JavaScript khusus:

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

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

Amr Elgarhy
sumber
7

Ini adalah kode sederhana yang akan bekerja paling baik untuk Anda pada semua popup yang memiliki kolom input dengan memfokuskannya

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

Menurut saya jawaban yang paling benar, dengan asumsi penggunaan jQuery, adalah konsolidasi aspek dari semua jawaban di halaman ini, ditambah penggunaan acara yang dilewati Bootstrap:

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

Ini juga akan bekerja mengubah $(document)ke $('.modal')atau menambahkan kelas ke modal yang menandakan bahwa fokus ini harus terjadi, seperti$('.modal.focus-on-first-input')

Phil Hodgson
sumber
2
Ini adalah solusi terbaik dan paling umum yang pernah saya lihat di sini :)
Martin T.
Jika Anda juga ingin mengabaikan kotak teks hanya baca, ubah baris menjadi: $ ('input: visible: enabled: not ([readonly]): first', e.target) .focus ();
Douglas Timms
3

coba kode ini, mungkin berhasil untuk Anda

$(this).find('input:text')[0].focus();
Jitesh Tukadiya
sumber
1
Inilah yang saya gunakan:$(this).find('input:text').first().focus()
Jimmy
1

Langkah pertama, Anda harus mengatur autofocusatribut Anda pada input formulir.

<input name="full_name" autofocus/>

Dan kemudian Anda harus menambahkan deklarasi untuk mengatur fokus otomatis input Anda setelah modal Anda ditampilkan.
Coba kode ini:

$(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
sumber
saya menggunakan $ (this) .find ('[autofocus]'). focus (); dan berhasil
SummerRain
0

Jika Anda hanya ingin memfokuskan otomatis modal apa pun yang terbuka, Anda dapat memasukkan pola atau fungsi lib cuplikan ini yang akan fokus pada masukan pertama:

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

jika Anda mencari potongan yang akan bekerja untuk semua modals Anda, dan secara otomatis mencari teks masukan pertama di yang terbuka, Anda harus menggunakan ini:

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

Jika modal Anda dimuat menggunakan ajax, gunakan ini sebagai gantinya:

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

ini adalah solusi paling umum

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • berfungsi dengan modal yang ditambahkan ke DOM setelah pemuatan halaman
  • bekerja dengan input, textarea, pilih dan bukan dengan tombol
  • ommits tersembunyi, nonaktif, hanya baca
  • bekerja dengan modals pudar, tidak perlu setInterval
DanCZ
sumber
0

Cobalah untuk menghapus properti tabIndex dari modal , ketika input / textbox Anda terbuka. Setel kembali ke sebelumnya , saat Anda menutup input / kotak teks. Ini akan menyelesaikan masalah terlepas dari versi bootstrap , dan tanpa mengorbankan alur pengalaman pengguna .

Pathik
sumber
0

Menurut Bootstrap 4 dokumen:

Karena cara HTML5 mendefinisikan semantiknya, atribut HTML fokus otomatis tidak berpengaruh dalam mode Bootstrap. Untuk mendapatkan efek yang sama, gunakan beberapa JavaScript khusus.

Misalnya:

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

Tautan .

hatef
sumber
0

Gunakan fokus otomatis untuk mencari elemen formulir yang tepat:

$('.modal').on('shown.bs.modal', function() {
  $(this).find('[autofocus]').focus();
});
gal007
sumber
-1
$(document).ready(function() {
  $("#button").click(function() {
    $('#mymodal').on('shown.bs.modal', function() {
      $('#myinput').focus();
    })
  });
});
  • Ini adalah "#button" yang memanggil bentuk modal,

  • "#mymodal" adalah bentuk modal,

  • "#myinput" adalah masukan yang ingin Anda fokuskan

Jenrry Leguia
sumber