我正在尝试从我的 ionic 2 应用程序访问输入文件的值,但我仍然面临“EventTarget”类型上不存在属性文件的问题。因为它可以在 js 中正常工作,但不能在 typescript 中正常工作。代码如下:
document.getElementById("customimage").onchange= function(e?) {
var files: any = e.target.files[0];
EXIF.getData(e.target.files[0], function() {
alert(EXIF.getTag(this,"GPSLatitude"));
});
}
请帮我解决这个问题,因为它没有构建我的 ionic 2 应用程序。
您可以将其转换为 HTMLInputElement:
document.getElementById("customimage").onchange = function(e: Event) {
let file = (<HTMLInputElement>e.target).files[0];
// rest of your code...
}
更新:
你也可以使用这个:
let file = (e.target as HTMLInputElement).files[0];
e.target
属性类型取决于您在 getElementById(...)
上返回的元素。 files
是 input
元素的属性:https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement
在这种情况下,TypeScript 编译器不知道您正在返回 input
元素,并且我们没有专门用于此的 Event
类。因此,您可以创建一个类似以下代码的代码:
interface HTMLInputEvent extends Event {
target: HTMLInputElement & EventTarget;
}
document.getElementById("customimage").onchange = function(e?: HTMLInputEvent) {
let files: any = e.target.files[0];
//...
}
这是更多的线条,但我认为这是最清晰的。
const onChange = (event: Event) => {
const target= event.target as HTMLInputElement;
const file: File = (target.files as FileList)[0];
/** do something with the file **/
};
2022 更新:有些人正确地指出,第二行的两次强制转换是不必要的,这是完全正确的,我已经修改了我的答案。
const onChange = (event: React.ChangeEvent) => {
const target= event.target as HTMLInputElement;
const file = target.files[0];
/** do something with the file **/
};
const handleFileInput = (event: ChangeEvent) => {
const target = event.target as HTMLInputElement;
const file: File = (target.files as FileList)[0];
/** do something with the file **/
};
我会将 Event
更改为 ChangeEvent
,但是 Devin Clark 的其余部分的回答很棒:)
// use - ChangeEvent<HTMLInputElement>
document.getElementById("customimage").onchange= function(e?: ChangeEvent<HTMLInputElement>) {
var files: any = e.target.files[0];
EXIF.getData(e.target.files[0], function() {
alert(EXIF.getTag(this,"GPSLatitude"));
});
}
const onChange => (event: Event): void {
const input = event.target as HTMLInputElement;
if (!input.files?.length) {
return;
}
const file = input.files[0];
console.log(file);
}
我发现:
<input type="file" accept="image/*"
(change)="upload($event)">
和
<ion-input type="file" accept="image/*"
(change)="upload($event)"><ion-input> or (ionChange)
不以相同的方式处理事件。因此 event.target
由不同的参数组成。
因此,我没有使用 ion-input
标记,而是使用带有 (change)="upload($event)"
触发器的普通角度 <input>
标记。
它在 Ionic 4 上对我有用。
尽可能避免类型转换。使用 e.currentTarget
代替 e.target
基于其他一些答案和随着时间推移的轻微重构,我现在通常将 ChangeEvent 转换为一行,如下所示:
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const files = e.target.files;
if (!files || !files.length) {
alert("Please select a file!");
}
}
当我使用时,我只是解决了同样的问题:
e.target.files
它说目标没有文件属性,就像你在类型脚本中所说的那样。您还可以使用:
e.target['files'][0]
它解决了我的问题。
target
可能是不同类型的其他元素。最好使用e.currentTarget
,它是HTMLInputElement
。