cómo disparar evento en la selección de archivo

95

Tengo una forma como

<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>

Es subir una imagen.

Aquí necesito hacer clic en el botón para cargar la imagen y debo usar onClickevento. Quiero eliminar el botón de carga y tan pronto como se seleccione el archivo en la entrada, quiero activar el evento. ¿¿Cómo puedo hacer eso??

ptamzz
fuente
Si le preocupa seleccionar el mismo archivo dos veces, @applecrusher tiene una mejor solución que la respuesta seleccionada stackoverflow.com/a/40581284/1520304
Will Farley

Respuestas:

130

Utilice el evento de cambio en la entrada del archivo.

$("#file").change(function(){
         //submit the form here
 });
Vincent Ramdhanie
fuente
32
y ¿qué sucede cuando envía el formulario de forma asincrónica, no navega fuera de la página y luego intenta cargar el mismo archivo nuevamente? Este código solo se ejecutará una vez, la segunda vez, seleccionar el mismo archivo no ejecutará un evento de cambio
Christopher Thomas
6
La objeción de @ChristopherThomas es exactamente la razón por la que estoy aquí, y afortunadamente hay una respuesta muy poco votada a continuación que lo resuelve, años después: stackoverflow.com/a/40581284/4526479
Kyle Baker
1
El evento de cambio no se activa cuando vuelvo a seleccionar el mismo archivo. ¿Alguna otra forma que pueda funcionar siempre?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
1
@ Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ Vea el comentario justo encima del suyo.
David Lopez
3
El hecho de que la respuesta no use javascript puro es simplemente incorrecto
Dimitris Filippou
69

Puede suscribirse al evento onchange en el campo de entrada:

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

y entonces:

document.getElementById('file').onchange = function() {
    // fire the upload here
};
Darin Dimitrov
fuente
49

Esta es una pregunta anterior que necesita una respuesta más nueva que abordará la preocupación de @Christopher Thomas arriba en los comentarios de la respuesta de aceptación. Si no navega fuera de la página y luego selecciona el archivo por segunda vez, debe borrar el valor cuando hace clic o hace un inicio táctil (para dispositivos móviles). Lo siguiente funcionará incluso cuando navegue fuera de la página y use 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
});
trituradora de manzanas
fuente
¿Es compatible con varios navegadores? Parece que solo está usando val(''), lo que no funciona en la mayoría de los navegadores.
Sean Kendle
¿En qué navegador no funciona el que probaste? Intente clonar el objeto consigo mismo si todavía es un problema para usted.
applecrusher
2
Mi problema fue usar element.setAttribute("value", "")Si no está usando jQuery, debe usar element.value = ""para que el elemento del archivo se borre realmente correctamente.
Phil
1

Haga lo que quiera hacer después de que el archivo se cargue correctamente. Justo después de completar el procesamiento del archivo, establezca el valor del control del archivo en una cadena en blanco. De modo que el .change () siempre se llamará incluso si el nombre del archivo cambia o no. como, por ejemplo, puedes hacer esto y funcionó para mí como un encanto

  $('#myFile').change(function () {
    LoadFile("myFile");//function to do processing of file.
    $('#myFile').val('');// set the value to empty of myfile control.
    });
Mohit Singh
fuente
1

Solución para los usuarios de vue, que resuelve el problema cuando carga el mismo archivo varias veces y el evento @change no se activa:

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }
Alb Bolush
fuente
<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" /> self. $ refs.inputFile.value = ''
Pragati Dugar
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 = ''
}
Pragati Dugar
fuente
0

vainilla js usando es6

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
InkieBeard
fuente