Takip et

Angular’da Belirli Tuşları Keyup ve Keydown Olaylarına Bağlama

Angular’da Belirli Tuşları Keyup ve Keydown Olaylarına Bağlama Giriş Web uygulamalarında kullanıcı deneyimini zenginleştirmek ve etkileşimi

Angular’da Belirli Tuşları Keyup ve Keydown Olaylarına Bağlama

Giriş

Web uygulamalarında kullanıcı deneyimini zenginleştirmek ve etkileşimi artırmak için klavye olaylarını doğru bir şekilde yönetmek hayati öneme sahiptir. Kullanıcıların form doldururken “Enter” tuşuna basarak formu göndermesi, bir metin alanında belirli bir tuşa basıldığında otomatik tamamlama önerileri sunulması veya karmaşık bir editörde “Ctrl+S” ile kaydetme gibi kısayolların tanımlanması, klavye olaylarının gücünü ortaya koyar. Angular, bu tür klavye olaylarını dinlemek ve bunlara yanıt vermek için güçlü ve esnek mekanizmalar sunar. Bu makalede, Angular uygulamalarınızda keydown ve keyup olaylarına belirli tuşları nasıl bağlayacağınızı, farklı yaklaşımları, en iyi uygulamaları ve sık karşılaşılan senaryoları detaylı bir şekilde inceleyeceğiz.

Temel Klavye Olayları: Keydown, Keyup, Keypress

Web tarayıcıları, klavye etkileşimlerini yakalamak için üç ana olay sunar: keydown, keyup ve keypress. Bu olayların her birinin kendine özgü kullanım durumları ve özellikleri vardır.

Keydown Olayı

keydown olayı, bir tuşa basıldığı ve basılı tutulduğu anda tetiklenir. Tuş basılı tutulduğu sürece bu olay sürekli olarak tetiklenmeye devam eder (auto-repeat). Bu olay, fiziksel bir tuşun basıldığını algılamak için idealdir ve metinsel olmayan tuşlar (örneğin Shift, Alt, Ctrl, F1-F12 gibi fonksiyon tuşları) dahil tüm tuşlar için tetiklenir. keydown olayı, genellikle klavye kısayolları, oyun kontrolleri veya tuş basılıyken belirli bir eylemin sürekli olarak gerçekleştirilmesi gereken durumlar için kullanılır.

Keyup Olayı

keyup olayı, basılı olan bir tuşun serbest bırakıldığı anda tetiklenir. Tuşun basılı tutulma süresi veya basılıp basılmadığı önemli değildir; sadece serbest bırakılmasıyla ilgilenir. Bu olay, genellikle bir eylemin tuş bırakıldığında tamamlanması gereken durumlar için kullanılır. Örneğin, bir metin kutusuna yazarken her tuş bırakıldığında arama yapmak veya bir sürükle-bırak işlemi sırasında tuş bırakıldığında bir öğeyi bırakmak gibi senaryolarda keyup daha uygun olabilir.

Keypress Olayı (Eski ve Kullanımı Önerilmez)

keypress olayı, bir karakter üreten tuşa basıldığında tetiklenir. Metinsel olmayan tuşlar (Shift, Alt, Ctrl, F tuşları vb.) bu olayı tetiklemez. keypress olayı modern web geliştirme pratiklerinde genellikle önerilmez ve keydown veya keyup olayları ile event.key veya event.code özelliklerini kullanarak aynı işlevselliği elde etmek daha güvenli ve uyumlu bir yaklaşımdır. keypress olayının davranışları tarayıcılar arasında farklılık gösterebilir ve eski keyCode özelliğine bağımlıdır.

Klavye Olay Nesnesi (KeyboardEvent)

Her klavye olayı, KeyboardEvent türünde bir olay nesnesi (event object) ile birlikte gelir. Bu nesne, basılan tuş hakkında detaylı bilgiler içerir:
* event.key: Basılan tuşun karakter değerini döndürür (örn: “a”, “Enter”, “Shift”). Bu, kullanıcının ne yazdığını anlamak için en iyi yoldur.
* event.code: Basılan tuşun fiziksel konumunu döndürür (örn: “KeyA”, “NumpadEnter”, “ShiftLeft”). Klavye düzeninden bağımsız olarak belirli bir fiziksel tuşu algılamak istediğinizde kullanışlıdır.
* event.keyCode (Eski), event.which (Eski): Bu özellikler eski ve kullanımı önerilmez. Tarayıcılar arası uyumluluk sorunlarına yol açabilirler. Her zaman event.key veya event.code kullanmaya özen gösterin.
* event.altKey, event.ctrlKey, event.shiftKey, event.metaKey: Bu boolean özellikler, olay tetiklendiğinde ilgili değiştirici tuşların (Alt, Ctrl, Shift, Meta/Windows/Command) basılı olup olmadığını belirtir. Kısayollar için çok önemlidir.

