Zdarzenie wyboru pliku <input type = 'file'> HTML


144

Powiedzmy, że mamy ten kod:

<form action='' method='POST' enctype='multipart/form-data'>
    <input type='file' name='userFile'><br>
    <input type='submit' name='upload_btn' value='upload'>
</form>

co skutkuje tym:

obraz przedstawiający przycisk przeglądania i przesyłania

Gdy użytkownik kliknie przycisk „Przeglądaj ...”, zostanie otwarte okno dialogowe wyszukiwania plików:

obraz przedstawiający okno dialogowe wyszukiwania plików z wybranym plikiem

Użytkownik wybiera plik, klikając go dwukrotnie lub klikając przycisk „Otwórz”.

Czy istnieje zdarzenie JavaScript, którego mogę użyć, aby otrzymać powiadomienie po wybraniu pliku?


5
Co za funky stary interfejs systemu Windows!
El-Burritos

@ El-Burritos to zostało opublikowane w 2010 roku; oczywiście jest to stary interfejs systemu Windows: D
Simon Cheng

Odpowiedzi:


181

Posłuchaj wydarzenia zmiany.

input.onchange = function(e) { 
  ..
};

3
napiszemy to gdzie… w tagach skryptu javascript
Księżyc

5
tak w tagach skryptu lub możesz dodać go jako atrybut ( <input type="file" onchange="..." />), chociaż nie jest to zalecane.
Anurag

7
Należy zauważyć, że w IE7 i 8 zdarzenie „zmiana” nie pojawia się w zdarzeniu formularza. Musisz umieścić odbiornik w tagu <input>.
xer0x

36
A co, jeśli użytkownik musi „przeładować” plik? onchange nie uruchomi się, ale nadal powinno przeładować się tak, jakby ładowało go po raz pierwszy.
bryc

11
Uwaga, to nie zadziała, jeśli użytkownik wybierze ten sam plik więcej niż raz z rzędu, ponieważ plik się nie zmienił.
bob0the0mighty

45

Kiedy musisz ponownie załadować plik, możesz usunąć wartość wejścia. Następnym razem, gdy dodasz plik, zostanie wyzwolone zdarzenie „przy zmianie”.

document.getElementById('my_input').value = null;
// ^ that just erase the file path but do the trick

5
To działa dobrze, ale uważaj na dziwne zachowanie IE <11. Nie pozwala na zmianę wartości danych wejściowych, więc najprawdopodobniej będziesz potrzebować obejścia. stackoverflow.com/questions/9011644/…
Oleksandr Tkalenko

15

jQuery sposób:

$('input[name=myInputName]').change(function(ev) {

    // your code
});

3

Zdarzenie Change zostanie wywołane, nawet jeśli klikniesz Anuluj.


2
byłoby pomocne, gdybyś podał kod wyjaśniający odpowiedź, ponieważ nie ma zdarzenia zmiany wspomnianego we fragmencie kodu Pytania
DevDig

Myślę, że @anthony odnosi się do następującego scenariusza: Wybierz plik. Teraz ponownie otwórz selektor plików, ale tym razem kliknij Anuluj. Ponieważ żaden plik nie został wybrany po raz drugi, sterowanie wejściem pliku resetuje się, zmieniając w ten sposób swój początkowy wybór, i wyzwalane jest zdarzenie zmiany.
dvlsc

Wypróbowałem to w Chrome 83 i zdarzenie nie jest uruchamiane po kliknięciu przycisku Anuluj. Ta odpowiedź jest dość stara i myślę, że musiała zostać naprawiona, przynajmniej w Chrome.
Saeed Ahadian

3

Tak to zrobiłem z czystym JS:

var files = document.getElementById('filePoster');
var submit = document.getElementById('submitFiles');
var warning = document.getElementById('warning');
files.addEventListener("change", function () {
  if (files.files.length > 10) {
    submit.disabled = true;
    warning.classList += "warn"
    return;
  }
  submit.disabled = false;
});
#warning {
    text-align: center;
}

#warning.warn {
	color: red;
	transform: scale(1.5);
	transition: 1s all;
}
<section id="shortcode-5" class="shortcode-5 pb-50">
    <p id="warning">Please do not upload more than 10 images at once.</p>
    <form class="imagePoster" enctype="multipart/form-data" action="/gallery/imagePoster" method="post">
        <div class="input-group">
  	    <input id="filePoster" type="file" class="form-control" name="photo" required="required" multiple="multiple" />
	    <button id="submitFiles" class="btn btn-primary" type="submit" name="button">Submit</button>
        </div>
    </form>
</section>

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.