我只想用我的KeyboardEvent来做这件事
var tag = evt.target.tagName.toLowerCase();
Run Code Online (Sandbox Code Playgroud)
虽然Event.target的类型为EventTarget,但它不会从Element继承.所以我必须这样投:
var tag = (<Element>evt.target).tagName.toLowerCase();
Run Code Online (Sandbox Code Playgroud)
这可能是因为有些浏览器没有遵循标准,对吧?TypeScript中与浏览器无关的正确实现是什么?
PS:我正在使用jQuery来捕获KeyboardEvent.
JLR*_*she 43
它不会继承,Element
因为并非所有事件目标都是元素.
元素,文档和窗口是最常见的事件目标,但其他对象也可以是事件目标,例如XMLHttpRequest,AudioNode,AudioContext等.
即使KeyboardEvent
你正在尝试使用的东西也可能出现在DOM元素或窗口对象上(理论上也可能出现在其他东西上),所以就在那里evt.target
定义为一个没有意义Element
.
如果它是DOM元素上的事件,那么我会说你可以安全地假设evt.target
.是一个Element
.我不认为这是跨浏览器行为的问题.仅仅EventTarget
是一个比抽象界面更抽象的界面Element
.
进一步阅读:https://typescript.codeplex.com/discussions/432211
Ban*_*ali 34
使用typescript,我使用仅适用于我的函数的自定义界面.用例示例.
handleChange(event: { target: HTMLInputElement; }) {
this.setState({ value: event.target.value });
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,handleChange将接收一个目标字段为HTMLInputElement类型的对象.
稍后在我的代码中我可以使用
<input type='text' value={this.state.value} onChange={this.handleChange} />
Run Code Online (Sandbox Code Playgroud)
更简洁的方法是将接口放在单独的文件中.
interface HandleNameChangeInterface {
target: HTMLInputElement;
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下函数定义:
handleChange(event: HandleNameChangeInterface) {
this.setState({ value: event.target.value });
}
Run Code Online (Sandbox Code Playgroud)
在我的用例中,明确定义了handleChange的唯一调用者是HTML元素类型的输入文本.
Sim*_*amp 22
JLRishe的答案是正确的,所以我只是在我的事件处理程序中使用它:
if (event.target instanceof Element) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
dim*_*iax 19
要检索属性,必须将target强制转换为适当的数据类型:
e => console.log((e.target as Element).id)
Run Code Online (Sandbox Code Playgroud)
Wic*_*ams 13
您能否创建自己的通用接口来扩展Event
. 像这样的东西?
interface DOMEvent<T extends EventTarget> extends Event {
readonly target: T
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
handleChange(event: DOMEvent<HTMLInputElement>) {
this.setState({ value: event.target.value });
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
53666 次 |
最近记录: |