Cara mengatur fokus untuk bidang tertentu dalam modal Bootstrap, setelah muncul

182

Saya telah melihat beberapa pertanyaan terkait dengan bootstrap modals, tetapi tidak ada yang persis seperti ini, jadi saya akan melanjutkan.

Saya memiliki modal yang saya sebut onclick seperti ...

$(".modal-link").click(function(event){
  $("#modal-content").modal('show');
});

Ini berfungsi dengan baik, tetapi ketika saya menunjukkan modal saya ingin fokus pada elemen input pertama ... Mungkin elemen input pertama memiliki id #photo_name.

Jadi saya mencoba

   $(".modal-link").click(function(event){
     $("#modal-content").modal('show');
     $("input#photo_name").focus();
   });

Tetapi ini tidak berhasil. Terakhir, saya mencoba mengikat ke acara 'show' tetapi meskipun begitu, input tidak akan fokus. Terakhir hanya untuk pengujian, karena saya curiga ini adalah tentang urutan pemuatan js, saya memasukkan setTimeout hanya untuk melihat apakah saya menunda sebentar, apakah fokus akan bekerja, dan ya, itu berhasil! Tetapi metode ini jelas omong kosong. Apakah ada cara untuk memiliki efek yang sama seperti di bawah ini tanpa menggunakan setTimeout?

  $("#modal-content").on('show', function(event){
    window.setTimeout(function(){
      $(event.currentTarget).find('input#photo_name').first().focus()
    }, 0500);
  });
teman
sumber

Jawaban:

371

Coba ini

Ini DEMO lama :

EDIT: (Ini DEMO yang berfungsi dengan Bootstrap 3 dan jQuery 1.8.3)

$(document).ready(function() {
    $('#modal-content').modal('show');
    $('#modal-content').on('shown', function() {
        $("#txtname").focus();
    })
});

Memulai bootstrap 3 perlu menggunakan even.bs.modal:

$('#modal-content').on('shown.bs.modal', function() {
    $("#txtname").focus();
})
gaurang171
sumber
3
Terima kasih. Saya belum melihat acara "ditampilkan". Persis apa yang saya cari.
jdkealy
Terima kasih! demo tidak berfungsi lagi tetapi cuplikannya tidak.
Kreker
@keyur di codebins.com Acara ini dimulai setelah modal ditampilkan, bagaimana jika saya harus memulai acara sebelum modal ditampilkan
Thomas Shelby
okej, saya harus menggunakan 'show.bs.modal' alih-alih 'ditampilkan.bs.modal'
Thomas Shelby
tentang penangan fokus, memerlukan sedikit keterlambatan sehingga Anda harus tetapi dalam setInterval hal-hal seperti ini: setInterval (function () {$ ("# your-input"). focus ();}, 50);
Nguyen Minh Hien
76

Hanya ingin mengatakan bahwa Bootstrap 3 menangani ini sedikit berbeda. Nama acara "ditampilkan.bs.modal".

$('#themodal').on('shown.bs.modal', function () {
   $("#txtname").focus();
});

atau letakkan fokus pada input pertama yang terlihat seperti ini:

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

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

David Beck
sumber
Ini bekerja untuk saya jika saya menggunakan .on ('show.bs.modal') tidak ditampilkan
Peter Graham
Butuh banyak waktu sementara saya melihat itu harus "ditampilkan.b ..." bukan "show.bs ...". Tampilkan tidak berfungsi untuk saya. Sebenarnya mereka berdua bekerja dan mereka adalah acara yang berbeda. Maaf abaikan kalimat pertamaku.
Vladyn
@ PeterGraham mungkin Anda menggunakan bootstrap 2?
FindOutIslamNow
10

Saya menggunakan ini di tata letak saya untuk menangkap semua modals dan fokus pada input pertama

  $('.modal').on('shown', function() {
     $(this).find('input').focus();
  });
Joe Beams
sumber
Manis. Elemen input pertama saya disembunyikan, jadi saya pikir saya harus melakukan: $ (this) .find ('input: not ([type = hidden])'). Focus ();
jdkealy
2
Atau$(this).find('input:visible').focus();
Stephan Muller
2
seharusnya $ (this) .find ('input'). first (). focus () jika Anda tidak ingin memfokuskan semua input
Jacek Pietal
9

