jak zresetować <typ wejścia = „plik”>


400

Tworzę aplikację metra z VS2012 i Javascript

Chcę zresetować zawartość mojego pliku wejściowego:

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />

Jak mam to zrobić?


1
Co rozumiesz przez treść?
Maess,

3
masz na myśli, że po wybraniu pliku przez użytkownika chcesz zresetować wybrany plik do „nic”?
ddavison,


14
to wydaje się , że prosty inputElement.value = ""załatwia sprawę w porządku, bez uciekania się do klonowania lub pakowania, jak sugeruje. Działa w CH (46), IE (11) i FF (41)
Robert Koritnik

Odpowiedzi:


371

Rozwiązanie jQuery, które @ dhaval-marthak opublikował w komentarzach, oczywiście działa, ale jeśli spojrzysz na rzeczywiste wywołanie jQuery, łatwo jest zobaczyć, co robi jQuery, ustawiając valueatrybut na pusty ciąg. W „czystym” JavaScript byłoby to:

document.getElementById("uploadCaptureInputFile").value = "";

15
Dzięki! Jeśli mimo to masz już odwołanie do jquery, $ input.val („”) będzie działać jak zwykle.
Natan

@ 2ndGAB Hmm ... Mam tylko 45.0.1, więc nie mogę przetestować ... nikogo innego?
Jordan Kasper

@ 2ndGAB Correction, Mój Firefox właśnie zaktualizował się do wersji 46.0.1 i ten kod nadal tam działa. Czy możesz potwierdzić?
Jordan Kasper

@ jakerella, co jest dziwne, dla mnie ustawienie wartości wyboru pliku wejściowego wyzwala wyjątek bezpieczeństwa. Jedynym rozwiązaniem, które z powodzeniem $(#myfileselector).trigger('fileselect', [1, ""]);
stosuję,

3
input.type = ''; input.type = 'file'; // enjoy
Maxmaxmaximus

81

Trzeba zawinąć <input type = “file”>do <form>tagów, a następnie można zresetować wejście przez zresetowanie postać:

onClick="this.form.reset()"

7
To jest poprawna metoda. Działa we wszystkich przeglądarkach i nie koliduje z żadnymi zabezpieczeniami, które są implementowane przez przeglądarki, aby zapobiec nieuporządkowanym skryptom z błędami wartości wejściowej pliku.
Eugene Ryabtsev

9
Trochę fajnie, ale nie dla mnie, ponieważ resetuje również inne pola w tym formularzu.
Starwave,

2
Podobne mogłoby być rozwiązanie jQuery $("form").get(0).reset();. .get(0)Powróci rzeczywisty element formularza, dzięki czemu można korzystać z reset()funkcji.
teewuane

74

To jest NAJLEPSZE rozwiązanie:

input.value = ''

if(!/safari/i.test(navigator.userAgent)){
  input.type = ''
  input.type = 'file'
}

Ze wszystkich odpowiedzi tutaj jest to najszybsze rozwiązanie. Bez klonowania danych, bez resetowania formularza!

Sprawdziłem to we wszystkich przeglądarkach (ma nawet obsługę IE8).


4
Czy jest jakiś konkretny powód, aby zresetować input.type? Ustawienie samej wartości ''daje oczekiwany wynik.
Harshita Sethi

Czy wywołuje onchangezdarzenie w MS Edge?
hotohoto

@hotohoto, nie wiem, mam Mac OS)
Maxmaxmaximus

1
To wymaga jeszcze kilku pozytywnych opinii lub czegoś takiego, zbyt długo zajęło mi znalezienie tej odpowiedzi, jest to jedyna, którą znalazłem, która działa w IE.
sch

input.value = '' zgłasza wyjątek dla konsoli w IE11. Jednak resetowanie input.type działa we wszystkich przeglądarkach bez żadnego błędu.
Miroslav Jasso,

45

Jeśli masz następujące rzeczy:

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

