2015-03-06 5 views
32

Я просто хочу сделать это с моим KeyboardEventПочему Event.target не элемент в машинописном тексте?

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

Хотя Event.target имеет тип EventTarget не наследуем от элемента. Так что я должен бросить это так:

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

Это, вероятно, из-за некоторые браузеры не ниже стандартов, не так ли? Какова правильная реализация агностики браузера в TypeScript?

PS: Я использую jQuery для захвата KeyboardEvent.

+0

Чистый синтаксис 'var element = ev.target как HTMLElement' –

ответ

25

Он не наследуется от Element, потому что не все объекты событий являются элементами.

From MDN:

элемент, документ, и окна являются наиболее распространенными объектами событий, но и другие объекты могут быть объектами событий тоже, например, XMLHttpRequest, AudioNode, AudioContext и другие.

Даже KeyboardEvent вы пытаетесь использовать может происходить на DOM элемента или оконного объекта (и теоретически на другие вещи), так что тут он не имеет смысла для evt.target быть определен как Element.

Если это событие на элементе DOM, то я бы сказал, что вы можете смело предположить evt.target. это Element. Я не думаю, что это вопрос кросс-браузерного поведения. Просто, что EventTarget является более абстрактным интерфейсом, чем Element.

Дальнейшее чтение: https://typescript.codeplex.com/discussions/432211

+2

В этом случае KeyboardEvent и MouseEvent должны иметь собственный эквивалент EventTarget, который всегда будет содержать ассоциированный элемент. DOM настолько изворотливый ...:/ –

+0

@ daniel.sedlacek Похоже, вы обвиняете DOM в ограничениях в системе типов TypeScript. У людей, использующих простой Javascript, нет проблем с использованием 'Event.target'. – JLRishe

+4

Я не специалист по DOM и TypeScript, но я бы сказал, что дизайн EventTarget имеет слишком много двусмысленности и не имеет ничего общего с TypeScript. –

2

Использование машинописи, я использую пользовательский интерфейс, который относится только к моей функции. Пример использования.

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

В этом случае handleChange получит объект с целевым полем типа HTMLInputElement.

Позже в моем коде, я могу использовать

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

уборщик подход будет поместить интерфейс в отдельный файл.

interface HandleNameChangeInterface { 
    target: HTMLInputElement; 
} 

потом использовать следующее определение функции:

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

В моей USECASE, это четко определенно, что только вызывающее handleChange является элемент HTML типа ввода текста.

Смежные вопросы