HTML <input type = 'file'> Evento de selección de archivo


144

Digamos que tenemos este código:

<form action='' method='POST' enctype='multipart/form-data'>
    <input type='file' name='userFile'><br>
    <input type='submit' name='upload_btn' value='upload'>
</form>

lo que resulta en esto:

imagen que muestra el botón de navegación y carga

Cuando el usuario hace clic en el botón 'Examinar ...', se abre un cuadro de diálogo de búsqueda de archivos:

imagen que muestra un cuadro de diálogo de búsqueda de archivos con un archivo seleccionado

El usuario seleccionará el archivo haciendo doble clic en el archivo o haciendo clic en el botón 'Abrir'.

¿Hay algún evento de Javascript que pueda usar para recibir una notificación después de seleccionar el archivo?


66
¡Qué vieja interfaz de usuario de Windows!
El-Burritos

@ El-Burritos esto fue publicado en 2010; por supuesto, es una vieja interfaz de usuario de Windows: D
Simon Cheng

Respuestas:


181

Escucha el evento de cambio.

input.onchange = function(e) { 
  ..
};

3
vamos a escribirlo donde ... en las etiquetas de script javascript
Luna

55
sí en las etiquetas de script, o podría agregarlo como un atributo ( <input type="file" onchange="..." />) aunque esto no se recomienda.
Anurag

77
Tenga en cuenta que en IE7 y 8 el evento de 'cambio' no se propaga al evento de formulario. Debe poner su oyente en la etiqueta <input>.
xer0x

36
¿Qué pasa si un usuario necesita "recargar" un archivo? onchange no se activará, pero aún así debería recargarse como si lo estuviera cargando por primera vez.
bryc

11
Tenga en cuenta que esto no funciona si el usuario elige el mismo archivo más de una vez seguidas, ya que el archivo no cambió.
bob0the0mighty

46

Cuando tiene que volver a cargar el archivo, puede borrar el valor de entrada. La próxima vez que agregue un archivo, se activará el evento 'al cambiar'.

document.getElementById('my_input').value = null;
// ^ that just erase the file path but do the trick

55
Eso funciona bien, pero tenga en cuenta el comportamiento extraño de IE <11. No le permite cambiar el valor de entrada, por lo que lo más probable es que necesite una solución alternativa. stackoverflow.com/questions/9011644/…
Oleksandr Tkalenko

15

Forma jQuery:

$('input[name=myInputName]').change(function(ev) {

    // your code
});

4

Se llama al evento Change incluso si hace clic en cancelar.


2
Sería útil si proporcionara algún código para explicar su respuesta, ya que no hay ningún evento de cambio mencionado en el fragmento de código de Preguntas
DevDig

Creo que @anthony se refiere al siguiente escenario: Seleccione un archivo. Ahora abra el selector de archivos nuevamente, pero esta vez haga clic en Cancelar. Como no se seleccionó ningún archivo la segunda vez, el control de entrada de archivo se restablece, cambiando así su selección inicial, y se activa el evento de cambio.
dvlsc

Lo probé en Chrome 83 y el evento no se activa cuando hago clic en el botón Cancelar. Esta respuesta es bastante antigua y supongo que debe haberse solucionado, al menos en Chrome.
Saeed Ahadian

3

Así lo hice con JS puro:

var files = document.getElementById('filePoster');
var submit = document.getElementById('submitFiles');
var warning = document.getElementById('warning');
files.addEventListener("change", function () {
  if (files.files.length > 10) {
    submit.disabled = true;
    warning.classList += "warn"
    return;
  }
  submit.disabled = false;
});
#warning {
    text-align: center;
}

#warning.warn {
	color: red;
	transform: scale(1.5);
	transition: 1s all;
}
<section id="shortcode-5" class="shortcode-5 pb-50">
    <p id="warning">Please do not upload more than 10 images at once.</p>
    <form class="imagePoster" enctype="multipart/form-data" action="/gallery/imagePoster" method="post">
        <div class="input-group">
  	    <input id="filePoster" type="file" class="form-control" name="photo" required="required" multiple="multiple" />
	    <button id="submitFiles" class="btn btn-primary" type="submit" name="button">Submit</button>
        </div>
    </form>
</section>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.