następnie po prostu wykonaj:

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

zresetować kontrolę pliku.


6
Najlepsze rozwiązanie IMHO.
Serhii Maksymchuk

3
Lub użyj DOM:inputFileEl.value = '';
Ninh Pham

44

Możesz po prostu sklonować go i zastąpić go sobą, z dołączonymi wszystkimi wydarzeniami:

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

i

var input = $("#control");

function something_happens() {
    input.replaceWith(input.val('').clone(true));
};

Dzięki: Css-tricks.com


1
Niestety nie resetuje to wartości wejściowej, zobacz ten jsFiddle . Aby uzyskać lepsze rozwiązanie, zobacz tę odpowiedź .
Gyrocode.com,

1
@ Gyrocode.com Ten jsFiddle nie działa, jeśli obraz zostanie przesłany po raz drugi po zresetowaniu.
Sarthak Singhal

2
@SarthakSinghal, Niestety napisałeś zły kod, powinieneś był zrobić jsfiddle.net/cL1LooLe
Roger Russel

2
@RogerRussel: Dokładnie ... Zastanawiałem się, dlaczego górne odpowiedzi mówiły, że działa tylko raz, co jest wyraźnym wskaźnikiem utraty jakiegoś odniesienia. Tak było w rzeczywistości, ponieważ początkowo utworzono odwołanie wejściowe, które później zastąpiono nowym elementem wejściowym.
Robert Koritnik

1
Zresetowanie tego samego valuew innych odpowiedziach wydaje się znacznie prostsze niż manipulowanie DOM.
CodeFinity

40

Inne rozwiązanie (bez wybierania elementów HTML DOM)

Jeśli dodałeś detektor zdarzeń „zmień” na tym wejściu, to w kodzie javascript możesz wywołać (dla określonych warunków):

event.target.value = '';

Na przykład w HTML:

<input type="file" onChange="onChangeFunction(event)">

I w javascript:

onChangeFunction(event) {
  let fileList = event.target.files;
  let file = fileList[0];
  let extension = file.name.match(/(?<=\.)\w+$/g)[0].toLowerCase(); // assuming that this file has any extension

  if (extension === 'jpg') {
    alert('Good file extension!');
  }
  else {
    event.target.value = '';
    alert('Wrong file extension! File input is cleared.');
  }

Kolejny sposób na angular2: stackoverflow.com/questions/40165271/…
Belter,

Działa to tylko w przypadku nazw plików, które zawierają tylko jeden .przed rozszerzeniem pliku.
Ma Kobi,

Zgadza się, edytowałem kod i zapewniłem bardziej uniwersalne podejście do uzyskania rozszerzenia pliku.
zrewanżowano

31

ROZWIĄZANIE

Poniższy kod działał dla mnie z jQuery. Działa w każdej przeglądarce i pozwala zachować zdarzenia i niestandardowe właściwości.

var $el = $('#uploadCaptureInputFile');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

PRÓBNY

Zobacz jsFiddle dla kodu i demonstracji.

SPINKI DO MANKIETÓW

Aby uzyskać więcej informacji, zobacz Jak zresetować dane wejściowe pliku za pomocą JavaScript .


1
@alessadro, nie, po prostu element <input type="file">o określonym identyfikatorze.
Gyrocode.com,

Dzięki, wyjaśnij swoją odpowiedź :) +1
candlejack

1
To najczystsze i najbardziej zgodne z przeglądarką rozwiązanie, jakie do tej pory znalazłem - dziękuję.
Pat

25

Zresetowanie przycisku przesyłania pliku jest tak proste, używając czystego JavaScript !

Jest kilka sposobów, aby to zrobić, ale koniecznym prostym sposobem, który działa dobrze w wielu przeglądarkach, jest zmiana wartości zarchiwizowanej na nic, w ten sposób zresetowane zostanie przesłanie pliku, spróbuj też użyć czystego javascript zamiast jakiegokolwiek frameworka, stworzyłem kod poniżej, po prostu sprawdź to (ES6):

