2015-03-06 12 views
32

ben sadece benim KeyboardEventNeden Event.target, Typescript'te Öğe Değil? Event.target o Unsuru devralan gelmez EventTarget tip iken

var tag = evt.target.tagName.toLowerCase(); 

ile bunu yapmak istiyor. Yani ben böyle döküm zorunda:

var tag = (<Element>evt.target).tagName.toLowerCase(); 

Bu hak nedeniyle standartlara uymayan bazı tarayıcılar için muhtemelen? TypeScript'te doğru tarayıcı agnostik uygulaması nedir?

Not: KeyboardEvent'i yakalamak için jQuery kullanıyorum.

+0

HTMLElement –

cevap

25

Tüm olay hedefleri öğeler olmadığından Element'dan miras almaz.

From MDN:

Eleman, belge ve pencere en yaygın olay hedeflerdir, ancak diğer nesneler örnek XMLHttpRequest, AudioNode, AudioContext, ve diğerleri için de olay hedefleri olabilir.

bile KeyboardEvent bunu evt.target için anlamlı olmaz bu yüzden orada, bir DOM öğesindeki veya pencere nesne üzerinde (ve teorik olarak başka şeyler üzerinde) ortaya çıkabilir kullanmaya çalışıyorsanız bir şekilde tanımlanacak Element.

DOM öğesinde bir olay olması durumunda, evt.target güvenli bir şekilde kabul edebileceğinizi söyleyebilirim. bir Element. Bunun tarayıcılar arası bir davranış sorunu olduğunu düşünmüyorum. Sadece EventTarget, Element'dan daha soyut bir arabirimdir.

fazla okuma: typescript kullanma https://typescript.codeplex.com/discussions/432211

+2

olarak bir bit temizleyici sözdizimi 'var element = ev.target Bu durumda, KeyboardEvent ve MouseEvent her zaman ilişkili Öğeyi içerecek olan kendisinin EventTarget eşdeğerine sahip olmalıdır. DOM çok tehlikeli ...:/ –

+0

@ daniel.sedlacek TypeScript'in tip sistemindeki sınırlamalar için DOM'ı suçluyormuşsunuz gibi geliyor. Düz Javascript kullanan kullanıcıların 'Event.target' kullanarak sorun yaşamadık. – JLRishe

+4

DOM'da veya TypeScript'te uzman değilim, ancak EventTarget'ın tasarımının çok fazla belirsizlik içerdiğini ve bunun TypeScript ile hiçbir ilgisi olmadığını söyleyebilirim. –

2

, ben sadece benim işlevine uygulayan özel arabirim kullanırlar. Örnek kullanım durumu.

Bu durumda, handleChange, HTMLInputElement türünde bir hedef alana sahip bir nesne alır.

Sonra benim kodda Ben ayrı dosyaya arayüzü koymak olacaktır

<input type='text' value={this.state.value} onChange={this.handleChange} /> 

Bir temizlikçi yaklaşım kullanabilirsiniz.

interface HandleNameChangeInterface { 
    target: HTMLInputElement; 
} 

daha sonra aşağıdaki işlevi tanımı kullanın: Benim USECASE olarak

handleChange(event: HandleNameChangeInterface) { 
    this.setState({ value: event.target.value }); 
    } 

, açıkça handleChange tek arayan giriş metninin bir HTML elemanı türü olduğunu tanımladı.

İlgili konular