我有一个隐藏文件输入元素。是否可以通过按钮的单击事件触发选择文件对话框?
答案 0 :(得分:128)
如果您希望自己的按钮上传文件而不是使用<input type="file" />
,则可以执行以下操作:
<input id="myInput" type="file" style="visibility:hidden" />
<input type="button" value="Show Dialog" onclick="$('#myInput').click();" />
请注意,我使用的是visibility: hidden
,而不是display: none
。您无法在未显示的文件输入上调用click事件。
答案 1 :(得分:95)
这里的大多数答案都缺乏有用的信息:
是的,您可以使用jQuery / JavaScript以编程方式单击input元素,但前提是您在属于用户启动的事件的事件处理程序中执行此操作!
因此,例如,如果脚本以编程方式单击ajax回调中的按钮,则不会发生任何事情,但如果您将相同的代码行放在用户引发的事件处理程序中,则它将起作用。
P.S。 debugger;
关键字会破坏浏览窗口,如果它在程序化点击之前...至少在chrome 33 ...
答案 2 :(得分:58)
仅供记录,有一种不需要javascript的替代解决方案。这是一个黑客攻击,利用点击标签将焦点设置在相关输入上的事实。
你需要一个<label>
具有正确的for
属性(指向输入),optionnaly样式就像一个按钮(使用bootstrap,使用btn btn-default
)。当用户单击标签时,对话框将打开,例如:
<!-- optionnal, to add a bit of style -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<!-- minimal setup -->
<label for="exampleInput" class="btn btn-default">
Click me
</label>
<input type="file" id="exampleInput" style="display: none" />
答案 3 :(得分:12)
我不确定浏览器如何处理type="file"
元素的点击(安全问题和所有问题),但这应该有效:
$('input[type="file"]').click();
我在Chrome,Firefox和Opera中测试了this JSFiddle,他们都显示了文件浏览对话框。
答案 4 :(得分:3)
如今,像这样的混合解决方案可以获得最佳体验,
let fileHandle;
async function fileOpen() {
[fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
console.log(await file.text());
}
// The advantage of this is fileHandle can be used to save to
// the opened file itself later, read more on this in https://web.dev/file-system-access/
// in April 2021, window.showOpenFilePicker still not support in Safari
// so one should have this around also
function legacyFileOpen() {
var input = document.createElement('input');
input.type = 'file';
input.onchange = function () {
input.files[0].arrayBuffer().then(function (arrayBuffer) {
console.log(new TextDecoder().decode(arrayBuffer));
});
}
input.click();
}
答案 5 :(得分:2)
最佳解决方案适用于所有浏览器..甚至可以在移动设备上使用。
<div class="btn" id="s_photo">Upload</div>
<input type="file" name="s_file" id="s_file" style="opacity: 0;">';
<!--jquery-->
<script>
$("#s_photo").click(function() {
$("#s_file").trigger("click");
});
</script>
隐藏输入文件类型会导致浏览器出现问题,不透明度是最佳解决方案,因为它不会隐藏,只是不显示。 :)
答案 6 :(得分:2)
本地唯一的方法是创建一个<input type="file">
元素,然后模拟点击,不幸的是。
有一个很小的插件(无耻的插件)可以消除不必一直这样做的痛苦:file-dialog
fileDialog()
.then(file => {
const data = new FormData()
data.append('file', file[0])
data.append('imageName', 'flower')
// Post to server
fetch('/uploadImage', {
method: 'POST',
body: data
})
})
答案 7 :(得分:2)
我将input[type=file]
打包在标签标签中,然后根据自己的喜好设置label
的样式,并隐藏input
。
<label class="btn btn-default fileLabel" data-toggle="tooltip" data-placement="top" title="Upload">
<input type="file">
<span><i class="fa fa-upload"></i></span>
</label>
<style>
.fileLabel input[type="file"] {
position: fixed;
top: -1000px;
}
</style>
纯CSS解决方案。
答案 8 :(得分:1)
出于安全原因,没有跨浏览器的方式。人们通常做的是将输入文件覆盖在其他内容上,并将其可见性设置为隐藏,以便它自己触发。 More info here.
答案 9 :(得分:0)
使用jQuery,您可以调用click()
来模拟点击。
答案 10 :(得分:0)
这对我有用:
$('#fileInput').val('');
答案 11 :(得分:0)
对于那些想要相同但正在使用React的人
openFileInput = () => {
this.fileInput.click()
}
<a href="#" onClick={this.openFileInput}>
<p>Carregue sua foto de perfil</p>
<img src={img} />
</a>
<input style={{display:'none'}} ref={(input) => { this.fileInput = input; }} type="file"/>
答案 12 :(得分:0)
确保使用绑定来获取REACT
中的组件道具class FileUploader extends Component {
constructor (props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
onChange=(e,props)=>{
const files = e.target.files;
const selectedFile = files[0];
ProcessFileUpload(selectedFile,props.ProgressCallBack,props.ErrorCallBack,props.CompleatedCallBack,props.BaseURL,props.Location,props.FilesAllowed);
}
handleClick = () => {
this.refs.fileUploader.click();
}
render()
{
return(
<div>
<button type="button" onClick={this.handleClick}>Select File</button>
<input type='file' onChange={(e)=>this.onChange(e,this.props)} ref="fileUploader" style={{display:"none"}} />
</div>)
}
}
答案 13 :(得分:0)
<div id="uploadButton">UPLOAD</div>
<form action="[FILE_HANDLER_URL]" style="display:none">
<input id="myInput" type="file" />
</form>
<script>
const uploadButton = document.getElementById('uploadButton');
const myInput = document.getElementById('myInput');
uploadButton.addEventListener('click', () => {
myInput.click();
});
</script>
答案 14 :(得分:0)
以编程方式浏览文件
function browseFile(accept) {
const promise = resolvingPromise();
const input = document.createElement('input');
input.type = "file";
input.accept = accept;
input.onchange = function (e) {
const files = e.target.files;
promise.resolve(files);
}
setTimeout(function () {
click(input);
}, 0);
return promise;
}
function click(node) {
try {
node.dispatchEvent(new MouseEvent('click'))
} catch (e) {
const evt = document.createEvent('MouseEvents')
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null)
node.dispatchEvent(evt);
}
}