Программно вызвать диалоговое окно "выбор файла"
У меня есть скрытый элемент input файл. Можно ли вызвать его выберите файл диалоговое окно из события нажатия кнопки?
12 ответов:
если вы хотите иметь свой собственный кнопку, чтобы загрузить файл, вместо использования
<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 на не отображаемом входном файле.
большинство ответов здесь не хватает полезной информации:
Да, вы можете программно щелкнуть элемент ввода с помощью jQuery / JavaScript, но только если вы делаете это в обработчике событий, принадлежащем событию, которое было запущено пользователем!
Так, например, ничего не произойдет, если вы, скрипт, программно нажмете кнопку в обратном вызове ajax, но если вы поместите ту же строку кода в обработчик событий, который был вызван пользователем, он будет работа.
P.S. The
debugger;
ключевое слово нарушает окно просмотра, если оно находится перед программным щелчком ... по крайней мере, в chrome 33...
просто для записи, есть альтернативное решение, которое не требует 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" />
Я не уверен, как браузеры обрабатывают клики на
type="file"
элементы (проблемы безопасности и все), но это должно работать:$('input[type="file"]').click();
Я проверил это JSFiddle в Chrome, Firefox и Opera, и все они показывают диалоговое окно просмотра файлов.
Я обернуть
input[type=file]
в теге label, а затем стиль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 решение.
изначально единственный способ-это создать
<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 }) })
лучшее решение, работает во всех браузерах.. даже по мобильному.
<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>
скрытие типа входного файла вызывает проблемы с браузерами, непрозрачность является лучшим решением, потому что он не скрывается, просто не отображается. :)
С помощью jQuery вы можете позвонить
click()
для имитации щелчка.
там нет кросс-браузер способ сделать это, по соображениям безопасности. Обычно люди накладывают входной файл на что-то другое и устанавливают его видимость скрытой, чтобы он запускался самостоятельно. подробнее здесь.
для тех, кто хочет то же самое, но использует 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"/>
убедитесь, что вы используете привязку для получения реквизита компонента в 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>) } }