function resetFile() {
  const file = document.querySelector('.file');
  file.value = '';
}
<input type="file" class="file" />
<button onclick="resetFile()">Reset file</button>


jak zrobić z jquery
Anand Choudhary

1
@AnandChoudhary działa to również wewnątrz jQuery, ale możesz zastąpić const file = document.querySelector ('. File'); z const file = $ ('. file'); lub po prostu zrób $ („. file”). val („”); opróżnić
Alireza

18

Szczególnie dla Angulara

document.getElementById('uploadFile').value = "";

Będzie działać, ale jeśli użyjesz Angular, powiesz, że „wartość właściwości” nie istnieje dla typu „HTMLElement”.

document.getElementById () zwraca typ HTMLElement, który nie zawiera właściwości value. Więc wrzuć to do HTMLInputElement

(<HTMLInputElement>document.getElementById('uploadFile')).value = "";

DODATKOWE: -

Nie powinniśmy jednak używać manipulacji DOM (document.xyz ()) w środowisku kątowym.

Aby to zrobić, zapewniono @VIewChild, @ViewChildren itp., Które są odpowiednio document.querySelector (), document.queryselectorAll ().

Nawet ja tego nie przeczytałem. Lepiej śledzić blogi ekspertów

Przejdź przez ten link1 , link2


Cieszę się, że nie muszę używać kątownika!
user2677034

Nie. Będzie tam FIx. Tylko ja to znalazłem. Z którego wtedy korzystasz?
P Satish Patro,

Przepraszam, byłem sarkastyczny ... Po prostu używam document.getElementById ('uploadFile'). Value = ""; ponieważ nie używam kątowej.
user2677034

Niezłe. Myślałem tak samo, ale używaj Angular / React / VUe. Są to potężne ramy dla routingu, komponentu, usługi i manipulacji domem nadpisujące implementację
P Satish Patro,

14

Używam dla vuejs

   <input
          type="file"
          ref="fileref"
          @change="onChange"/>

this.$refs.fileref.value = ''

2
Dzięki stary! Myślałem, że nigdy nie znajdę rozwiązania z vuejs: D, zwariowałeś na mój dzień!
Zsoca,

1
Działa jak urok! Dziękuję
F KIng

8

Plik wejściowy resetu jest bardzo pojedynczy

$('input[type=file]').val(null);

Jeśli powiążesz, zresetuj plik i zmień inne pole formularza lub załaduj formularz za pomocą ajax.

Ten przykład ma zastosowanie

selektorem jest na przykład $('input[type=text]')dowolny element formularza

wydarzenie click , changelub jakiekolwiek zdarzenie

$('body').delegate('event', 'selector', function(){
     $('input[type=file]').val(null) ;
});

5

W IE 10 rozwiązałem problem z:

    var file = document.getElementById("file-input");
    file.removeAttribute('value');
    file.parentNode.replaceChild(file.cloneNode(true),file);

gdzie :

<input accept="image/*" onchange="angular.element(this).scope().uploadFile(this)" id="file-input" type="file"/>


5

Istnieje wiele podejść i zasugeruję pójście z referencją do wejścia.

<input
    id="image"
    type="file"
    required
    ref={ref => this.fileInput = ref}
    multiple
    onChange={this.onFileChangeHandler}
/>

wyczyścić wartość po przesłaniu.

this.fileInput.value = "";


4

Za pomocą kątownika można utworzyć zmienną szablonu i ustawić wartość na null

<input type="file" #fileUploader />
<button (click)="fileUploader.value = null">Reset from UI</button>

Lub możesz utworzyć metodę resetowania w ten sposób

component.ts

  @ViewChild('fileUploader') fileUploader:ElementRef;

  resetFileUploader() { 
    this.fileUploader.nativeElement.value = null;
  }

szablon

