Gösterildikten sonra bir önyükleme modelinde ilk metin girişine odak nasıl ayarlanır


116

Dinamik bir önyükleme modeli yüklüyorum ve birkaç metin girişi içeriyor. Karşılaştığım sorun, imlecin bu modaldaki ilk girdiye odaklanmasını istemem ve bu varsayılan olarak gerçekleşmiyor.
Ben de bunu yapmak için bu kodu yazdım:

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

Ama şimdi bir an için girdiye odaklanıyor ve sonra otomatik olarak uzaklaşıyor, bu neden oluyor ve nasıl çözülür?


2
Jsfiddle.net'te bir demo sunabilir misiniz?
tanımsız

Bunun için bir zaman aşımı ayarlamayı deneyin, başka bir şey karışıyor olabilir. setTimeout(function() { /* Your code */ }, 100);
qwerty

bunu benim için deneyebilir misin ... var index = 0; $ ('# modalContainer']. on ('göster', fonksiyon () {dizin = 1;}); eğer (dizin) {$ ('input: metin: görünür: ilk'). focus (); }
chirag ghiyad

Yanıtlar:


187

@scumah sizin için cevabı buluyor: Twitter bootstrap - Tıklandığında bir modal içindeki metin alanına odaklanın

Bootstrap 2 için

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

Güncelleme: Bootstrap 3 için

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

========== Güncelle ======

Bir soruya yanıt olarak, farklı veri hedefleri belirlerseniz, modal kimliklerinizi form giriş alanlarının kimlikleriyle eşleşecek ve güncelleyecek şekilde yeniden adlandırırsanız ve son olarak JS'nizi bu yenilerle eşleşecek şekilde güncellerseniz aynı sayfada birden çok modda kullanabilirsiniz. Kimlikler:
bkz. 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();
})

bu sadece sayfada bir modal varsa çalışır? ya birden fazla ise?
Ramesh Pareek

harika, hızlı yanıt! Aptalca bir hata yaptım, şimdi çalışıyor!
Ramesh Pareek

+1 Bunu çalıştırmaya çalıştıktan yaklaşık bir saat sonra cevabınızı okurken kodumu "göster" yerine "gösterilen" olarak değiştiriyorum.
Exel Gamboa

Bu, jquery doğrulaması tetiklendiğinde maksimum çağrı yığını hatası verir !. Dolayısıyla bunun bana bir faydası yok.
Vandita

@Vandita, codepen.io'da tarif ettiğiniz sorunu gösteren bir kalem başlatmak isterseniz sizin için ona bakmaktan memnuniyet duyarım.
David Taiaroa

80

Bunu jQuery olmadan yapmanın en iyi yolunu buldum.

<input value="" autofocus>

Mükemmel çalışıyor.

Bu bir html5 özelliğidir. Tüm büyük tarayıcılar tarafından desteklenir.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input


Bu işi nasıl yapması gerektiği (tıklama veya işleyiciler üzerinde) için birkaç saat harcadıktan sonra, işe yarayan tek bir yöntem buldum, bu html5 otofokus niteliği:<input type="text" class="form-control" placeholder="" autofocus>
lots0logs

1
İşte bunu bir MVC3 kontrolünde nasıl yapabileceğiniz: @Html.TextBoxFor(m => m.UserName, new { @autofocus="" })
Bit

19
Benim için işe yaramadı ... önyükleme
modunu

Otomatik odaklama kullanılırken önyükleme modu göründükten sonra bir an için girdi kazanım odağını görüyorum. Ancak, giriş daha sonra odağı kaybeder. .On () işleyicisini uygulamak gerekiyordu.
raddevus

7
Bu tabdindex="-1", modelinizden kaldırırsanız işe yarar , ancak yalnızca bir kez çalışır. Kapatma ve yeniden açma odaklanmaz.
Memet Olsen

42

David Taiaroa'nın cevabı doğru, ancak işe yaramıyor çünkü modal "geçme" zamanı girdiye odaklanmanıza izin vermiyor. Bir gecikme yaratmanız gerekiyor:

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

})

2
Buradaki tek hak sensin. Çözümünüz, işe yarayan tek çözümdür. TimeOut için daha küçük bir değer ayarlamaya çalıştım ama işe yaramadı. 1000ms'de modal "yüklemeyi bitiriyor" görünüyor :(
Enrique

