2009-05-06 8 views
48

Chcę zresetować pole przesyłania pliku, gdy użytkownik wybierze inną opcję.Czyszczenie pola przesyłania pliku HTML za pomocą kodu JavaScript

Czy jest to możliwe przez JavaScript? Podejrzewam, że element przesyłania pliku jest traktowany inaczej, ponieważ wchodzi w interakcje z systemem plików użytkownika i może jest niezmienny.

Zasadniczo czego chcę jest coś takiego jak (pseudo-kod):

// Choose selecting existing file 
$('#select-file').bind('focus', function() { 
    // Clear any files currently selected in #upload-file 
    $('#upload-file').val(''); 
}) ; 

// Choose uploading new one - this works ok 
$('#upload-file').bind('focus', function() { 
    // Clear any files currently selected in #select-file 
    $('#select-file').val(''); 
}) ; 

Odpowiedz

66

Nie można ustawić wartości wejściowej w większości przeglądarek, ale można utworzyć nowy element, skopiować atrybuty ze starego elementu i zamienić dwa.

Biorąc pod uwagę formę takiego:

<form> 
    <input id="fileInput" name="fileInput" type="file" /> 
</form> 

prostej DOM sposób:

function clearFileInput(id) 
{ 
    var oldInput = document.getElementById(id); 

    var newInput = document.createElement("input"); 

    newInput.type = "file"; 
    newInput.id = oldInput.id; 
    newInput.name = oldInput.name; 
    newInput.className = oldInput.className; 
    newInput.style.cssText = oldInput.style.cssText; 
    // TODO: copy any other relevant attributes 

    oldInput.parentNode.replaceChild(newInput, oldInput); 
} 

clearFileInput("fileInput"); 

Proste DOM sposób. To nie może działać w starszych przeglądarkach, które nie lubią wejść plików:

oldInput.parentNode.replaceChild(oldInput.cloneNode(), oldInput); 

JQuery sposób:

$("#fileInput").replaceWith($("#fileInput").val('').clone(true)); 

// .val('') required for FF compatibility as per @nmit026 

Resetowanie cały formularz za pomocą jQuery: https://stackoverflow.com/a/13351234/1091947

+0

Wypróbowałem dwie pozostałe sugerowane opcje powyżej, a przykładowy kod pod tym linkiem był tym, który działał najlepiej na końcu. Naprawdę spodziewałem się, że odpowiedź Udo na to zrobi, ale to nie była zabawa. Próbowałem również http://gusiev.com/2009/04/clear-upload-file-input-field/ Dzięki Chris H –

+0

To jest najlepszy, jaki znalazłem do tej pory, ale nadal mam problem z wydarzenia związane z polem. W każdym razie dzięki! – William

+4

Lub z jQuery (wewnątrz obsługi zdarzeń 'change'):' $ (this) .replaceWith ($ (this) .clone (true)); ' –

7

Tak, element wysyłania jest chroniony przed bezpośrednim manipulacji w różnych przeglądarkach. Można jednak usunąć element z drzewa DOM, a następnie wstawić nowy w jego miejsce za pomocą JavaScript. To dałoby taki sam rezultat.

Coś wzdłuż linii:

$('#container-element').html('<input id="upload-file" type="file"/>'); 
+0

bardzo miłe - da to strzał powinien być v mało kłopotów uciekać kopię istniejącego elementu –

4

Nie koncentrują się wydarzenia, więc będziesz musiał użyć trick tak: Jedynym sposobem, aby usunąć to, aby wyczyścić całą postać

<script type="text/javascript"> 
    $(function() { 
     $("#wrapper").bind("mouseover", function() { 
      $("form").get(0).reset(); 
     }); 
    }); 
</script> 

<form> 
<div id="wrapper"> 
    <input type=file value="" /> 
</div> 
</form> 
+0

dzięki - tak, zastanawiałem się również, czy istnieje nawet metoda interfejsu użytkownika, aby wyczyścić własne pole przesyłania plików bez resetowania całego formularza. –

+0

@ChadGrant, dobra uwaga, dziękuję. To, co właśnie zrobiłem, zawijałem dane wejściowe formularzem, zresetowałem formularz i odwijałem go :) – dmi3y

5

Kod skończyło się używanie było,

Dziękuję wszystkim za sugestie i wskazówki!

+0

Dziękujemy za opublikowanie kodu! Uratowałeś mi dziś czas i frustrację. – NXT

+1

W IE8 "klasa" nie jest poprawnym atrybutem. To "className". – NXT

1

Spróbuj tego kodu ...

$("input[type=file]").wrap("<div id='fileWrapper'/>"); 
$("#fileWrapper").append("<div id='duplicateFile' style='display:none'>"+$("#fileWrapper").html()+" </div>"); 
$("#fileWrapper").html($("#duplicateFile").html()); 
4

naprawdę lubię trzymać rzeczy proste jak ten :)

$('input[type=file]').wrap('<form></form>').parent().trigger('reset').children().unwrap('<form></form>'); 
1

jQuery przetestowane metody pracy grzywny w FF & Chrome:

$(function(){ 
    $.clearUploadField = function(idsel){ 
     $('#your-id input[name="'+idsel+'"]').val("") 
    } 
}); 
38

W 2014 roku element wejściowy o identyfikatorze obsługuje funkcję val('').

Dla wejścia -

<input type="file" multiple="true" id="File1" name="choose-file" /> 

js To czyści elementu input -

$("#File1").val(''); 
+2

Czy to działa we wszystkich przeglądarkach lub przynajmniej w kilku ostatnich wersjach dużego 4? Widziałem pewne problemy, w których działa w FF, ale nie IE. –

+0

Przyjęta odpowiedź nie działa dla mnie, ponieważ używam Angular 2, a zastąpienie elementu nie wydaje się być miłe z Angular. To rozwiązanie jednak działa - więc robi się to na czasie! –

2

spróbować tej jego pracy grzywny

document.getElementById('fileUpload').parentNode.innerHTML = document.getElementById('fileUpload').parentNode.innerHTML; 
+0

Nice .. To jest najprostszy i dobry sposób na ... Dziękuję ... – Dolly

2

Dla kompatybilności kiedy ajax nie jest dostępny, należy ustawić .val ('') lub wyśle ​​ponownie ostatni plik przesłany przez ajax, który wciąż jest obecny w danych wejściowych. Poniższa powinien prawidłowo wyczyścić wejście zachowując .on() wydarzenia:

var input = $("input[type='file']"); 
input.html(input.html()).val(''); 
1

Krótszy version że pracuje dla mnie idealna, która jest następująca:

document.querySelector('#fileUpload').value = ""; 
3

proste rozwiązanie:

document.getElementById("upload-files").value = ""; 
1

Jeśli masz następujące:

<input type="file" id="FileSelect"> 

potem po prostu zrobić:

$("#FileSelect").val(''); 

zresetować lub jasne ostatnio wybrany plik.

2

Ten jQuery pracował dla mnie w IE11, Chrome 53, i Firefox 49:

cloned = $("#fileInput").clone(true); 
cloned.val(""); 
$("#fileInput").replaceWith(cloned); 
Powiązane problemy