以编程方式触发“选择文件”对话框

时间:2011-12-21 19:44:01

标签: javascript jquery html

我有一个隐藏文件输入元素。是否可以通过按钮的单击事件触发选择文件对话框?

15 个答案:

答案 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);
    }
}