¿Cómo puedo borrar una entrada de archivo HTML con JavaScript?

154

Quiero borrar la entrada del archivo en mi formulario.

Sé cómo configurar las fuentes con el mismo método ... Pero ese método no borrará la ruta del archivo seleccionado.

Nota : Me gustaría evitar tener que volver a cargar la página, restablecer el formulario o realizar una llamada AJAX.

es posible?

thomaux
fuente

Respuestas:

-10

¿Qué hay de eliminar ese nodo y crear uno nuevo con el mismo nombre?

DFectuoso
fuente
46
¿Qué quieres decir? Dame un ejemplo, por favor.
1
perderá sus controladores, como este: var inputPhoto = document.getElementById ('photoInput'); inputPhoto.addEventListener ('change', handler_file, false);
Rui Martins
Votado por falta de explicación!
Jason
211

Hay 3 formas de borrar la entrada de archivos con javascript:

  1. Establezca la propiedad de valor en vacío o nulo.

    Funciona para IE11 + y otros navegadores modernos.

  2. Cree un nuevo elemento de entrada de archivo y reemplace el anterior.

    La desventaja es que perderá oyentes de eventos y propiedades de expansión.

  3. Restablezca el formulario del propietario a través del método form.reset ().

    Para evitar afectar a otros elementos de entrada en el mismo formulario de propietario, podemos crear un nuevo formulario vacío y agregar el elemento de entrada de archivo a este nuevo formulario y restablecerlo. De esta manera funciona para todos los navegadores.

Escribí una función de JavaScript. demostración: http://jsbin.com/muhipoye/1/

function clearInputFile(f){
    if(f.value){
        try{
            f.value = ''; //for IE11, latest Chrome/Firefox/Opera...
        }catch(err){ }
        if(f.value){ //for IE5 ~ IE10
            var form = document.createElement('form'),
                parentNode = f.parentNode, ref = f.nextSibling;
            form.appendChild(f);
            form.reset();
            parentNode.insertBefore(f,ref);
        }
    }
}
cuixiping
fuente
1
¿No deberíamos también eliminar la forma creada después?
Andrey
1
No, no necesitas el elemento del formulario no se ha agregado al árbol de documentos de la página.
cuixiping
55
Solo una palabra de advertencia, el uso de los enfoques 2. o 3. podría tener implicaciones para usted si desea preservar eventos y otros atributos que se agregaron a un elemento mediante programación. En mi caso, agregué un evento onclick a un elemento del formulario que desapareció después del restablecimiento del formulario. En tal caso, el enfoque 1. es mejor. (Esto se observó para 2., pero también puede suceder para 3.)
Wolfie Inu
85

tl; dr : para navegadores modernos, solo use

input.value = '';

Vieja respuesta:

Qué tal si:

input.type = "text";
input.type = "file";

Todavía tengo que entender por qué esto no funciona con webkit .

De todos modos, esto funciona con IE9>, Firefox y Opera.
La situación con webkit es que parece que no puedo volver a cambiarlo a archivo.
Con IE8, la situación es que arroja una excepción de seguridad.

Editar: para webkit, Opera y firefox esto funciona, sin embargo:

input.value = '';

(verifique la respuesta anterior con esta propuesta)

Veré si puedo encontrar una manera más limpia de hacer este navegador cruzado sin la necesidad del GC.

Edit2:

try{
    inputs[i].value = '';
    if(inputs[i].value){
        inputs[i].type = "text";
        inputs[i].type = "file";
    }
}catch(e){}

Funciona con la mayoría de los navegadores. No funciona con IE <9, eso es todo.
Probado en Firefox 20, Chrome 24, Opera 12, IE7, IE8, IE9 e IE10.

brunoais
fuente
35

Establecer el valor en ''no funciona en todos los navegadores.

En su lugar, intente configurar el valor para que me nullguste

document.getElementById('your_input_id').value= null;

EDITAR: Obtengo las razones de seguridad muy válidas para no permitir que JS configure la entrada del archivo, sin embargo, parece razonable proporcionar un mecanismo simple para borrar la selección de salida. Intenté usar una cadena vacía pero no funcionó en todos los navegadores, NULLfuncionó en todos los navegadores que probé (Opera, Chrome, FF, IE11 + y Safari).

