Ist es möglich, einen <input type='file' />
Steuerwert mit jQuery zu löschen ? Ich habe folgendes versucht:
$('#control').attr({ value: '' });
Aber es funktioniert nicht.
Einfach: Sie wickeln ein <form>
um das Element, rufen Reset für das Formular auf und entfernen das Formular mit .unwrap()
. Im Gegensatz zu den anderen .clone()
Lösungen in diesem Thread erhalten Sie am Ende dasselbe Element (einschließlich der benutzerdefinierten Eigenschaften, die darauf festgelegt wurden).
Getestet und funktioniert in Opera, Firefox, Safari, Chrome und IE6 +. Funktioniert auch mit anderen Arten von Formularelementen, mit Ausnahme von type="hidden"
.
window.reset = function(e) {
e.wrap('<form>').closest('form').get(0).reset();
e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input id="file" type="file">
<br>
<input id="text" type="text" value="Original">
</form>
<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>
Wie Timo unten bemerkt, <form>
müssen Sie .preventDefault()
das Ereignis aufrufen , wenn Sie über die Schaltflächen verfügen, mit denen Sie das Zurücksetzen des Felds innerhalb <button>
von auslösen können , um zu verhindern, dass das Senden ausgelöst wird.
Funktioniert in IE 11 aufgrund eines nicht behobenen Fehlers nicht. Der Text (Dateiname) wird bei der Eingabe gelöscht, die File
Liste bleibt jedoch gefüllt.
reset()
in z.reset2()
, weil zumindest in Chrome alle Felder gelöscht werden, wenn dies der Fall istreset()
. Fügen Sie nach dem Löschen des Aufrufs event.preventDefault () hinzu, um das Senden zu verhindern. Auf diese Weise :<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
. Arbeitsbeispiel: jsfiddle.net/rPaZQ/23 .Schnelle Antwort: Ersetzen Sie es.
Im folgenden Code verwende ich die
replaceWith
jQuery-Methode, um das Steuerelement durch einen eigenen Klon zu ersetzen. Falls Handler an Ereignisse in diesem Steuerelement gebunden sind, möchten wir diese ebenfalls beibehalten. Dazu übergeben wirtrue
als ersten Parameter derclone
Methode.Geige: http://jsfiddle.net/jonathansampson/dAQVM/
Wenn beim Klonen unter Beibehaltung der Ereignishandler Probleme auftreten, können Sie die Ereignisdelegierung verwenden, um Klicks auf dieses Steuerelement von einem übergeordneten Element aus zu verarbeiten:
Dies verhindert, dass Handler zusammen mit dem Element geklont werden müssen, wenn das Steuerelement aktualisiert wird.
quelle
input.value = null;
Jquery soll sich um die Probleme zwischen Browsern und älteren Browsern kümmern.
Dies funktioniert mit modernen Browsern, die ich getestet habe: Chromium v25, Firefox v20, Opera v12.14
Verwenden von jquery 1.9.1
HTML
Jquery
Auf jsfiddle
Die folgende Javascript-Lösung funktionierte auch für mich in den oben genannten Browsern.
Auf jsfiddle
Ich habe keine Möglichkeit, mit IE zu testen, aber theoretisch sollte dies funktionieren. Wenn der IE so unterschiedlich ist, dass die Javascript-Version nicht funktioniert, weil MS dies auf andere Weise getan hat, sollte die jquery-Methode meiner Meinung nach für Sie damit umgehen, andernfalls lohnt es sich, das jquery-Team zusammen mit dem darauf hinzuweisen Methode, die IE benötigt. (Ich sehe Leute, die sagen "das funktioniert nicht im Internet Explorer", aber kein Vanille-Javascript, um zu zeigen, wie es im Internet Explorer funktioniert (angeblich ein "Sicherheitsmerkmal"?). Vielleicht melden sie es auch MS als Fehler (wenn sie dies tun würden) zähle es als solches), damit es in jeder neueren Version behoben wird)
Wie in einer anderen Antwort erwähnt, ein Beitrag im jquery-Forum
Aber jquery hat jetzt die Unterstützung für Browsertests, jquery.browser , entfernt.
Diese Javascript-Lösung hat auch bei mir funktioniert. Sie ist das Vanille-Äquivalent der Methode jquery.replaceWith .
Auf jsfiddle
Es ist wichtig zu beachten, dass die cloneNode- Methode die zugehörigen Ereignishandler nicht beibehält .
Siehe dieses Beispiel.
Auf jsfiddle
Aber jquery.clone bietet dies an [* 1]
Auf jsfiddle
[* 1] jquery kann dies tun, wenn die Ereignisse mit den Methoden von jquery hinzugefügt wurden, da eine Kopie in jquery.data gespeichert ist. Andernfalls funktioniert es nicht, ist also ein bisschen betrügerisch und bedeutet, dass die Dinge nicht so sind kompatibel zwischen verschiedenen Methoden oder Bibliotheken.
Auf jsfiddle
Sie können den angehängten Ereignishandler nicht direkt vom Element selbst abrufen.
Hier ist das allgemeine Prinzip in Vanille-Javascript: So machen es alle anderen Bibliotheken (ungefähr).
Auf jsfiddle
Natürlich verfügen jquery und andere Bibliotheken über alle anderen Unterstützungsmethoden, die für die Pflege einer solchen Liste erforderlich sind. Dies ist nur eine Demonstration.
quelle
.val('')
. Ist es nicht einfacher als das Klonen des Upload-Elements oder das Hinzufügen eines verschachtelten Formulars? +1..val("")
) hat perfekt funktioniert, danke. Viel einfacher als das Klonen und Ersetzen der Eingabe.Aus offensichtlichen Sicherheitsgründen können Sie den Wert einer Dateieingabe nicht einmal auf eine leere Zeichenfolge festlegen.
Alles, was Sie tun müssen, ist das Formular zurückzusetzen, in dem sich das Feld befindet, oder wenn Sie nur die Dateieingabe eines Formulars zurücksetzen möchten, das andere Felder enthält, verwenden Sie Folgendes:
Hier ist ein Beispiel: http://jsfiddle.net/v2SZJ/1/
quelle
Das funktioniert bei mir.
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
Ich hoffe es hilft.
quelle
In IE8 wurde das Feld "Datei-Upload" aus Sicherheitsgründen schreibgeschützt. Siehe den Blog-Beitrag des IE-Teams :
quelle
$("#control").val('')
ist alles, was du brauchst! Getestet auf Chrome mit JQuery 1.11Andere Benutzer haben ebenfalls in Firefox getestet.
quelle
Ich bin mit all den Optionen hier festgefahren. Hier ist ein Hack, den ich gemacht habe und der funktioniert hat:
und Sie können den Reset mit jQuery mit einem ähnlichen Code auslösen:
(jsfiddle: http://jsfiddle.net/eCbd6/ )
quelle
Am Ende hatte ich Folgendes:
ist vielleicht nicht die eleganteste Lösung, aber soweit ich das beurteilen kann, funktioniert sie.
quelle
Ich habe https://github.com/malsup/form/blob/master/jquery.form.js verwendet , das eine Funktion namens hat
clearInputs()
, die Crossbrowser ist, gut getestet, einfach zu bedienen ist und auch IE-Probleme und das Löschen versteckter Felder behandelt wenn benötigt. Vielleicht eine etwas lange Lösung, um nur Dateieingaben zu löschen, aber wenn Sie es mit Crossbrowser-Datei-Uploads zu tun haben, wird diese Lösung empfohlen.Die Verwendung ist einfach:
quelle
Der Wert von Dateieingaben ist schreibgeschützt (aus Sicherheitsgründen). Sie können es nicht programmgesteuert löschen (außer durch Aufrufen der reset () -Methode des Formulars, die einen breiteren Bereich als nur dieses Feld hat).
quelle
Ich konnte meine mit dem folgenden Code zum Laufen bringen:
quelle
Ich habe nach einer einfachen und sauberen Möglichkeit gesucht, die Eingabe von HTML-Dateien zu löschen. Die obigen Antworten sind großartig, aber keine von ihnen beantwortet wirklich das, wonach ich suche, bis ich im Web auf einfache und elegante Weise darauf gestoßen bin:
Der ganze Kredit geht an Chris Coyier .
quelle
Das
.clone()
Ding funktioniert nicht in Opera (und möglicherweise anderen). Es behält den Inhalt.Die für mich am nächsten liegende Methode war die von Jonathan, stellte jedoch sicher, dass das Feld seinen Namen, seine Klassen usw. beibehielt, was in meinem Fall für unordentlichen Code sorgte.
So etwas könnte gut funktionieren (auch dank Quentin):
quelle
Ich habe es geschafft, dies mit den folgenden ...
Dies wurde in IE10, FF, Chrome & Opera getestet.
Es gibt zwei Einschränkungen ...
Funktioniert in FF immer noch nicht richtig. Wenn Sie die Seite aktualisieren, wird das Dateielement erneut mit der ausgewählten Datei gefüllt. Woher diese Informationen kommen, ist mir ein Rätsel. Was könnte ich sonst noch versuchen, ein Dateieingabeelement zu löschen?
Denken Sie daran, die Delegierung für alle Ereignisse zu verwenden, die Sie an das Dateieingabeelement angehängt haben, damit sie auch dann funktionieren, wenn der Klon erstellt wird.
Was ich nicht verstehe, ist, wer in aller Welt dachte, es sei eine gute Idee, Ihnen nicht zu erlauben, ein Eingabefeld aus einer ungültigen, nicht akzeptablen Dateiauswahl zu löschen?
OK, lassen Sie mich nicht dynamisch einen Wert festlegen, damit ich keine Dateien aus dem Betriebssystem eines Benutzers auslaugen kann, sondern eine ungültige Auswahl löschen, ohne ein gesamtes Formular zurückzusetzen.
Es ist sowieso nicht so, dass 'accept' etwas anderes als einen Filter macht und in IE10 versteht es nicht einmal MS Word Mime-Typen, es ist ein Witz!
quelle
.pop()
für das Array von Dateien zu verwenden, anstatt es auf null zu setzen. Dies scheint die Datei richtig zu löschen.Auf meinem Firefox 40.0.3 funktioniert nur damit
quelle
Es funktioniert für mich in jedem Browser.
quelle
Ich habe es mit den meisten Techniken versucht, die die Benutzer erwähnt haben, aber keine davon hat in allen Browsern funktioniert. dh: clone () funktioniert in FF nicht für Dateieingaben. Am Ende habe ich die Dateieingabe manuell kopiert und dann das Original durch das kopierte ersetzt. Es funktioniert in allen Browsern.
quelle
quelle
Dies funktioniert mit Chrome, FF und Safari
Funktioniert möglicherweise nicht mit IE oder Opera
quelle
Machen Sie es asynchron und setzen Sie es zurück, nachdem die gewünschten Aktionen der Schaltfläche ausgeführt wurden.
quelle
quelle
es funktioniert nicht bei mir:
Daher verwende ich in asp mvc Rasiermesserfunktionen zum Ersetzen von Dateieingaben. Erstellen Sie zunächst eine Variable für die Eingabezeichenfolge mit ID und Name und verwenden Sie sie dann zum Anzeigen auf der Seite und zum Ersetzen beim Zurücksetzen. Klicken Sie auf:
quelle
Eine einfache Möglichkeit besteht darin, den Eingabetyp zu ändern und wieder zurückzusetzen.
Etwas wie das:
quelle
Sie können es wie folgt durch seinen Klon ersetzen
Aber das klont auch mit seinem Wert, also solltest du es besser mögen
quelle
Es ist einfach lol (funktioniert in allen Browsern [außer Oper]):
JS Fiddle: http://jsfiddle.net/cw84x/1/
quelle
Was? Geben Sie in Ihre Validierungsfunktion einfach ein
Angenommen, Upload ist der Name:
Ich benutze JSP, bin mir nicht sicher, ob das einen Unterschied macht ...
Funktioniert für mich und ich denke, es ist viel einfacher.
quelle