Quiero activar un evento cuando el usuario selecciona un archivo. Hacerlo con .change
evento funciona si el usuario cambia el archivo cada vez.
Pero quiero activar el evento si el usuario selecciona el mismo archivo nuevamente.
- Archivo de selección de usuario
A.jpg
(evento de incendios) - Archivo de selección de usuario
B.jpg
(evento de incendios) - Archivo de selección de usuario
B.jpg
(el evento no se dispara, quiero que se dispare)
¿Cómo puedo hacerlo?
jquery
html
events
cross-browser
Gadonski
fuente
fuente
.attr("value", "")
o.val("")
(como lo sugiere @ wagner-leonardi a continuación), Internet Explorer disparará el evento de cambio mientras Chrome no lo haga.prop("value", "")
Si lo ha intentado
.attr("value", "")
y no funcionó, no se asuste (como lo hice)solo hazlo
.val("")
, y funcionará bienfuente
Simplemente puede establecer que la ruta del archivo sea nula cada vez que el usuario hace clic en el control. Ahora, incluso si el usuario selecciona el mismo archivo, se activará el evento onchange .
fuente
Use el evento onClick para borrar el valor de la entrada objetivo, cada vez que el usuario hace clic en el campo. Esto garantiza que el evento onChange se activará también para el mismo archivo. Trabajó para mi :)
Usando TypeScript
fuente
Conseguí que esto funcionara borrando el valor de entrada del archivo en Haga clic y luego publicando el archivo en Cambiar. Esto le permite al usuario seleccionar el mismo archivo dos veces seguidas y aún así activar el evento de cambio para publicarlo en el servidor. Mi ejemplo utiliza el complemento de formulario jQuery .
fuente
onClick
dispara antesonChange
, por lo que este método funciona muy bien para mí.Este trabajo para mi
fuente
Solución VueJs
fuente
Inspirador de @braitsch, he usado lo siguiente en mi AngularJS2
input-file-component
Aquí
onClick(event)
me rescataron :-)fuente
Probablemente lo más fácil que puede hacer es establecer el valor en una cadena vacía. Esto lo obliga a 'cambiar' el archivo cada vez, incluso si el mismo archivo se selecciona nuevamente.
<input type="file" value="" />
fuente
Aquí está la solución React-y que he encontrado que funcionó para mí:
onClick={event => event.target.value = null}
fuente
Si no quieres usar jQuery
Funciona bien en Firefox, pero para Chrome debe agregar
this.value=null;
después de la alerta.fuente
Por defecto, la propiedad de valor del elemento de entrada se borra después de la selección de archivos si la entrada tiene múltiples atributos. Si no limpia esta propiedad, el evento "cambiar" no se activará si selecciona el mismo archivo. Puede administrar este comportamiento usando el
multiple
atributo.Referencia
fuente
No puedes hacer
change
fuego aquí (comportamiento correcto, ya que nada ha cambiado). Sin embargo, también podrías unirteclick
... aunque esto puede disparar con demasiada frecuencia ... sin embargo, no hay mucho terreno intermedio entre los dos.fuente
.click()
no estás "disparando en la re-selección".click
está lo más cerca posible.Cree para la entrada un evento de clic y un evento de cambio. El evento click vacía la entrada y el evento change contiene el código que desea ejecutar.
Por lo tanto, el evento de clic se vaciará cuando haga clic en el botón de entrada (antes de que se abra la ventana de selección de archivo), por lo que el evento de cambio siempre se activará cuando seleccione un archivo.
fuente
Puede usar
form.reset()
para borrar lafiles
lista de entrada de archivos . Esto restablecerá todos los campos a los valores predeterminados, pero en muchos casos es posible que solo use el tipo de entrada = 'archivo' en un formulario para cargar archivos de todos modos. En esta solución no hay necesidad de clonar el elemento y volver a conectar eventos nuevamente.Gracias a philiplehmann
fuente
Me encontré con el mismo problema, analicé las soluciones anteriores, pero no obtuvieron una buena explicación de lo que realmente estaba sucediendo.
Esta solución escribí https://jsfiddle.net/r2wjp6u8/ no hace muchos cambios en el árbol DOM, solo cambia los valores del campo de entrada. Desde el aspecto del rendimiento, debería ser un poco mejor.
Enlace al violín: https://jsfiddle.net/r2wjp6u8/
fuente
Por lo tanto, no hay forma de asegurarse al 100% de que están seleccionando el mismo archivo a menos que almacene cada archivo y los compare mediante programación.
La forma en que interactúa con los archivos (lo que hace JS cuando el usuario 'carga' un archivo) es HTML5 File API y JS FileReader .
https://www.html5rocks.com/en/tutorials/file/dndfiles/
https://scotch.io/tutorials/use-the-html5-file-api-to-work-with-files-locally-in-the-browser
Estos tutoriales le muestran cómo capturar y leer los metadatos (almacenados como objeto js) cuando se carga un archivo.
Cree una función que active 'onChange' que leerá-> almacenar-> comparar metadatos del archivo actual con los archivos anteriores. Entonces puede activar su evento cuando se selecciona el archivo deseado.
fuente
¡Créeme, definitivamente te ayudará!
Espero que esto ayude a muchos de ustedes.
fuente