1
evet, ama bugün, yeni <input value="" autofocus>
projemde

3
Doğru olan, shown.bs.modal olayını kullanmaktır: getbootstrap.com/javascript/#modals-events
Akhorus

2
SetTimeout () kullanmak yerine, aşağıdaki gibi delay () kullanabilirsiniz ... $ ['# textareaID']. Delay (1000) .focus (). Select ();
Tony

Kesinlikle düzeltme çözümü.
Frank Thomas

18

Normal kod (aşağıda) benim için çalışmıyor :

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

Çözümü buldum :

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

burada daha fazlasını görün


9

Bu bootstrap'in sayfalarına aşağıdaki bilgileri ekledim:

HTML5'in anlambilimini nasıl tanımladığından dolayı, otomatik odaklama HTML niteliğinin Bootstrap modlarında hiçbir etkisi yoktur. Aynı etkiyi elde etmek için bazı özel JavaScript kullanın:

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

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


7

Bu, odaklanan herhangi bir giriş alanına sahip tüm açılır pencerelerde sizin için en iyi şekilde çalışacak basit koddur.

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

4

Bence en doğru cevap, jQuery kullanımını varsayarsak, bu sayfadaki tüm cevapların yönlerinin birleştirilmesi ve ayrıca Bootstrap'in geçtiği olayın kullanımıdır:

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

Ayrıca , modala bu odaklanmanın gerçekleşmesi gerektiğini gösteren bir sınıf eklemek veya değiştirmek $(document)için de çalışacaktır.$('.modal')$('.modal.focus-on-first-input')


2
Bu benim :) Burada gördüğüm en iyi, en genel çözümdür
Martin T.

Ayrıca salt okunur metin kutularını da yok saymasını istiyorsanız, satırı şu şekilde değiştirin: $ ('input: visible: enabled: not ([salt okunur]): first', e.target) .focus ();
Douglas Timms

3

bu kodu deneyin, sizin için çalışabilir

$(this).find('input:text')[0].focus();

1
İşte kullandığım şey:$(this).find('input:text').first().focus()
Jimmy

1

İlk adım, autofocusözniteliğinizi form girişinde ayarlamanız gerekir .

<input name="full_name" autofocus/>

Ve sonra, modal gösterildikten sonra girişinizin otomatik odaklamasını ayarlamak için bildirim eklemeniz gerekir.
Bu kodu deneyin:

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

$ (this) .find ('[autofocus]'). focus (); ve işe yarıyor
SummerRain

0

Açık olan herhangi bir kipi otomatik odaklamak istiyorsanız, ilk girdiye odaklanacak olan bu pasajı size kalıplar veya lib işlevleri koyabilirsiniz:

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

0

Tüm kipleriniz için işe yarayacak bir pasaj arıyorsanız ve açılmış olanın 1. giriş metnini otomatik olarak arıyorsanız, şunu kullanmalısınız:

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

Modaliniz ajax kullanılarak yüklenmişse, bunun yerine şunu kullanın:

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

0

bu en genel çözüm

$('body').on('shown.bs.modal', '.modal', function () {
    $(this).find(":input:not(:button):visible:enabled:not([readonly]):first").focus();
});
  • Sayfa yüklendikten sonra DOM'a eklenen modlarla çalışır
  • giriş, metin alanı, seç ve düğmeyle çalışır
  • ommits gizli, devre dışı, salt okunur
  • soluk modlarla çalışır, setInterval'e gerek yoktur

0

Giriş / metin kutunuz açıkken kipin tabIndex özelliğini kaldırmayı deneyin . Giriş / metin kutusunu kapattığınızda olduğu gibi geri ayarlayın . Bu sorun çözeceği konusundaki bakılmaksızın önyükleme sürümü ve kullanıcı deneyimi akışını ödün vermeden .


0

Bootstrap 4 belgelerine göre:

HTML5'in anlambilimini nasıl tanımladığından dolayı, otomatik odaklama HTML niteliğinin Bootstrap modlarında hiçbir etkisi yoktur. Aynı etkiyi elde etmek için bazı özel JavaScript kullanın.

Örneğin:

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

Bağlantı .


0

Doğru form öğesini aramak için otomatik odaklamayı kullanın:

$('.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();
    })
  });
});
  • Modal formu çağıran "#button" dır,

  • "#mymodal" modal biçimdir,

  • Odaklanmak istediğiniz girdi "# myinput"

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.