Metin kutusunda SEKME tuşunu yakalama [kapalı]


100

TabBir metin kutusu içindeki anahtarı dört boşluk üzerinde sekme yapmak için kullanabilmek istiyorum . Şimdi olduğu gibi, Sekme tuşu imlecimi bir sonraki girişe atlar.

Metin kutusunda Sekme tuşunu kullanıcı arayüzünde kabarcık oluşturmadan önce yakalayacak bir JavaScript var mı?

Bazı tarayıcıların (örn. FireFox) buna izin vermeyebileceğini anlıyorum. Shift+ TabVeya Ctrl+ gibi özel bir tuş kombinasyonuna ne dersiniz Q?


Odaklanılan pencereyi kontrol etmeyi unutmayın ve düzenleyici metin alanında değilseniz, normal olarak kabarmasına izin verin.
FlySwat

Bu gönderi moderatör tarafından "meta.stackoverflow.com'a aittir" olarak işaretlendi, ancak iki yıldan eski olduğu için onu taşımıyorum.
Robert Harvey

Yanıtlar:


108

keydown/ keyupOlayını yakalasanız bile , bunlar sekme tuşunun tetiklediği tek olaylardır, yine de varsayılan eylemin, sekme sırasındaki sonraki öğeye geçmesini önlemek için bir yola ihtiyacınız vardır.

Firefox'ta preventDefault(), olay işleyicinize iletilen olay nesnesindeki yöntemi çağırabilirsiniz . IE'de, olay tanıtıcısından yanlış döndürmeniz gerekir. JQuery kitaplığı, preventDefaultolay nesnesi üzerinde IE ve FF'de çalışan bir yöntem sağlar .

<body>
<input type="text" id="myInput">
<script type="text/javascript">
    var myInput = document.getElementById("myInput");
    if(myInput.addEventListener ) {
        myInput.addEventListener('keydown',this.keyHandler,false);
    } else if(myInput.attachEvent ) {
        myInput.attachEvent('onkeydown',this.keyHandler); /* damn IE hack */
    }

    function keyHandler(e) {
        var TABKEY = 9;
        if(e.keyCode == TABKEY) {
            this.value += "    ";
            if(e.preventDefault) {
                e.preventDefault();
            }
            return false;
        }
    }
</script>
</body>

1
"İf (el.attachEvent)" ile "if (myInput.attachEvent)" arasındaki 4. satırı düzelttim
Fenton

Bu kodun yalnızca sonuna TAB eklediğine dikkat edin. Çoğu durumda uygunsuzdur.
Alexander Palamarchuk

@SteveFenton Boşlukları tekrar kaldırmanın basit bir yolu var mı keycode 8?
yckart

18

Form öğeleri arasında sekmeyi kırmaktansa sekme girintisinin çalışmamasını tercih ederim.

Markdown kutusuna kod girmek için girintilemek istiyorsanız, Ctrl+ K(veya Mac'te ⌘K) kullanın.

Eylemi gerçekten durdurma açısından, jQuery (Stack Overflow'un kullandığı), bir olay geri aramasından false döndürdüğünüzde bir olayın köpürmesini durduracaktır. Bu, birden çok tarayıcıyla çalışmak için hayatı kolaylaştırır.


13

Önceki cevap iyi, ancak davranışları sunumla karıştırmaya kesinlikle karşı olanlardan biriyim (HTML'ime JavaScript koyma), bu yüzden olay işleme mantığımı JavaScript dosyalarıma koymayı tercih ediyorum. Ek olarak, tüm tarayıcılar olayı (veya e) aynı şekilde uygulamaz. Herhangi bir mantığı çalıştırmadan önce bir kontrol yapmak isteyebilirsiniz:

document.onkeydown = TabExample;

function TabExample(evt) {
  var evt = (evt) ? evt : ((event) ? event : null);
  var tabKey = 9;
  if(evt.keyCode == tabKey) {
    // do work
  }
}

6

Bir anahtarın varsayılan davranışını değiştirmemenizi tavsiye ederim. Mümkün olduğunca fareye dokunmadan yapıyorum, bu yüzden sekme tuşumun bir form üzerindeki bir sonraki alana geçmemesini sağlarsanız çok kötüleşirim.

Bununla birlikte, özellikle büyük kod blokları ve iç içe yerleştirmede bir kısayol tuşu yararlı olabilir. Shift-TAB kötü bir seçenektir çünkü normalde bu beni bir formdaki önceki alana götürür. Belki de WMD düzenleyicisinde, kısayol tuşu olan bir kod-SEKME eklemek için yeni bir düğme mümkün olabilir mi?


1
Soru tamamen uygulamaya bağlıdır. Bir kod düzenleyici kontrolü üzerinde çalışıyorum. Bir sekme anahtarı sağlamadım ve öğrencilerimin hepsi şikayet etti. Kör olan bir öğrencim için erişilebilirliği bozmak istemediğim için yapmadım. Şimdi sekme desteği ekledim, ancak aynı zamanda kapatmak için bir kullanıcı tercih seçeneği de sağladım.
Charles

@Charles, erişilebilirlik etkileri hakkında çok iyi bir nokta.
Wally Lawless

4

ScottKoon tarafından verilen en iyi cevapta bir sorun var

işte burada

} else if(el.attachEvent ) {
    myInput.attachEvent('onkeydown',this.keyHandler); /* damn IE hack */
}

Olmalı

} else if(myInput.attachEvent ) {
    myInput.attachEvent('onkeydown',this.keyHandler); /* damn IE hack */
}

Bu nedenle IE'de işe yaramadı. ScottKoon'un kodu güncelleyeceğini umuyoruz


3

Mac'teki Chrome'da, alt-tab bir <textarea>alana bir sekme karakteri ekler .

Işte bir tane: . Çiş!

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.