Saya punya masalah yang sama dengan bootstrap 3, fokus ketika saya mengklik tautan, tetapi tidak ketika memicu acara dengan javascript. Solusinya:

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

Mungkin ini tentang animasi!

Alejandro Fiore
sumber
Pasti ada sesuatu yang terjadi dengan modal animasi. Bahkan jika saya mematikan modal memudar dalam opsi, itu tidak akan membuat jika ada tugas intensif CPU setelah modal muncul. Menggunakan batas waktu ini adalah satu-satunya cara saya bisa membuatnya bekerja.
krx
8

Saya punya masalah untuk menangkap acara "ditampilkan.bs.modal" .. Dan ini solusi saya yang berfungsi sempurna ..

Alih-alih sederhana di ():

$('#modal').on 'shown.bs.modal', ->

Gunakan pada () dengan elemen yang didelegasikan:

$('body').on 'shown.bs.modal', '#modal', ->
Michal Macejko
sumber
6

Sepertinya itu karena modal animasi diaktifkan ( fadedi kelas dialog), setelah memanggil.modal('show') , dialog tidak segera terlihat, sehingga tidak bisa mendapatkan fokus saat ini.

Saya dapat memikirkan dua cara untuk mengatasi masalah ini:

  1. Hapus fadedari kelas, sehingga dialog langsung terlihat setelah menelepon .modal('show'). Anda dapat melihat http://codebins.com/bin/4ldqp7x/4 untuk demo. (Maaf @keyur, saya salah mengedit dan menyimpan versi baru dari contoh Anda)
  2. Panggilan focus()di shownacara seperti apa yang @keyur menulis.
SAPikachu
sumber
Terima kasih. Saya berharap saya bisa menandai dua jawaban sebagai benar: hal. Ya, saya bahkan tidak ingin efek "pudar", jadi menghapus itu berfungsi. Saya menghapus fade dan menambahkan acara yang ditampilkan.
jdkealy
4

Saya telah menciptakan cara dinamis untuk memanggil setiap acara secara otomatis. Ini sempurna untuk memfokuskan bidang, karena memanggil acara sekali saja, menghapusnya setelah digunakan.

function modalEvents() {
    var modal = $('#modal');
    var events = ['show', 'shown', 'hide', 'hidden'];

    $(events).each(function (index, event) {
        modal.on(event + '.bs.modal', function (e) {
            var callback = modal.data(event + '-callback');
            if (typeof callback != 'undefined') {
                callback.call();
                modal.removeData(event + '-callback');
            }
        });
    });
}

Anda hanya perlu memanggil modalEvents()dokumen siap.

Menggunakan:

$('#modal').data('show-callback', function() {
    $("input#photo_name").focus();
});

Jadi, Anda dapat menggunakan modal yang sama untuk memuat apa yang Anda inginkan tanpa khawatir tentang menghapus acara setiap saat.

Danilo Colasso
sumber
Itu yang saya butuhkan! Terima kasih kawan!
Pengembang
3

Saya memiliki masalah yang sama dengan bootstrap 3 dan dipecahkan seperti ini:

$('#myModal').on('shown.bs.modal', function (e) {
    $(this).find('input[type=text]:visible:first').focus();
})

$('#myModal').modal('show').trigger('shown');
edercortes
sumber
0

Bootstrap acara modal acara

$('#modal-content').on('show.bs.modal', function() {
$("#txtname").focus();

})

AdminDev826
sumber
-1

Solusi yang lebih bersih dan lebih modular mungkin:

$(document).ready(function(){
    $('.modal').success(function() { 
        $('input:text:visible:first').focus();
    });  
});

Atau gunakan ID Anda sebagai contoh:

$(document).ready(function(){
    $('#modal-content').modal('show').success(function() {
        $('input:text:visible:first').focus();
    });  
});

Semoga itu bisa membantu ..

menghidupkan kembali
sumber
Tidak ada fungsi yang berhasil.
Avinash