Ich möchte ein Ereignis auslösen, wenn der Benutzer eine Datei auswählt. Bei einem .change
Ereignis funktioniert dies, wenn der Benutzer die Datei jedes Mal ändert.
Ich möchte das Ereignis jedoch auslösen, wenn der Benutzer dieselbe Datei erneut auswählt.
- Benutzerauswahldatei
A.jpg
(Ereignis wird ausgelöst) - Benutzerauswahldatei
B.jpg
(Ereignis wird ausgelöst) - Benutzerauswahldatei
B.jpg
(Ereignis wird nicht ausgelöst, ich möchte, dass es ausgelöst wird)
Wie kann ich es tun?
jquery
html
events
cross-browser
Gadonski
quelle
quelle
.attr("value", "")
oder.val("")
(wie von @ wagner-leonardi unten vorgeschlagen) der Internet Explorer das Änderungsereignis.prop("value", "")
Wenn Sie versucht haben
.attr("value", "")
und nicht gearbeitet haben, geraten Sie nicht in Panik (wie ich)Tun Sie es
.val("")
stattdessen und es wird gut funktionierenquelle
Sie können den Dateipfad einfach jedes Mal auf Null setzen, wenn der Benutzer auf das Steuerelement klickt. Selbst wenn der Benutzer dieselbe Datei auswählt, wird das Ereignis onchange ausgelöst.
quelle
Verwenden Sie das Ereignis onClick, um den Wert der Zieleingabe jedes Mal zu löschen, wenn der Benutzer auf das Feld klickt. Dadurch wird sichergestellt, dass das Ereignis onChange auch für dieselbe Datei ausgelöst wird. Arbeitete für mich :)
Verwenden von TypeScript
quelle
Ich habe dies zum Laufen gebracht, indem ich den Dateieingabewert onClick gelöscht und dann die Datei onChange gepostet habe. Auf diese Weise kann der Benutzer dieselbe Datei zweimal hintereinander auswählen und trotzdem das Änderungsereignis auslösen, um es auf dem Server zu veröffentlichen. In meinem Beispiel wird das jQuery-Formular-Plugin verwendet .
quelle
onClick
feuert vorheronChange
, also funktioniert diese Methode großartig für mich.Diese Arbeit für mich
quelle
VueJs Lösung
quelle
Inspiriert von @braitsch habe ich in meinem AngularJS2 Folgendes verwendet
input-file-component
Hier hat
onClick(event)
mich das gerettet :-)quelle
Wahrscheinlich ist es am einfachsten, den Wert auf eine leere Zeichenfolge zu setzen. Dies zwingt es, die Datei jedes Mal zu ändern, selbst wenn dieselbe Datei erneut ausgewählt wird.
<input type="file" value="" />
quelle
Hier ist die React-y-Way-Lösung, die für mich funktioniert hat:
onClick={event => event.target.value = null}
quelle
Wenn Sie jQuery nicht verwenden möchten
Es funktioniert gut in Firefox, aber für Chrome müssen Sie
this.value=null;
nach der Warnung hinzufügen .quelle
Standardmäßig wird die value-Eigenschaft des Eingabeelements nach Auswahl der Dateien gelöscht, wenn die Eingabe mehrere Attribute aufweist. Wenn Sie diese Eigenschaft nicht bereinigen, wird das Ereignis "Ändern" nicht ausgelöst, wenn Sie dieselbe Datei auswählen. Sie können dieses Verhalten mithilfe von
multiple
Attributen verwalten.Referenz
quelle
Sie können hier kein
change
Feuer machen (korrektes Verhalten, da sich nichts geändert hat). Sie könnten jedoch auch bindenclick
... obwohl dies zu oft feuert ... gibt es jedoch nicht viel Mittelweg zwischen den beiden.quelle
.click()
nicht "Feuer bei erneuter Auswahl" sind.click
ist so nah wie es nur geht.Erstellen Sie für die Eingabe ein Klickereignis und ein Änderungsereignis. Das Klickereignis leert die Eingabe und das Änderungsereignis enthält den Code, den Sie ausführen möchten.
Das Klickereignis wird also leer, wenn Sie auf die Eingabeschaltfläche klicken (bevor das Fenster zum Auswählen von Dateien geöffnet wird). Daher wird das Änderungsereignis immer ausgelöst, wenn Sie eine Datei auswählen.
quelle
Sie können damit
form.reset()
diefiles
Liste der Dateieingaben löschen . Dadurch werden alle Felder auf die Standardwerte zurückgesetzt. In vielen Fällen verwenden Sie jedoch möglicherweise nur den Eingabetyp = 'Datei' in einem Formular, um Dateien hochzuladen. In dieser Lösung ist es nicht erforderlich, das Element zu klonen und Ereignisse erneut zu verknüpfen.Danke an philiplehmann
quelle
Ich bin auf dasselbe Problem gestoßen, ich habe die obigen Lösungen durchgesehen, aber sie haben keine gute Erklärung dafür bekommen, was wirklich geschah.
Diese Lösung habe ich geschrieben https://jsfiddle.net/r2wjp6u8/ ändert nicht viele Änderungen im DOM-Baum, sondern nur die Werte des Eingabefelds. Unter Leistungsaspekten sollte es etwas besser sein.
Link zur Geige: https://jsfiddle.net/r2wjp6u8/
quelle
Es gibt also keine Möglichkeit, zu 100% sicher zu sein, dass sie dieselbe Datei auswählen, es sei denn, Sie speichern jede Datei und vergleichen sie programmgesteuert.
Die Art und Weise, wie Sie mit Dateien interagieren (was JS tut, wenn der Benutzer eine Datei hochlädt), ist die HTML5-Datei-API und JS FileReader .
https://www.html5rocks.com/de/tutorials/file/dndfiles/
https://scotch.io/tutorials/use-the-html5-file-api-to-work-with-files-locally-in-the-browser
Diese Tutorials zeigen Ihnen, wie Sie die Metadaten (als js-Objekt gespeichert) erfassen und lesen, wenn eine Datei hochgeladen wird.
Erstellen Sie eine Funktion, die 'onChange' auslöst und die Metadaten der aktuellen Datei mit den vorherigen Dateien liest-> speichern-> vergleicht. Dann können Sie Ihr Ereignis auslösen, wenn die gewünschte Datei ausgewählt ist.
quelle
Glauben Sie mir, es wird Ihnen auf jeden Fall helfen!
Hoffe das wird vielen von euch helfen.
quelle