<input type="file"/>
<button (click)="resetFileUploader()">Reset from Component</button>

demo Stackblitz


2

Nie można go zresetować, ponieważ jest to plik tylko do odczytu. możesz go sklonować, aby obejść problem.



2

Można to zrobić w ten sposób

var inputfile= $('#uploadCaptureInputFile')
$('#reset').on('click',function(){
inputfile.replaceWith(inputfile.val('').clone(true));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<a href="" id="reset">Reset</a>



1

Rozwiązanie jQuery:

    $('input').on('change',function(){
                $(this).get(0).value = '';
                $(this).get(0).type = '';
                $(this).get(0).type = 'file';
            });

Rozważ wypełnienie tej odpowiedzi, aby wyjaśnić, jak to działa.
Błędy

@ Błędy zgadują, że to mówi samo za siebie. Po uruchomieniu on changezdarzenia wejściowego pliku wartość zostaje wyczyszczona. Typ danych wejściowych jest resetowany z none do file.

2
@Jordy tak, wiem, co robi :) Pomyślałem tylko, że przy kilkunastu innych odpowiedziach warto spróbować je wyróżnić. Pojawił się podczas recenzowania. Mogą w rzeczywistości skopiować Twój komentarz, aby jeszcze bardziej go rozwinąć. Zawsze warto spróbować wyjaśnić, dlaczego według ciebie kod rozwiązuje problem PO.
Błędy

1

Napotkałem problem z przesyłaniem plików ng2 dla Angulara. jeśli szukasz rozwiązania kątowego, zapoznaj się z poniższym kodem

HTML:

<input type="file" name="myfile" #activeFrameinputFile ng2FileSelect [uploader]="frameUploader" (change)="frameUploader.uploadAll()" />

składnik

import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';

@ViewChild('activeFrameinputFile ')InputFrameVariable: ElementRef;

this.frameUploader.onSuccessItem = (item, response, status, headers) => {

`this.`**InputFrameVariable**`.nativeElement.value = '';`

};


1
<input type="file" id="mfile" name="mfile">
<p>Reset</p>

<script>
$(document).ready(function(){
$("p").click(function(){

            $("#mfile").val('');
            return false;

    });
});


Chociaż ten kod może rozwiązać pytanie, w tym wyjaśnienie, w jaki sposób i dlaczego to rozwiązuje problem, naprawdę pomógłby poprawić jakość twojego postu i prawdopodobnie doprowadziłby do większej liczby głosów. Pamiętaj, że odpowiadasz na pytanie dla czytelników w przyszłości, nie tylko dla osoby zadającej teraz pytanie. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnień i dać wskazówkę co zastosować ograniczenia i założenia. Z recenzji
podwójny dźwięk

0

Jeśli masz kilka plików w formularzu, ale chcesz tylko zresetować jeden z nich:

jeśli używasz boostrap, jquery, filestyle do wyświetlenia formularza pliku wejściowego:

$("#"+idInput).filestyle('clear');

0
var fileInput = $('#uploadCaptureInputFile');
fileInput.replaceWith(fileInput.val('').clone(true));

0

Działa również w przypadku kontroli dynamicznych.

JavaScript

<input type="file" onchange="FileValidate(this)" />

function FileValidate(object) {
    if ((object.files[0].size / 1024 / 1024) > 1) {   //greater than 1 MB         
        $(object).val('');
    }     
}

JQuery

<input type="file" class="UpoloadFileSize">

$(document).ready(function () {

    $('.UpoloadFileSize').bind('change', function () {                
        if ((this.files[0].size / 1024000) > 1.5) { //greater than 1.5 MB
            $(this).val('');
            alert('Size exceeded !!');
        }
    });

});

0

function resetImageField() {
    var $el = $('#uploadCaptureInputFile');                                        
    $el.wrap('<form>').closest('form').get(0).reset();
    $el.unwrap();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<button onclick="resetImageField()">Reset field</button>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.