Answers:
它不是从继承的,Element
因为并非所有事件目标都是元素。
从MDN:
元素,文档和窗口是最常见的事件目标,但是其他对象也可以是事件目标,例如XMLHttpRequest,AudioNode,AudioContext等。
即使KeyboardEvent
您尝试使用的对象,也可能出现在DOM元素或window对象上(理论上是在其他事物上),因此在此处将evt.target
其定义为没什么意义Element
。
如果这是DOM元素上的事件,那么我可以肯定地说evt.target
。是一个Element
。我认为这与跨浏览器的行为无关。只是那EventTarget
是一个比更加抽象的接口Element
。
KeyboardEvent
s可以同时出现在DOM元素和窗口对象上(以及从理论上讲是其他事情),因此,不可能给出KeyboardEvent.target
比更加具体的类型EventTarget
,除非您认为KeyboardEvent
也应该是泛型类型,KeyboardEvent<T extends EventTarget>
并希望被迫将KeyboardEvent<Element>
所有内容放入整个代码中。那时,最好还是进行显式转换,尽管可能会很痛苦。
value
属性<select>
。例如let target = <HTMLSelectElement> evt.target;
使用打字稿,我使用了仅适用于我的函数的自定义界面。示例用例。
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 });
}
在我的用例中,明确定义了handleChange的唯一调用者是输入文本的HTML元素类型。
handleKeyUp = (event: React.KeyboardEvent<HTMLInputElement> & { target: HTMLInputElement }) => {...}
要检索属性,必须将target强制转换为适当的数据类型:
e => console.log((e.target as Element).id)
<HTMLInputElement>event.target;
语法相同吗?
as
介绍语法,因为它与JSX冲突。建议使用as
以保持一致性。basarat.gitbooks.io/typescript/docs/types/type-assertion.html
使用typescript,我们可以利用类型别名,如下所示:
type KeyboardEvent = {
target: HTMLInputElement,
key: string,
};
const onKeyPress = (e: KeyboardEvent) => {
if ('Enter' === e.key) { // Enter keyboard was pressed!
submit(e.target.value);
e.target.value = '';
return;
}
// continue handle onKeyPress input events...
};
var element = ev.target as HTMLElement