Bir kez göründüğünde, Bootstrap modundaki belirli bir alan için odağı ayarlama


182

Bootstrap modals ile ilgili birkaç soru gördüm, ama hiçbiri tam olarak böyle değil, bu yüzden devam edeceğim.

Dediğim bir modal var.

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

Bu iyi çalışıyor, ancak mod gösterildiğinde ilk giriş öğesine odaklanmak istiyorum ... Bu durumda ilk giriş öğesinin #photo_name kimliği vardır.

Ben de denedim

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

Ama bu işe yaramadı. Son olarak, 'show' olayına bağlanmayı denedim, ancak buna rağmen, giriş odaklanmayacak. Son olarak sadece test için, bu js yükleme sırası ile ilgili bir şüphe vardı, ben sadece bir saniye gecikme olup olmadığını görmek için bir setTimeout koymak, odak işe yarayacak ve evet, işe yarıyor! Ancak bu yöntem açıktır. SetTimeout kullanmadan aşağıdaki ile aynı etkiye sahip olmanın bir yolu var mı?

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

Yanıtlar:


371

Bunu dene

İşte eski DEMO :

EDIT: (İşte Bootstrap 3 ve jQuery 1.8.3 ile çalışan bir DEMO )

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

Bootstrap 3'ü başlatmak için shown.bs.modal olayını kullanmanız gerekir:

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

3
Teşekkür ederim. "Gösterilen" etkinliği görmemiştim. Tam aradığım şey.
jdkealy

Teşekkürler! demo artık çalışmıyor ancak snippet çalışıyor.
Kreker

@ keyur at codebins.com Bu olay, mod gösterildikten sonra başlar, mod gösterilmeden önce olayı başlatmam gerekirse
Thomas Shelby

okej, 'shown.bs.modal' yerine 'show.bs.modal' kullanmalıyım
Thomas Shelby

odak işleyicisi hakkında, biraz gecikme gerektirir, ancak böyle bir setInterval öğesinde yapmanız gerekir: setInterval (function () {$ ("# your-input"). focus ();}, 50);
Nguyen Minh Hien

76

Sadece Bootstrap 3'ün bunu biraz farklı ele aldığını söylemek istedim. Etkinlik adı "shown.bs.modal" şeklindedir.

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

veya odağı şöyle görünür olan ilk girişe koyun:

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

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


Gösterilmeyen .on ('show.bs.modal') kullandıysam benim için çalıştı
Peter Graham

"Show.bs ..." yerine "shown.bs ..." olması gerektiğini gördüğümde çok zaman aldı. Şov benim için çalışmadı. Aslında ikisi de çalışıyor ve farklı etkinlikler. Üzgünüm ilk cümleyi görmezden geldim.
Vladyn

@PeterGraham belki de bootstrap 2 kullanıyorsunuz?
FindOutIslamNow

10

Bunu tüm modaları yakalamak ve ilk girdiye odaklanmak için mizanpajımda kullanıyorum

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

Tatlı. Benim ilk girdi öğesi olsa gizlidir, bu yüzden yapmak zorunda olacağını düşünüyorum: $ (this) .find ('input: not ([type = hidden])'). Focus ();
jdkealy

2
Veya$(this).find('input:visible').focus();
Stephan Muller

2
tüm girişlere odaklanmak istemiyorsanız $ (this) .find ('input'). first (). focus () olmalıdır
Jacek Pietal

9

Bootstrap 3 ile aynı sorunu vardı, bağlantıyı tıkladığınızda odaklanıyorum, ancak javascript ile olayı tetiklediğimde değil. Çözüm:

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

Muhtemelen animasyonla ilgili bir şey!


Kalıcı animasyonda kesinlikle bir şeyler oluyor. Seçeneklerdeki kalıcı solmayı kapatsam bile, kalıcı açılır pencereden hemen sonra CPU yoğun bir görev varsa görüntülenmez. Bu zaman aşımını kullanmak, onu çalıştırabilmemin tek yoludur.
krx

8

"Shown.bs.modal" etkinliğini yakalamakta sorun yaşadım .. Ve bu benim çözümüm mükemmel çalışan ..

Bunun yerine basit ():

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

Yetki verilen öğeyle () kullan:

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

6

Aramadan sonra modsal animasyonun etkinleştirildiği ( fadeiletişim kutusunun sınıfında) olduğu anlaşılıyor.modal('show') iletişim kutusu hemen görünmez, bu yüzden şu anda odaklanamıyor.

Bu sorunu çözmenin iki yolunu düşünebilirim:

  1. Kaldır fadeiletişim çağırarak hemen sonra görünür olması için, sınıf .modal('show'). Demo için http://codebins.com/bin/4ldqp7x/4 adresini görebilirsiniz . (Üzgünüm @keyur, yanlışlıkla örneğinizin yeni sürümü olarak düzenledim ve kaydettim)
  2. Çağrı focus()içinde shown@keyur yazdıklarını gibi olay.

Teşekkür ederim. Keşke iki cevabı corrent olarak etiketleyebilseydim: s. Evet, "solmayı" bile etkilemek istemedim, bu yüzden kaldırma işe yarıyor. Solmayı kaldırdım ve gösterilen etkinliği ekledim.
jdkealy

4

Her etkinliği otomatik olarak çağırmak için dinamik bir yol oluşturdum. Bir alanı odaklamak mükemmeldir, çünkü etkinliği bir kez çağırır ve kullanımdan sonra kaldırır.

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

Sadece modalEvents()belge hazır aramak gerekir .

kullanın:

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

Böylece, olayları her seferinde kaldırma konusunda endişelenmeden yüklemek için aynı modal'ı kullanabilirsiniz.


Buna ihtiyacım var! Sağ ol, kanka!
Geliştirici

3

Bootstrap 3 ile aynı sorunu vardı ve böyle çözüldü:

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

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


0

Bootstrap kalıcı gösteri etkinliği

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

})


-1

Biraz daha temiz ve daha modüler bir çözüm olabilir:

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

Veya bunun yerine kimliğinizi örnek olarak kullanmak için:

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

Umarım yardımcı olur..


Böyle bir fonksiyon başarısı yok.
Avinash
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.