Angular’da Klavye Olaylarını Dinleme Temelleri

Angular, klavye olaylarını dinlemek için iki ana yaklaşım sunar: doğrudan şablon üzerinden (template-driven) veya programatik olarak bileşen kodunda.

Template Üzerinden Doğrudan Bağlama

Angular’ın olay bağlama (event binding) mekanizması sayesinde, DOM elementleri üzerindeki klavye olaylarını doğrudan HTML şablonunuzda dinleyebilirsiniz. Bu, en basit ve en yaygın yöntemdir.


Yukarıdaki örnekte, elementine basılan her tuş için onKeyDown metodu, her tuş bırakıldığında ise onKeyUp metodu tetiklenecektir. $event özel anahtar kelimesi, Angular’ın olay nesnesini bileşen metodunuza parametre olarak geçirmesini sağlar.

Bileşen Kodu (TypeScript):

import { Component } from '@angular/core';

@Component({
  selector: 'app-keyboard-input',
  templateUrl: './keyboard-input.component.html',
  styleUrls: ['./keyboard-input.component.css']
})
export class KeyboardInputComponent {
  onKeyDown(event: KeyboardEvent): void {
    console.log('Tuşa basıldı:', event.key, 'Code:', event.code);
    if (event.key === 'Enter') {
      console.log('Enter tuşuna basıldı!');
      // Form gönderme veya başka bir işlem yap
    }
  }

  onKeyUp(event: KeyboardEvent): void {
    console.log('Tuş bırakıldı:', event.key, 'Code:', event.code);
    if (event.key === 'Escape') {
      console.log('Escape tuşu bırakıldı!');
      // Bir modalı kapatma veya arama kutusunu temizleme gibi işlemler
    }
  }

  onSubmit(): void {
    console.log('Form gönderildi!');
  }
}

Belirli Tuşları Dinleme

Angular, belirli tuşları dinlemek için şablon bağlamasında daha da rafine bir yol sunar. Olay adı sonuna nokta (.) ile tuş adını ekleyerek doğrudan o tuşa özel bir dinleyici oluşturabilirsiniz. Bu, if (event.key === 'Enter') gibi manuel kontrol yazmaktan sizi kurtarır ve kodu daha okunabilir hale getirir.

Tek Tuş Dinleme:



Desteklenen Tuş Takma Adları (Aliases):
Angular, yaygın kullanılan tuşlar için birçok takma ad destekler:
* enter
* escape
* space
* tab
* arrowup, arrowdown, arrowleft, arrowright
* home, end, pageup, pagedown
* delete, backspace
* f1‘den f12‘ye kadar fonksiyon tuşları
* alt, control (veya ctrl), shift, meta (Windows/Command tuşu)

Değiştirici Tuşlarla Birlikte Dinleme (Modifiers):
Birden fazla tuşu (örn: Ctrl+S) dinlemek için değiştirici tuşları da olay adına ekleyebilirsiniz:

Ctrl+S kısayolu
Shift+A kısayolu

Bileşen Kodu (TypeScript):

import { Component } from '@angular/core';