EDITAR: tenga en cuenta que la configuración de NULLfunciona en todos los navegadores mientras que la configuración de una cadena vacía no lo hizo.

BigMac66
fuente
66
Lamentablemente, no veo esto en all browsers... no funciona en IE8, IE9 o IE10 (pero funciona en IE11).
Freefaller
Bueno dang. No probé versiones anteriores del navegador IE. Lo siento.
BigMac66
31

Lamentablemente, ninguna de las respuestas anteriores parece cubrir todas las bases, al menos no con mis pruebas con vanilla javascript.

  • .value = nullparece funcionar en Firefox, Chome, Opera e IE11 (pero no en IE8 / 9/10)

  • .cloneNode(y .clone()en jQuery) en FireFox parece copiar el .valueover, haciendo que el clon no tenga sentido.

Así que aquí está la función de Javascript de vainilla que he escrito que funciona en FireFox (27 y 28), Chrome (33), IE (8, 9, 10, 11), Opera (17) ... estos son los únicos navegadores disponibles actualmente a mí para probarlo.

function clearFileInput(ctrl) {
  try {
    ctrl.value = null;
  } catch(ex) { }
  if (ctrl.value) {
    ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
  }
}

El ctrlparámetro es la entrada del archivo en sí, por lo que la función se llamaría como ...

clearFileInput(document.getElementById("myFileInput"));
Freefaller
fuente
1
Esta es la respuesta. Uno de los problemas con tantas respuestas a esta pregunta, no solo en esta página, sino también en otros foros, es que puede borrar el texto "3 archivos seleccionados", pero en realidad no borra los archivos http cola. Lo que sucede entonces es que la próxima vez que intente cargar, solo puede seleccionar un archivo y, lo que es peor, se guarda en la carpeta de archivos anterior. Esta respuesta borrará ambos, y puede reanudar la carga del siguiente conjunto de archivos tan fácilmente como subió el primer conjunto de archivos.
TARKUS
¿No ifdebería colocarse la declaración dentro del catchbloque?
Fahmi
@Fahmi - no, no debería
freefaller
Oh, pensé que IE8 / 9/10 arrojará una excepción al intentar establecer el valor en null. ¿Entonces te importaría explicar cuál es el punto de poner ctrl.value = null;dentro de un try...catchbloque? Perdón por la nueva pregunta.
Fahmi
1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);- ¿En qué punto borramos realmente el valor, ya que cloneNodetambién lo copia?
Fahmi
11

U necesita reemplazarlo con una nueva entrada de archivo. Así es como se puede hacer con jQuery:

var inputFile = $('input[type=field]');
inputFile.wrap('<div />');

y use esta línea cuando necesite borrar el campo de entrada (en algún evento, por ejemplo):

inputFile.parent().html( inputFile.parent().html() );
Jamland
fuente
Para reemplazar el elemento original, esto se ve mejor: stackoverflow.com/questions/1043957/…
Mengdi Gao
9
document.getElementById('your_input_id').value=''

Editar:
este no funciona en IE y Opera, pero parece funcionar para Firefox, Safari y Chrome.

Soufiane Hassou
fuente
77
Esto funciona para mí, aunque siempre me pregunto por cuánto tiempo.
Pekka el
esto no funcionará, solo en algunos navegadores, y también establecer el valor de una entrada de archivo es una violación de seguridad ... no es una buena opción.
5

Estaba teniendo el mismo problema y se me ocurrió esto.

var file = document.querySelector('input');
var emptyFile = document.createElement('input');
emptyFile.type = 'file';

document.querySelector('button').onclick = function(){
  file.files = emptyFile.files;
}
<input type='file'>
<button>clear</button>

ajit kumar
fuente
4

Eso es realmente bastante fácil.

document.querySelector('#input-field').value = '';
seudónimo
fuente
3

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:

var $input = $("#control");

$input.replaceWith($input.val('').clone(true));

Todo el crédito va para Chris Coyier .

