как запустить событие при выборе файла

95

У меня форма как

<form  onSubmit="return disableForm(this);" action="upload.php" method="post" name="f" id="wizecho" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button onClick="return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;">
        Upload Image
    </button>
</form>

Это для загрузки изображения.

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

ptamzz
источник
Если вы беспокоитесь о том, чтобы дважды выбрать один и тот же файл, @applecrusher предлагает лучшее решение, чем выбранный ответ stackoverflow.com/a/40581284/1520304
Уилл Фарли

Ответы:

130

Используйте событие изменения для ввода файла.

$("#file").change(function(){
         //submit the form here
 });
Винсент Рамдхани
источник
32
и что происходит, когда вы отправляете форму асинхронно, не уходите со страницы, а затем снова пытаетесь загрузить тот же файл? Этот код будет выполняться только один раз, второй раз, выбор того же файла не приведет к выполнению события изменения
Кристофер Томас
6
Возражение @ChristopherThomas - именно то, почему я здесь, и, к счастью, ниже есть очень недооцененный ответ, который решает его, годы спустя: stackoverflow.com/a/40581284/4526479
Кайл Бейкер
1
Событие изменения не запускается, когда я снова выбираю тот же файл. Любой другой способ, который может работать каждый раз?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
1
@ Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ См. Комментарий чуть выше вашего.
Дэвид Лопес
3
Тот факт, что в ответе не используется чистый javascript, просто неверен
Димитрис Филиппоу
69

Вы можете подписаться на событие onchange в поле ввода:

<input type="file" id="file" name="file" />

а потом:

document.getElementById('file').onchange = function() {
    // fire the upload here
};
Дарин Димитров
источник
49

Это более старый вопрос, на который требуется более новый ответ, который будет касаться проблемы @Christopher Thomas выше в комментариях к ответу на принятие. Если вы не уйдете со страницы и не выберете файл во второй раз, вам нужно очистить значение при щелчке или сенсорном запуске (для мобильных устройств). Приведенное ниже будет работать, даже если вы уйдете со страницы и используете jquery:

//the HTML
<input type="file" id="file" name="file" />



//the JavaScript

/*resets the value to address navigating away from the page 
and choosing to upload the same file */ 

$('#file').on('click touchstart' , function(){
    $(this).val('');
});


//Trigger now when you have selected any file 
$("#file").change(function(e) {
    //do whatever you want here
});
яблочная дробилка
источник
Это кроссбраузерно совместимо? Похоже, он просто использует val(''), что не работает в большинстве браузеров.
Шон Кендл
В каком браузере из того, что вы пробовали, не работает? Попробуйте клонировать объект вместе с ним, если это все еще для вас проблема.
applecrusher
2
Моя проблема заключалась в использовании. element.setAttribute("value", "")Если вы не используете jQuery, вам нужно использовать его element.value = ""для правильной очистки элемента файла.
Фил
1

Делайте все, что вы хотите сделать после успешной загрузки файла. Просто после завершения обработки файла установите значение элемента управления файлом на пустую строку. Поэтому .change () всегда будет вызываться, даже если имя файла изменится или нет. например, вы можете делать это и работали для меня как шарм

  $('#myFile').change(function () {
    LoadFile("myFile");//function to do processing of file.
    $('#myFile').val('');// set the value to empty of myfile control.
    });
Мохит Сингх
источник
1

Решение для пользователей vue, решение проблемы, когда вы загружаете один и тот же файл несколько раз и событие @change не запускается:

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }
Альб Болуш
источник
<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" /> self. $ refs.inputFile.value = ''
Прагати Дугар
0

<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" />

onFileChange(e) {
//upload file and then delete it from input 
 self.$refs.inputFile.value = ''
}
Прагати Дугар
источник
0

vanilla js с использованием es6

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
InkieBeard
источник