为什么我无法使用打字稿伪造 <a> link 为 <input type=file> 打开文件对话框
Why I cannot open file dialog with typescript faking <a> link for <input type=file>
这是我的情况、代码和来自 Whosebug 的参考资料。
我想触发打开的对话框,我找到了参考,但它们似乎不起作用;
首先是我的代码片段:
<i class="fas fa-upload uploadicon"></i><br>
Drop document here or
<a href="javascript:;" class="dropimgmessage" id="uploadLink" name="uploadLink" ngbTooltip="Click to upload a document or drag here!" placement="top">browse</a>
<input type="file" class="form-control fileuploader" #fileInput id="api-file-container" formControlName="docUpload" name="api-file-container" (change)="handleFileInput($event.target.files)">
<span class="dropimagetypemsg">Supports PDF, JPG, PNG, GIF</span>
现在我的打字稿:
declaration of variables:
public uploadlink: HTMLElement;
public fileinput: HTMLElement;
------
ngAfterViewInit() {
this.uploadlink = document.querySelector('#uploadLink') as HTMLElement;
this.fileinput = document.querySelector('#api-file-container') as HTMLElement;
this.uploadlink.addEventListener('click', (e: Event) => {
e.preventDefault();
this.fileinput.click();
});
}
发生的情况是代码触发,但从未进入片段:
this.uploadlink.addEventListener('click', (e: Event) => {
它在 .addEventListener 处停止。
所以我尝试像这样从 HTML 调用函数 onClick。
public fakeFileInput(e: Event): void {
console.log('Fake Input to File Upload: ', e);
if(this.uploadlink.getAttribute('text') === 'browse') {
console.log('EVENT browse upload was click: ');
this.uploadlink.setAttribute('defaultPrevented', 'false');
this.fileinput.click();
}
}
像这样将调用添加到函数中:
<a href="javascript:;" (click)="fakeFileInput($event)" class="dropimgmessage" id="uploadLink" name="uploadLink" ngbTooltip="Click to upload a document or drag here!" placement="top">browse</a>
现在可以了,但是,我在这里收到一个错误:文件选择器对话框只能在用户激活时显示。
我的参考资料:
How to open a file / browse dialog using javascript?
How to make a link act as a file input
在 JSFiddle 上 - http://jsfiddle.net/7aGEv/3/
那么,我哪里错了?
谢谢。
如果堆栈中没有用户交互(由浏览器控制),您无法以编程方式触发文件上传打开。这是浏览器的一项安全功能,可防止恶意网站诱骗用户上传文件。
你不需要任何 JS 来触发没有按钮的文件上传,你可以简单地使用一个标签:
<label for="uploadInput">browse</label>
<input id="uploadInput" type="file" style="display:none" />
这是我的情况、代码和来自 Whosebug 的参考资料。
我想触发打开的对话框,我找到了参考,但它们似乎不起作用;
首先是我的代码片段:
<i class="fas fa-upload uploadicon"></i><br>
Drop document here or
<a href="javascript:;" class="dropimgmessage" id="uploadLink" name="uploadLink" ngbTooltip="Click to upload a document or drag here!" placement="top">browse</a>
<input type="file" class="form-control fileuploader" #fileInput id="api-file-container" formControlName="docUpload" name="api-file-container" (change)="handleFileInput($event.target.files)">
<span class="dropimagetypemsg">Supports PDF, JPG, PNG, GIF</span>
现在我的打字稿:
declaration of variables:
public uploadlink: HTMLElement;
public fileinput: HTMLElement;
------
ngAfterViewInit() {
this.uploadlink = document.querySelector('#uploadLink') as HTMLElement;
this.fileinput = document.querySelector('#api-file-container') as HTMLElement;
this.uploadlink.addEventListener('click', (e: Event) => {
e.preventDefault();
this.fileinput.click();
});
}
发生的情况是代码触发,但从未进入片段:
this.uploadlink.addEventListener('click', (e: Event) => {
它在 .addEventListener 处停止。
所以我尝试像这样从 HTML 调用函数 onClick。
public fakeFileInput(e: Event): void {
console.log('Fake Input to File Upload: ', e);
if(this.uploadlink.getAttribute('text') === 'browse') {
console.log('EVENT browse upload was click: ');
this.uploadlink.setAttribute('defaultPrevented', 'false');
this.fileinput.click();
}
}
像这样将调用添加到函数中:
<a href="javascript:;" (click)="fakeFileInput($event)" class="dropimgmessage" id="uploadLink" name="uploadLink" ngbTooltip="Click to upload a document or drag here!" placement="top">browse</a>
现在可以了,但是,我在这里收到一个错误:文件选择器对话框只能在用户激活时显示。
我的参考资料:
How to open a file / browse dialog using javascript?
How to make a link act as a file input
在 JSFiddle 上 - http://jsfiddle.net/7aGEv/3/
那么,我哪里错了?
谢谢。
如果堆栈中没有用户交互(由浏览器控制),您无法以编程方式触发文件上传打开。这是浏览器的一项安全功能,可防止恶意网站诱骗用户上传文件。
你不需要任何 JS 来触发没有按钮的文件上传,你可以简单地使用一个标签:
<label for="uploadInput">browse</label>
<input id="uploadInput" type="file" style="display:none" />