Est-il possible d'effacer une <input type='file' />
valeur de contrôle avec jQuery? J'ai essayé ce qui suit:
$('#control').attr({ value: '' });
Mais ça ne marche pas.
Facile: vous entourez <form>
l'élément, appelez reset sur le formulaire, puis supprimez le formulaire en utilisant .unwrap()
. Contrairement aux .clone()
solutions autrement dans ce fil, vous vous retrouvez avec le même élément à la fin (y compris les propriétés personnalisées qui y ont été définies).
Testé et fonctionne sous Opera, Firefox, Safari, Chrome et IE6 +. Fonctionne également sur d'autres types d'éléments de formulaire, à l'exception de 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>
Comme le note Timo ci-dessous, si vous avez les boutons pour déclencher la réinitialisation du champ à l'intérieur du <form>
, vous devez faire appel .preventDefault()
à l'événement pour empêcher le <button>
déclenchement d'une soumission.
Ne fonctionne pas dans IE 11 en raison d'un bogue non corrigé. Le texte (nom de fichier) est effacé sur l'entrée, mais sa File
liste reste remplie.
reset()
par exemple.reset2()
, car au moins dans Chrome, tous les champs sont effacés si tel est le casreset()
. Et ajoutez event.preventDefault () après avoir effacé l'appel pour empêcher la soumission. De cette façon:<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
. Exemple de travail: jsfiddle.net/rPaZQ/23 .Réponse rapide: remplacez-le.
Dans le code ci-dessous, j'utilise la
replaceWith
méthode jQuery pour remplacer le contrôle par un clone de lui-même. Si vous avez des gestionnaires liés à des événements sur ce contrôle, nous voudrons également les conserver. Pour ce faire, nous passonstrue
comme premier paramètre de laclone
méthode.Violon: http://jsfiddle.net/jonathansampson/dAQVM/
Si le clonage, tout en préservant les gestionnaires d'événements, présente tout problème que vous pourriez envisager d'utiliser la délégation d'événements pour gérer les clics sur ce contrôle à partir d'un élément parent:
Cela évite d'avoir à cloner des gestionnaires avec l'élément lors de l'actualisation du contrôle.
la source
input.value = null;
Jquery est censé prendre en charge les problèmes de navigateur / navigateur plus ancien pour vous.
Cela fonctionne sur les navigateurs modernes que j'ai testés: Chromium v25, Firefox v20, Opera v12.14
Utilisation de jquery 1.9.1
HTML
Jquery
Sur jsfiddle
La solution javascript suivante a également fonctionné pour moi sur les navigateurs mentionnés ci-dessus.
Sur jsfiddle
Je n'ai aucun moyen de tester avec IE, mais cela devrait théoriquement fonctionner. Si IE est suffisamment différent pour que la version Javascript ne fonctionne pas parce que MS l'a fait d'une manière différente, la méthode jquery devrait à mon avis s'en occuper pour vous, sinon il serait utile de le signaler à l'équipe jquery avec le qu'IE requiert. (Je vois des gens dire "cela ne fonctionnera pas sur IE", mais pas de javascript vanille pour montrer comment cela fonctionne sur IE (soi-disant une "fonction de sécurité"?), Peut-être aussi le signaler comme un bug à MS (s'ils le faisaient compter comme tel), afin qu'il soit corrigé dans toute nouvelle version)
Comme mentionné dans une autre réponse, un post sur le forum jquery
Mais jquery a désormais supprimé la prise en charge des tests du navigateur, jquery.browser.
Cette solution javascript a également fonctionné pour moi, c'est l'équivalent vanille de la méthode jquery.replaceWith .
Sur jsfiddle
La chose importante à noter est que la méthode cloneNode ne conserve pas les gestionnaires d'événements associés.
Voir cet exemple.
Sur jsfiddle
Mais jquery.clone offre cela [* 1]
Sur jsfiddle
[* 1] jquery est capable de le faire si les événements ont été ajoutés par les méthodes de jquery car il conserve une copie dans jquery.data , cela ne fonctionne pas autrement, donc c'est un peu une triche / solution de contournement et signifie que les choses ne sont pas compatible entre différentes méthodes ou bibliothèques.
Sur jsfiddle
Vous ne pouvez pas obtenir le gestionnaire d'événements attaché directement à partir de l'élément lui-même.
Voici le principe général de vanilla javascript, c'est ainsi que jquery et toutes les autres bibliothèques le font (grosso modo).
Sur jsfiddle
Bien sûr, jquery et d'autres bibliothèques ont toutes les autres méthodes de support nécessaires pour maintenir une telle liste, ceci n'est qu'une démonstration.
la source
.val('')
. N'est-ce pas simplement plus simple que de cloner l'élément de téléchargement ou d'ajouter un formulaire imbriqué? +1..val("")
) a parfaitement fonctionné, merci. Beaucoup plus simple que de cloner l'entrée et de la remplacer également.Pour des raisons de sécurité évidentes, vous ne pouvez pas définir la valeur d'une entrée de fichier, même sur une chaîne vide.
Tout ce que vous avez à faire est de réinitialiser le formulaire où le champ ou si vous souhaitez uniquement réinitialiser l'entrée de fichier d'un formulaire contenant d'autres champs, utilisez ceci:
Voici un exemple: http://jsfiddle.net/v2SZJ/1/
la source
Cela fonctionne pour moi.
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
J'espère que cela aide.
la source
Dans IE8, ils ont rendu le champ Téléchargement de fichiers en lecture seule pour des raisons de sécurité. Voir le blog de l'équipe IE :
la source
$("#control").val('')
est tout ce dont vous avez besoin! Testé sur Chrome à l'aide de JQuery 1.11D'autres utilisateurs ont également testé dans Firefox.
la source
Je suis resté coincé avec toutes les options ici. Voici un hack que j'ai fait et qui a fonctionné:
et vous pouvez déclencher la réinitialisation à l'aide de jQuery avec un code similaire à celui-ci:
(jsfiddle: http://jsfiddle.net/eCbd6/ )
la source
Je me suis retrouvé avec ceci:
n'est peut-être pas la solution la plus élégante, mais cela fonctionne pour autant que je sache.
la source
J'ai utilisé https://github.com/malsup/form/blob/master/jquery.form.js , qui a une fonction appelée
clearInputs()
, qui est croisée, bien testée, facile à utiliser et gère également les problèmes IE et la suppression des champs cachés si besoin. Peut-être une solution un peu longue pour effacer uniquement l'entrée de fichier, mais si vous avez affaire à des téléchargements de fichiers croisés, cette solution est recommandée.L'utilisation est simple:
la source
La valeur des entrées de fichier est en lecture seule (pour des raisons de sécurité). Vous ne pouvez pas le masquer par programme (autrement qu'en appelant la méthode reset () du formulaire, qui a une portée plus large que ce champ).
la source
J'ai pu faire fonctionner le mien avec le code suivant:
la source
Je cherchais un moyen simple et propre d'effacer les entrées de fichiers HTML, les réponses ci-dessus sont excellentes, mais aucune d'entre elles ne répond vraiment à ce que je recherche, jusqu'à ce que je tombe sur le Web avec une manière simple et élégante de le faire:
tout le mérite revient à Chris Coyier .
la source
La
.clone()
chose ne fonctionne pas dans Opera (et peut-être dans d'autres). Il garde le contenu.La méthode la plus proche ici pour moi était celle de Jonathan plus tôt, mais en veillant à ce que le champ conserve son nom, ses classes, etc., ce qui rendait le code désordonné dans mon cas.
Quelque chose comme ça pourrait bien fonctionner (merci aussi à Quentin):
la source
J'ai réussi à faire fonctionner cela en utilisant ce qui suit ...
Cela a été testé dans IE10, FF, Chrome et Opera.
Il y a deux mises en garde ...
Ne fonctionne toujours pas correctement dans FF, si vous actualisez la page, l'élément de fichier est re-rempli avec le fichier sélectionné. L'endroit où il obtient ces informations me dépasse. Quoi d'autre lié à un élément d'entrée de fichier pourrais-je essayer de supprimer?
N'oubliez pas d'utiliser la délégation sur tous les événements que vous avez attachés à l'élément d'entrée de fichier, afin qu'ils fonctionnent toujours lorsque le clone est effectué.
Ce que je ne comprends pas, c'est qui diable pensait que ne pas vous permettre d'effacer un champ d'entrée d'une sélection de fichiers inacceptable invalide était une bonne idée?
OK, ne me laissez pas le définir dynamiquement avec une valeur afin que je ne puisse pas lixivier des fichiers du système d'exploitation d'un utilisateur, mais permettez-moi d'effacer une sélection non valide sans réinitialiser un formulaire entier.
Ce n'est pas comme «accepter» fait quoi que ce soit d'autre qu'un filtre et dans IE10, il ne comprend même pas les types MIME de MS Word, c'est une blague!
la source
.pop()
le tableau de fichiers au lieu de le mettre à null. cela semble effacer correctement le fichier.Sur mon Firefox 40.0.3 ne fonctionne qu'avec ce
la source
ses travaux pour moi dans chaque navigateur.
la source
J'ai essayé avec la plupart des techniques mentionnées par les utilisateurs, mais aucune d'entre elles ne fonctionnait dans tous les navigateurs. ie: clone () ne fonctionne pas dans FF pour les entrées de fichiers. J'ai fini par copier manuellement l'entrée du fichier, puis remplacer l'original par celui copié. Cela fonctionne dans tous les navigateurs.
la source
la source
Cela fonctionne avec Chrome, FF et Safari
Peut ne pas fonctionner avec IE ou Opera
la source
Rendez-le asynchrone et réinitialisez-le une fois les actions souhaitées du bouton effectuées.
la source
la source
ça ne marche pas pour moi:
donc dans asp mvc j'utilise des fonctionnalités de rasoir pour remplacer l'entrée de fichier. créez d'abord une variable pour la chaîne d'entrée avec l'ID et le nom, puis utilisez-la pour afficher la page et remplacer le bouton de réinitialisation, cliquez sur:
la source
Un moyen simple consiste à modifier le type d'entrée et à le modifier à nouveau.
Quelque chose comme ça:
la source
Vous pouvez le remplacer par son clone comme ça
Mais ce clone avec sa valeur aussi, vous feriez mieux
la source
C'est facile lol (fonctionne dans tous les navigateurs [sauf l'opéra]):
JS Fiddle: http://jsfiddle.net/cw84x/1/
la source
Quelle? Dans votre fonction de validation, mettez simplement
En supposant que le téléchargement est le nom:
J'utilise JSP, je ne sais pas si cela fait une différence ...
Fonctionne pour moi, et je pense que c'est beaucoup plus facile.
la source