@Component({
  selector: 'app-keyboard-shortcuts',
  template: 
    
    

Enter'a basıldı!

Escape bırakıldı!

Bu alana odaklanıp Ctrl+S yapın.

Ctrl+S basıldı!

}) export class KeyboardShortcutsComponent { onEnterPressed(): void { console.log('Enter tuşuna basıldı (doğrudan)!'); // Formu gönder } onEscapeReleased(): void { console.log('Escape tuşu bırakıldı (doğrudan)!'); // Input'u temizle } onCtrlS(event: KeyboardEvent): void { console.log('Ctrl+S kombinasyonu basıldı!'); event.preventDefault(); // Tarayıcının varsayılan kaydetme davranışını engelle // Kaydetme işlemini yap } }

Önemli Not: tabindex="0" özelliğini eklemek,

gibi odaklanılamayan elementlerin klavye olaylarını dinleyebilmesi için gereklidir. Aksi takdirde, bu elementler klavye olaylarını tetiklemez.

Programatik Olarak Klavye Olaylarını Yönetme

Bazı durumlarda, klavye olaylarını daha global bir seviyede (tüm belge veya pencere) dinlemek veya daha karmaşık olay işleme mantığı uygulamak isteyebilirsiniz. Angular, HostListener dekoratörü ve RxJS’in fromEvent operatörü ile bu senaryoları destekler.

HostListener Kullanımı

HostListener dekoratörü, bir bileşen veya direktif üzerindeki DOM olaylarını dinlemenizi sağlar. Özellikle tüm belge veya pencere üzerindeki klavye olaylarını dinlemek için çok kullanışlıdır.

import { Component, HostListener } from '@angular/core';

@Component({
  selector: 'app-global-keyboard-listener',
  template: 
    

Sayfanın herhangi bir yerinde Ctrl+Alt+D tuş kombinasyonuna basın.

}) export class GlobalKeyboardListenerComponent { @HostListener('document:keydown', ['$event']) handleKeyboardEvent(event: KeyboardEvent): void { // Ctrl+Alt+D kombinasyonunu dinle if (event.ctrlKey && event.altKey && event.key === 'd') { console.log('Ctrl+Alt+D kombinasyonu algılandı!'); event.preventDefault(); // Tarayıcının varsayılan davranışını engelle // Debug modunu aç/kapat gibi bir işlem yap } // Sadece Enter tuşuna basıldığında if (event.key === 'Enter') { console.log('Enter tuşuna basıldı (HostListener ile)!'); } } @HostListener('window:keyup', ['$event']) handleWindowKeyUp(event: KeyboardEvent): void { if (event.key === 'Escape') { console.log('Escape tuşu bırakıldı (HostListener ile, pencere genelinde)!'); // Açık bir modalı kapat } } }

@HostListener('document:keydown', ['$event']):
* document: Olayın dinleneceği hedef nesne. window veya bileşenin kendi host elementi de olabilir. document tüm belge üzerindeki olayları dinler.
* keydown: Dinlenecek olay türü.
* ['$event']: Olay nesnesini metodunuza parametre olarak geçirmek için kullanılır.

HostListener ile, şablon tabanlı dinlemedeki gibi tuş adlarını doğrudan kullanamazsınız (örn: document:keydown.enter çalışmaz). Tuş kontrolünü metodunuzun içinde if koşullarıyla yapmanız gerekir.

RxJS ve fromEvent ile Daha Gelişmiş Yönetim

RxJS, Angular’ın güçlü bir parçasıdır ve olayları Observable’lar olarak ele almak için harika bir yol sunar. Özellikle karmaşık klavye etkileşimleri, olayları birleştirmek, filtrelemek, geciktirmek veya hızlandırmak (debounce/throttle) istediğinizde fromEvent operatörü çok kullanışlıdır.

Senaryo: Bir arama kutusuna yazarken, kullanıcı yazmayı bıraktıktan 500ms sonra arama isteği göndermek (debouncing).

import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';
import { fromEvent, Subscription } from 'rxjs';
import { debounceTime, filter, map, distinctUntilChanged } from 'rxjs/operators';

@Component({
  selector: 'app-rxjs-keyboard-search',
  template: 
    
    

Aranıyor: {{ searchTerm }}

}) export class RxjsKeyboardSearchComponent implements OnInit, OnDestroy { @ViewChild('searchInput', { static: true }) searchInput!: ElementRef; searchTerm: string = ''; private keyupSubscription!: Subscription; ngOnInit(): void { // Input elementindeki keyup olaylarını Observable olarak al this.keyupSubscription = fromEvent(this.searchInput.nativeElement, 'keyup') .pipe( // Sadece belirli tuşları filtreleyebiliriz, örneğin Enter veya harf/rakamlar filter(event => { const key = event.key.toLowerCase(); return (key.length === 1 && /[a-z0-9]/.test(key)) || key === 'backspace' || key === 'enter'; }), map(event => (event.target as HTMLInputElement).value), // Input'un değerini al debounceTime(500), // Kullanıcı yazmayı bıraktıktan 500ms sonra tetikle distinctUntilChanged() // Sadece değer değiştiyse tetikle ) .subscribe(value => { this.searchTerm = value; console.log('RxJS ile arama yapılıyor:', this.searchTerm); // Arama servisine isteği gönder }); // Global bir klavye kısayolu dinlemek için (örneğin Ctrl+K) fromEvent(document, 'keydown') .pipe( filter(event => event.ctrlKey && event.key === 'k') ) .subscribe(event => { event.preventDefault(); // Tarayıcının varsayılan Ctrl+K davranışını engelle console.log('Ctrl+K kısayolu RxJS ile algılandı!'); // Arama kutusuna odaklanma gibi bir eylem yap this.searchInput.nativeElement.focus(); }); } ngOnDestroy(): void { // Bellek sızıntılarını önlemek için aboneliği iptal et if (this.keyupSubscription) { this.keyupSubscription.unsubscribe(); } } }

Bu örnekte, fromEvent ile keyup olaylarını bir Observable’a dönüştürdük. Ardından pipe operatörü ile çeşitli RxJS operatörlerini kullanarak:
* filter: Sadece belirli tuşların tetiklediği olayları geçirdik.
* map: Olay nesnesinden input’un güncel değerini çıkardık.
* debounceTime: Kullanıcının yazmayı bitirmesini bekledik.
* distinctUntilChanged: Sadece input değeri gerçekten değiştiyse sonraki adıma geçilmesini sağladık.

RxJS, özellikle kompleks senaryolarda klavye olaylarını yönetmek için inanılmaz bir esneklik ve güç sunar.

Uygulama Senaryoları ve Örnekler

Klavye olaylarını bağlama yeteneği, birçok farklı uygulama senaryosunda değerlidir.

Form Girişlerinde Otomatik Odaklama veya Gönderme

* Enter ile Form Gönderme: Bir formdaki son input alanında Enter tuşuna basıldığında formu otomatik olarak göndermek.

* Tab ile Sonraki Alana Geçiş (Custom Logic): Varsayılan Tab davranışını değiştirerek belirli bir düzende alanlar arasında geçiş yapmak.

Klavye Kısayolları Oluşturma

* Kaydetme (Ctrl+S): Bir düzenleyici veya formda “Ctrl+S” tuş kombinasyonu ile veriyi kaydetme. event.preventDefault() kullanarak tarayıcının varsayılan kaydetme penceresinin açılmasını engellemeyi unutmayın.
* Geri Al/Yinele (Ctrl+Z/Ctrl+Y): Bir metin düzenleyicide yapılan değişiklikleri geri alma veya yineleme.
* Navigasyon: Ok tuşları ile bir listede veya tabloda gezinme.

  • {{ item }}

Oyun veya Etkileşimli Uygulamalar

* Karakter Hareketleri: Bir web tabanlı oyunda karakteri WASD veya ok tuşlarıyla hareket ettirme. keydown olayı, tuş basılı tutulduğu sürece sürekli hareket sağlamak için idealdir.
* Tuş Kombinasyonları: Belirli tuş kombinasyonlarıyla özel yetenekleri veya eylemleri tetikleme.

Erişilebilirlik (Accessibility) İyileştirmeleri

* Klavye ile Gezinme: Fare kullanamayan veya tercih etmeyen kullanıcılar için uygulamanın tüm özelliklerine klavye ile erişim sağlamak.
* Modal Kapatma: Bir modal penceresini “Escape” tuşu ile kapatma, standart ve beklenen bir erişilebilirlik özelliğidir.
* Odak Yönetimi: Klavye ile etkileşimde bulunurken odaklanılan elementin doğru bir şekilde yönetilmesi.

Dikkat Edilmesi Gerekenler ve En İyi Uygulamalar

Klavye olaylarını kullanırken performansı, kullanıcı deneyimini ve uyumluluğu göz önünde bulundurmak önemlidir.

Performans: Olay Dinleyici Sayısı

* Gereksiz Global Dinleyicilerden Kaçının: document veya window üzerinde çok sayıda veya karmaşık HostListener veya RxJS fromEvent dinleyicisi tanımlamak performansı etkileyebilir. Mümkün olduğunca olayları belirli elementlere veya bileşenlere bağlayın.
* Abonelikleri İptal Edin (RxJS): fromEvent ile oluşturulan Observable’lara yapılan abonelikleri ngOnDestroy yaşam döngüsü kancasında unsubscribe() ederek bellek sızıntılarını önleyin.
* Debounce ve Throttle Kullanın: Özellikle keyup olaylarında arama veya yoğun işlem gerektiren durumlarda debounceTime veya throttleTime gibi RxJS operatörlerini kullanarak olay tetikleme sıklığını sınırlayın.

Olay Yayılımını Durdurma: stopPropagation() ve preventDefault()

* event.stopPropagation(): Bir olayın DOM ağacında yukarı doğru yayılmasını (bubbling) engeller. Örneğin, iç içe geçmiş iki elementte aynı tuşu dinliyorsanız ve içteki elementteki olayın dıştaki elementi tetiklemesini istemiyorsanız kullanışlıdır.
* event.preventDefault(): Tarayıcının bir olaya karşı varsayılan davranışını engeller.
* keydown.enter ile form göndermeyi engellemek.
* keydown.space ile bir butona basıldığında sayfanın aşağı kaymasını engellemek.
* keydown.ctrl.s ile tarayıcının kaydetme penceresini açmasını engellemek.
Bu metodun doğru kullanımı, istenmeyen tarayıcı davranışlarını önlemek için kritik öneme sahiptir.

Tuş Kodları Yerine event.key ve event.code Kullanımı

Daha önce de belirtildiği gibi, eski event.keyCode ve event.which özellikleri tarayıcılar arası uyumsuzluklara yol açabilir ve kullanımları önerilmez. Bunun yerine:
* event.key: Kullanıcının basılı tuttuğu tuşun karakter değerini döndürür. Klavye düzeninden bağımsız olarak “Enter”, “Shift”, “a” gibi değerler verir. Metinsel girdiler veya genel tuş adları için idealdir.
* event.code: Basılan tuşun fiziksel konumunu döndürür. Klavye düzeninden bağımsız olarak “KeyA”, “ShiftLeft”, “NumpadEnter” gibi değerler verir. Örneğin, Amerikan klavyesinde ‘Q’ tuşu, Alman klavyesinde ‘Q’ tuşu aynı fiziksel konuma sahiptir, ancak farklı event.key değerleri döndürebilirler. Fiziksel tuş konumunu önemseyen oyunlar veya özel klavye düzeni işleme durumları için kullanışlıdır.

Kullanıcı Deneyimi ve Çakışmalar

* Tarayıcı Kısayolları ile Çakışmayın: Uygulamanızda tanımladığınız kısayolların tarayıcının veya işletim sisteminin standart kısayolları ile çakışmamasına dikkat edin. Örneğin, Ctrl+T yeni sekme açar, Ctrl+W sekmeyi kapatır. Bu tür kısayolları uygulamanızda kullanmaktan kaçınmak veya event.preventDefault() ile varsayılan davranışı engellediğinizden emin olmak önemlidir.
* Standartlara Uyum: Kullanıcıların alışkın olduğu standart klavye kısayollarını (örneğin Ctrl+S kaydetmek için) kullanmaya özen gösterin. Bu, uygulamanızın daha sezgisel ve kullanımı kolay olmasını sağlar.
* Görsel Geribildirim: Bir klavye kısayolu tetiklendiğinde kullanıcıya görsel bir geribildirim sağlamak (örneğin bir toast mesajı, bir düğmenin vurgulanması), uygulamanın daha duyarlı hissetmesini sağlar.

Sonuç

Angular, keydown ve keyup gibi klavye olaylarını yönetmek için hem basit şablon tabanlı yaklaşımlar hem de HostListener ve RxJS fromEvent ile daha gelişmiş programatik çözümler sunar. Belirli tuşları doğrudan şablonda dinleme yeteneği, yaygın senaryolar için kodu temiz ve okunabilir tutarken, programatik yaklaşımlar daha karmaşık gereksinimleri ve global olay yönetimini karşılar.

Bu makalede ele aldığımız teknikleri ve en iyi uygulamaları kullanarak, Angular uygulamalarınızda güçlü, erişilebilir ve kullanıcı dostu klavye etkileşimleri oluşturabilirsiniz. Klavye olaylarını doğru bir şekilde yönetmek, sadece gelişmiş bir kullanıcı deneyimi sağlamakla kalmaz, aynı zamanda uygulamanızın erişilebilirlik standartlarına uygunluğunu da artırır. event.key ve event.code gibi modern özelliklere odaklanarak, uygulamalarınızın geleceğe dönük ve farklı tarayıcı ile klavye düzenlerinde uyumlu olmasını sağlayın.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.