// Referneces
var control = $("#control"),
    clearBn = $("#clear");

// Setup the clear functionality
clearBn.on("click", function(){
    control.replaceWith( control.val('').clone( true ) );
});

// Some bound handlers to preserve when cloning
control.on({
    change: function(){ console.log( "Changed" ) },
     focus: function(){ console.log(  "Focus"  ) }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="file" id="control">
<br><br>
<a href="#" id="clear">Clear</a>

chebaby
fuente
..y para usted amigo, esto me ayudó al verificar y mostrar errores en una posible carga de archivos. Esto se restablece por error y permite al usuario volver a cargar el mismo archivo en caso de que alguien esté buscando algo como esto.
Clinton Dobbs
1

Las respuestas anteriores ofrecen soluciones algo torpes por las siguientes razones:

  1. No me gusta tener wrapel inputprimero y luego obtener el html, es muy complicado y sucio.

  2. El navegador cruzado JS es útil y parece que en este caso hay demasiadas incógnitas para usar el typecambio de manera confiable (que, de nuevo, es un poco sucio) y configurarlo valueen''

Entonces le ofrezco mi solución basada en jQuery:

$('#myinput').replaceWith($('#myinput').clone())

Hace lo que dice, reemplaza la entrada con un clon de sí mismo. El clon no tendrá el archivo seleccionado.

Ventajas:

  1. Código simple y entendible
  2. Sin envoltura torpe o cambio de tipo
  3. Compatibilidad cruzada con el navegador (corrígeme si me equivoco aquí)

Resultado: programador feliz

Mosselman
fuente
3
Cross browser compatibility... mis pruebas muestran que FireFox copia sobre el .valuecomo parte del .clone(), por lo que lo hace inútil
freefaller
@freefaller ¿por qué no cambiar el valor antes de llamar replaceWith? Me estoy usando clone()y está funcionando bien en Firefox (no sé si este es el caso para usted un año después =))
Abdo
@Abdo: si miras mi respuesta , verás que lo hago
freefaller
La pregunta no es acerca de jQuery; se trata de javascript.
Arel
1

Aquí están mis dos centavos, los archivos de entrada se almacenan como una matriz, así que aquí es cómo anularlo

document.getElementById('selector').value = []

esto devuelve una matriz vacía y funciona en todos los navegadores

Sam Hasan
fuente
0

Lo que me ayudó es que traté de buscar y cargar el último archivo seleccionado usando un bucle, en lugar de borrar la cola, y funcionó. Aquí está el código.

for (int i = 0; i <= Request.Files.Count-1; i++)
{
 HttpPostedFileBase uploadfile = files[i];
 Stream fs = uploadfile.InputStream;
 BinaryReader br = new BinaryReader(fs);
 Byte[] imageBytes = br.ReadBytes((Int32)fs.Length);
}

Espero que esto pueda ayudar a algunos.

dotRag
fuente
0

Probé la mayoría de las soluciones, pero no parecía que nadie trabajara. Sin embargo, encontré un paseo por debajo.

La estructura de la forma es: form=> label, inputy submit button. Después de elegir un archivo, la etiqueta mostrará el nombre de archivo al hacerlo manualmente en JavaScript.

Entonces, mi estrategia es: inicialmente, el envío buttonestá deshabilitado, después de elegir un archivo, el disabledatributo del botón enviar se eliminará de modo que pueda enviar el archivo. Después de enviar, borro lo labelque hace que parezca que borro el archivoinput pero en realidad no. Luego, deshabilitaré el botón Enviar nuevamente para evitar que envíe el formulario.

Al configurar el envío button disableo no, dejo de enviar el archivo muchas veces a menos que elija otro archivo.

usuario419050
fuente
0

Cambié para escribir texto y volver a escribir en el archivo usando setAttribute

'<input file-model="thefilePic" style="width:95%;" type="file" name="file" id="filepicture" accept="image/jpeg" />'

'var input=document.querySelector('#filepicture');'

if(input != null)
{
    input.setAttribute("type", "text");
    input.setAttribute("type", "file");
}
Haiam
fuente