Chcę uruchomić zdarzenie, gdy użytkownik wybierze plik. Robiąc to ze .change
zdarzeniem, działa, jeśli użytkownik zmienia plik za każdym razem.
Ale chcę uruchomić zdarzenie, jeśli użytkownik ponownie wybierze ten sam plik.
- Plik wyboru użytkownika
A.jpg
(wywołania zdarzenia) - Plik wyboru użytkownika
B.jpg
(wywołania zdarzenia) - Plik wyboru użytkownika
B.jpg
(zdarzenie się nie uruchamia, chcę go uruchomić)
Jak mogę to zrobić?
jquery
html
events
cross-browser
Gadonski
źródło
źródło
.attr("value", "")
lub.val("")
(jak sugeruje @ wagner-leonardi poniżej), Internet Explorer uruchomi zdarzenie zmiany, podczas gdy chrome nie.prop("value", "")
Jeśli próbowałeś
.attr("value", "")
i nie działałeś, nie panikuj (tak jak ja)po prostu zrób to
.val("")
i będzie działać dobrzeźródło
Możesz po prostu ustawić zerowanie ścieżki pliku za każdym razem, gdy użytkownik kliknie kontrolkę. Teraz, nawet jeśli użytkownik wybierze ten sam plik, zostanie wyzwolone zdarzenie onchange .
źródło
Użyj zdarzenia onClick, aby wyczyścić wartość wejścia docelowego za każdym razem, gdy użytkownik kliknie pole. Zapewnia to, że zdarzenie onChange zostanie wyzwolone również dla tego samego pliku. Pracował dla mnie :)
Korzystanie z języka TypeScript
źródło
Mam to do pracy, usuwając wartość wejściową pliku onClick, a następnie publikując plik onChange. Dzięki temu użytkownik może wybrać ten sam plik dwa razy z rzędu i nadal uruchamiać zdarzenie zmiany w celu przesłania go na serwer. Mój przykład używa wtyczki formularza jQuery .
źródło
onClick
odpala wcześniejonChange
, więc ta metoda działa na mnie świetnie.Ta praca dla mnie
źródło
Rozwiązanie VueJs
źródło
Inspirując się @braitsch, użyłem w moim AngularJS2 następujących elementów
input-file-component
Tutaj
onClick(event)
mnie uratował :-)źródło
Prawdopodobnie najłatwiejszą rzeczą, jaką możesz zrobić, jest ustawienie wartości na pusty ciąg. To zmusza go do „zmiany” pliku za każdym razem, nawet jeśli ten sam plik zostanie wybrany ponownie.
<input type="file" value="" />
źródło
Oto rozwiązanie React-y, które znalazłem, które zadziałało:
onClick={event => event.target.value = null}
źródło
Jeśli nie chcesz używać jQuery
Działa dobrze w przeglądarce Firefox, ale w przeglądarce Chrome musisz dodać
this.value=null;
po alercie.źródło
Domyślnie właściwość value elementu wejściowego jest czyszczona po wybraniu plików, jeśli dane wejściowe mają wiele atrybutów. Jeśli nie wyczyścisz tej właściwości, zdarzenie „change” nie zostanie uruchomione, jeśli wybierzesz ten sam plik. Możesz zarządzać tym zachowaniem za pomocą
multiple
atrybutu.Odniesienie
źródło
Nie możesz
change
tutaj rozpalić ognia (poprawne zachowanie, ponieważ nic się nie zmieniło). Jednak możesz również związaćclick
... chociaż może to wystrzelić zbyt często ... jednak między nimi nie ma zbyt wiele środka.źródło
.click()
nie jest to „ogień po ponownym wybraniu”.click
jest tak blisko, jak to tylko możliwe.Utwórz dla danych wejściowych zdarzenie kliknięcia i zdarzenie zmiany. Zdarzenie click opróżnia dane wejściowe, a zdarzenie change zawiera kod, który chcesz wykonać.
Tak więc zdarzenie click zostanie puste po kliknięciu przycisku wejściowego (przed otwarciem okna wyboru pliku), w związku z czym zdarzenie zmiany będzie zawsze wyzwalane po wybraniu pliku.
źródło
Możesz użyć,
form.reset()
aby wyczyścić listę plików wejściowychfiles
. Spowoduje to zresetowanie wszystkich pól do wartości domyślnych, ale w wielu przypadkach możesz używać tylko parametru input type = 'file' w formularzu do przesyłania plików. W tym rozwiązaniu nie ma potrzeby klonowania elementu i ponownego podpinania zdarzeń.Dzięki philiplehmann
źródło
Natknąłem się na ten sam problem, przeczytałem powyższe rozwiązania, ale nie dostały żadnego dobrego wyjaśnienia, co tak naprawdę się dzieje.
To rozwiązanie, które napisałem https://jsfiddle.net/r2wjp6u8/ nie robi wielu zmian w drzewie DOM, po prostu zmienia wartości pola wejściowego. Z punktu widzenia wydajności powinno być trochę lepiej.
Link do skrzypiec: https://jsfiddle.net/r2wjp6u8/
źródło
Tak więc nie ma sposobu, aby w 100% upewnić się, że wybierają ten sam plik, chyba że zapiszesz każdy plik i porównasz je programowo.
Sposób interakcji z plikami (co robi JS, gdy użytkownik „przesyła” plik) to HTML5 File API i JS FileReader .
https://www.html5rocks.com/en/tutorials/file/dndfiles/
https://scotch.io/tutorials/use-the-html5-file-api-to-work-with-files-locally-in-the-browser
Te samouczki pokazują, jak przechwytywać i odczytywać metadane (przechowywane jako obiekt js) podczas przesyłania pliku.
Utwórz funkcję uruchamiającą „onChange”, która odczyta-> zapisze-> porówna metadane bieżącego pliku z poprzednimi plikami. Następnie możesz wywołać zdarzenie po wybraniu żądanego pliku.
źródło
Uwierz mi, to na pewno ci pomoże!
Mam nadzieję, że to pomoże wielu z was.
źródło