¿Es posible borrar un <input type='file' />
valor de control con jQuery? He intentado lo siguiente:
$('#control').attr({ value: '' });
Pero no está funcionando.
Fácil: envuelve un <form>
elemento, llama a reset en el formulario y luego elimina el formulario usando .unwrap()
. A diferencia de las .clone()
soluciones en este hilo, terminas con el mismo elemento al final (incluidas las propiedades personalizadas que se establecieron en él).
Probado y trabajando en Opera, Firefox, Safari, Chrome e IE6 +. También funciona en otros tipos de elementos de formulario, con la excepción de type="hidden"
.
window.reset = function(e) {
e.wrap('<form>').closest('form').get(0).reset();
e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input id="file" type="file">
<br>
<input id="text" type="text" value="Original">
</form>
<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>
Como señala Timo a continuación, si tiene los botones para activar el restablecimiento del campo dentro del <form>
, debe llamar .preventDefault()
al evento para evitar que active <button>
un envío.
No funciona en IE 11 debido a un error no corregido. El texto (nombre del archivo) se borra en la entrada, pero su File
lista permanece poblada.
reset()
a , por ejemplo.reset2()
, porque al menos en Chrome todos los campos se borran si es asíreset()
. Y agregue event.preventDefault () después de borrar la llamada para evitar el envío. De esta manera:<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
. Ejemplo de trabajo: jsfiddle.net/rPaZQ/23 .Respuesta rápida: reemplácela.
En el siguiente código, uso el
replaceWith
método jQuery para reemplazar el control con un clon de sí mismo. En el caso de que tenga algún controlador vinculado a eventos en este control, también queremos conservarlos. Para hacer esto pasamostrue
como el primer parámetro delclone
método.Violín: http://jsfiddle.net/jonathansampson/dAQVM/
Si la clonación, al tiempo que conserva los controladores de eventos, presenta algún problema que podría considerar usar la delegación de eventos para manejar los clics en este control desde un elemento primario:
Esto evita la necesidad de clonar cualquier controlador junto con el elemento cuando se actualiza el control.
fuente
input.value = null;
Se supone que Jquery se ocupará de los problemas del navegador cruzado / navegador anterior por usted.
Esto funciona en los navegadores modernos que probé: Chromium v25, Firefox v20, Opera v12.14
Usando jquery 1.9.1
HTML
Jquery
En jsfiddle
La siguiente solución de JavaScript también funcionó para mí en los navegadores mencionados anteriormente.
En jsfiddle
No tengo forma de probar con IE, pero en teoría esto debería funcionar. Si IE es lo suficientemente diferente como para que la versión de Javascript no funcione porque MS lo ha hecho de una manera diferente, el método jquery debería, en mi opinión, tratarlo por usted, de lo contrario valdría la pena señalarlo al equipo jquery junto con el método que requiere IE. (Veo a personas que dicen "esto no funcionará en IE", pero no hay Javascript vainilla para mostrar cómo funciona en IE (¿supuestamente una "característica de seguridad"?), Quizás también lo denuncien como un error a MS (si lo hicieran) contarlo como tal), para que se repare en cualquier versión más reciente)
Como se mencionó en otra respuesta, una publicación en el foro jquery
Pero jquery ahora ha eliminado la compatibilidad con las pruebas del navegador, jquery.browser.
Esta solución de JavaScript también funcionó para mí, es el equivalente a la vainilla del método jquery.replaceWith .
En jsfiddle
Lo importante a tener en cuenta es que el método cloneNode no conserva los controladores de eventos asociados.
Ver este ejemplo.
En jsfiddle
Pero jquery.clone ofrece esto [* 1]
En jsfiddle
[* 1] jquery puede hacer esto si los eventos se agregaron mediante los métodos de jquery, ya que mantiene una copia en jquery.data , de lo contrario no funciona, por lo que es un poco engañoso y evita que las cosas no funcionen compatible entre diferentes métodos o bibliotecas.
En jsfiddle
No puede obtener el controlador de eventos adjunto directamente desde el elemento mismo.
Aquí está el principio general en JavaScript de vainilla, así es como jquery y todas las demás bibliotecas lo hacen (aproximadamente).
En jsfiddle
Por supuesto, jquery y otras bibliotecas tienen todos los otros métodos de soporte necesarios para mantener dicha lista, esto es solo una demostración.
fuente
.val('')
. ¿No es más simple que clonar el elemento de carga o agregar un formulario anidado? +1..val("")
) funcionó perfectamente, gracias. Mucho más simple que clonar la entrada y reemplazarla también.Por obvias razones de seguridad, no puede establecer el valor de una entrada de archivo, incluso en una cadena vacía.
Todo lo que tiene que hacer es restablecer el formulario donde está el campo o si solo desea restablecer la entrada del archivo de un formulario que contiene otros campos, use esto:
Aquí hay un ejemplo: http://jsfiddle.net/v2SZJ/1/
fuente
Esto funciona para mi.
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
Espero eso ayude.
fuente
En IE8, hicieron que el campo Carga de archivos fuera de solo lectura por seguridad. Vea la publicación del blog del equipo de IE :
fuente
$("#control").val('')
¡es todo lo que necesitas! Probado en Chrome con JQuery 1.11Otros usuarios también han probado en Firefox.
fuente
Me quedé atrapado con todas las opciones aquí. Aquí hay un truco que hice que funcionó:
y puede activar el reinicio usando jQuery con un código similar a este:
(jsfiddle: http://jsfiddle.net/eCbd6/ )
fuente
Terminé con esto:
Puede que no sea la solución más elegante, pero funciona hasta donde puedo decir.
fuente
He usado https://github.com/malsup/form/blob/master/jquery.form.js , que tiene una función llamada
clearInputs()
, que es crossbrowser, bien probada, fácil de usar y maneja también problemas de IE y borrado de campos ocultos si es necesario. Tal vez sea una solución un poco larga para borrar solo la entrada de archivos, pero si se trata de cargas de archivos entre navegadores, se recomienda esta solución.El uso es fácil:
fuente
El valor de las entradas de archivo es de solo lectura (por razones de seguridad). No puede dejarlo en blanco mediante programación (aparte de llamar al método reset () del formulario, que tiene un alcance más amplio que solo ese campo).
fuente
Pude hacer que el mío funcionara con el siguiente código:
fuente
He estado buscando una forma simple y limpia de borrar la entrada de archivos HTML, las respuestas anteriores son geniales, pero ninguna de ellas responde realmente a lo que estoy buscando, hasta que encontré en la web una forma simple y elegante de hacerlo:
todo el crédito va a Chris Coyier .
fuente
La
.clone()
cosa no funciona en Opera (y posiblemente en otros). Mantiene el contenido.El método más cercano aquí para mí fue el anterior de Jonathan, sin embargo, garantizar que el campo conservara su nombre, clases, etc., fue un código desordenado en mi caso.
Algo como esto podría funcionar bien (gracias a Quentin también):
fuente
He logrado que esto funcione usando lo siguiente ...
Esto ha sido probado en IE10, FF, Chrome y Opera.
Hay dos advertencias ...
Todavía no funciona correctamente en FF, si actualiza la página, el elemento del archivo se vuelve a llenar con el archivo seleccionado. De dónde está obteniendo esta información está más allá de mí. ¿Qué más relacionado con un elemento de entrada de archivo podría intentar borrar?
Recuerde usar la delegación en cualquier evento que haya adjuntado al elemento de entrada del archivo, para que sigan funcionando cuando se realice el clon.
Lo que no entiendo es quién pensó que no era una buena idea no permitirle borrar un campo de entrada de una selección de archivo inaceptable no válida.
OK, no me dejen configurarlo dinámicamente con un valor para que no pueda filtrar archivos del sistema operativo de un usuario, pero permítanme borrar una selección no válida sin restablecer un formulario completo.
De todos modos, no es que 'aceptar' haga otra cosa que un filtro y, en IE10, ni siquiera entiende los tipos mime de MS Word, ¡es una broma!
fuente
.pop()
en la matriz de archivos en lugar de configurarlo como nulo. Esto parece borrar el archivo correctamente.En mi Firefox 40.0.3 solo funciona con esto
fuente
Me funciona en todos los navegadores.
fuente
Probé con la mayoría de las técnicas que mencionaron los usuarios, pero ninguna de ellas funcionó en todos los navegadores. es decir: clone () no funciona en FF para entradas de archivos. Terminé copiando manualmente la entrada del archivo, y luego reemplazando el original con el copiado. Funciona en todos los navegadores.
fuente
fuente
Esto funciona con Chrome, FF y Safari
Puede no funcionar con IE u Opera
fuente
Hágalo asíncrono y reinícielo después de que se hayan realizado las acciones deseadas del botón.
fuente
fuente
no me funciona
así que en asp mvc utilizo funciones de afeitar para reemplazar la entrada de archivos. primero cree una variable para la cadena de entrada con Id y Nombre y luego úsela para mostrar en la página y reemplazar al hacer clic en el botón de reinicio:
fuente
Una manera fácil es cambiar el tipo de entrada y volver a cambiarlo.
Algo como esto:
fuente
Puedes reemplazarlo con su clon así
Pero esto clona con su valor también, así que será mejor que así
fuente
Es fácil lol (funciona en todos los navegadores [excepto opera]):
JS Fiddle: http://jsfiddle.net/cw84x/1/
fuente
¿Qué? En su función de validación, simplemente ponga
Suponiendo que cargar es el nombre:
Estoy usando JSP, no estoy seguro si eso hace la diferencia ...
Funciona para mí, y creo que es mucho más fácil.
fuente