2010-11-05 9 views
58

Quiero iniciar un evento cuando el usuario selecciona un archivo. Haciéndolo con el evento .change funciona si el usuario cambia el archivo cada vez.¿Cómo detectar el tipo de entrada = archivo "cambio" para el mismo archivo?

Pero quiero activar el evento si el usuario selecciona el mismo archivo nuevamente. Seleccionar archivo

  1. usuario A.jpg (activa el evento de selección)
  2. usuario de archivos (B.jpg desencadena el evento)
  3. usuario seleccione el archivo B.jpg (caso no se dispara, lo quiero al fuego)

¿Cómo puedo hacerlo?

Respuesta

42

Puede engañarlo. Elimine el elemento de archivo y agréguelo en el mismo lugar en el evento change. Borrará la ruta del archivo haciéndolo cambiable todo el tiempo.

Example on jsFiddle.

O puede simplemente usar .prop("value", ""), ver this example on jsFiddle.

  • jQuery 1.6 + prop
  • versiones anteriores attr

O utilizar .val("")

+0

Pero esto no funciona para los requisitos de OP, ¿verdad? –

+0

@Pekka: No exactamente. Pero él puede simplemente adaptarlo. Digamos que necesita publicar el archivo. Después de la publicación, puede llamar a una función js que eliminará y agregará el nuevo selector de archivos. Es factible – BrunoLM

+3

tenga en cuenta que cuando utiliza '.attr (" value "," ")' o '.val (" ")' (como sugiere @ wagner-leonardi a continuación) Internet Explorer activará el evento de cambio mientras que Chrome no – fadomire

1

No se puede hacer que change se encienda aquí (corregir el comportamiento, ya que no ha cambiado nada). Sin embargo, también puede vincular click ... aunque esto también puede disparar ... aunque no hay mucho terreno intermedio entre los dos.

$("#fileID").bind("click change", function() { 
    //do stuff 
}); 
+2

@downvoter - care to comment? –

+0

Parece que solo está repitiendo sus palabras y '.click()' no es "disparar al volver a seleccionar". – BrunoLM

+0

@BrunoLM - No, no es ... pero creo que leyó la parte donde digo que no puede hacer esto, el 'clic 'es lo más cercano posible. –

14

Tengo esto para trabajar en la limpieza del valor de entrada de archivo onClick y luego enviar el archivo onChange. Esto permite al usuario seleccionar el mismo archivo dos veces seguidas y tener el evento de cambio de disparo para publicar en el servidor. Mi ejemplo usa el the jQuery form plugin.

$('input[type=file]').click(function(){ 
    $(this).attr("value", ""); 
}) 
$('input[type=file]').change(function(){ 
    $('#my-form').ajaxSubmit(options);  
}) 
+0

'onClick' se dispara antes de' onChange', por lo que este método funciona muy bien para mí. – iplus26

+0

Esta fue una solución muy elegante y debe marcarse como respuesta. –

4

Este trabajo para mí

<input type="file" onchange="function();this.value=null;return false;"> 
+0

Supongo que quería decir algo como function() {this.value = null; falso retorno; } – Prozi

52

Si ha intentado .attr("value", "") y no funcionaba, no se asuste (como yo)

Eso sí, .val("") lugar, y trabajará bien

+7

jaja: D, miré a mi alrededor para ver si estabas sentado a mi lado –

+1

super respuesta! :) – YdB

+2

Esta debería ser la respuesta aceptada. –

1

Si no desea utilizar jQuery

<form enctype='multipart/form-data'> 
    <input onchange="alert(this.value); return false;" type='file'> 
    <br> 
    <input type='submit' value='Upload'> 
</form> 

Funciona bien en Firefox, pero para Chrome necesita agregar this.value=null; después de la alerta.

0

Puede usar form.reset() para borrar la entrada files list input. Esto restablecerá todos los campos a los valores predeterminados, pero en muchos casos puede que solo esté usando el tipo de entrada = 'archivo' en un formulario para cargar archivos de todos modos. En esta solución, no es necesario clonar el elemento y volver a conectar los eventos.

Gracias a philiplehmann

0

Bueno, tuve misma edición. Usé el evento "input" (o oninput) en lugar de change y funcionó como charm.

1

Puede simplemente configurar nulo la ruta del archivo cada vez que el usuario hace clic en el control. Ahora, incluso si el usuario selecciona el mismo archivo, se activará el evento onchange.

<input id="file" onchange="file_changed(this)" onclick="this.value=null;" type="file" accept="*/*" /> 
+0

Necesitaba una solución como esta. Es realmente corto y hace el trabajo. Buen pensamiento Mariusz Wiazowski. –

Cuestiones relacionadas