Программно вызвать диалоговое окно "выбор файла"


У меня есть скрытый элемент input файл. Можно ли вызвать его выберите файл диалоговое окно из события нажатия кнопки?

12 72

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() для имитации щелчка.

там нет кросс-браузер способ сделать это, по соображениям безопасности. Обычно люди накладывают входной файл на что-то другое и устанавливают его видимость скрытой, чтобы он запускался самостоятельно. подробнее здесь.

это сработало для меня:

$('#fileInput').val('');

для тех, кто хочет то же самое, но использует 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>)
  }
}