Les fichiers d'entrée de changement événement se déclenche qu'une seule fois
J'ai fait un petit script à l'aide de certains des fichiers HTML5 fonctionnalités, qui vous permet de sélectionner un ou plusieurs fichiers, et à chaque fois qu'il va écrire le nom de fichier(s). Tout fonctionne comme il se doit, seulement de l'événement afin de détecter la variation de la valeur des fichiers d'entrée du feu qu'une seule fois, alors comment puis-je faire feu de tout changement, et pas seulement sur le premier changement?
Par ailleurs, voici ce que j'ai fait:
http://tamir.netspot.co.il/html5/files/
- [stackoverflow.com/questions/9155136/... [1]: stackoverflow.com/questions/9155136/...
- Merci de lire mon commentaire ci-dessous. Onchange ne se déclenche la première fois parce que vous avez à effacer la valeur de la précédente sélection de fichier.
Vous devez vous connecter pour publier un commentaire.
Il semble que la
change
écouteur d'événement est supprimé parce que vous êtes à l'aide deinnerHTML
de mettre à jour le même élément (wrapper
) que l'entrée lui-même est à l'intérieur. Si le contenu de lawrapper
de l'élément, y compris le fichier d'entrée est en cours de re-rendus, et le long de la voie, l'écouteur d'événement est supprimé (ou, plutôt, il est relié à un élément qui n'est plus là).Voici un simple jsfiddle qui fait exactement la même chose que votre code, à l'exception qu'elle imprime les noms des fichiers sélectionnés dans un élément différent de l'élément que l'entrée est au. Et ça marche (dans WebKit, de toute façon)
Voici encore la preuve (En gros, j'ai copié ton code, et seulement ajouté une ligne à ré-enregistrer l'écouteur d'événement après la modification de
wrapper.innerHTML
)Donc, le
change
événement ne feu pour chaque changement, mais l'entrée qui est observé est éliminé par l'utilisation deinnerHTML
sur l'entrée de l'élément parent.Honnêtement, je ne sais pas si c'est légitime navigateur bug ou pas. Il fait sens pour
innerHTML
à "écraser" les élément d'entrée, mais le navigateur est assez intelligent pour ne pas réinitialiser l'entrée de la valeur, vous pensez que les auditeurs de bâton autour de trop... alors... eh bien, c'est déroutantSi vous voulez télécharger deux fois, effacer le fichier d'entrée valeur
jsfiddle test
Je ne suis pas sûr pourquoi, mais aucune des réponses à cette vieille question sont toutes simples. Voici la façon de le faire facilement aujourd'hui...
avec jquery...
HTML:
c'est une fois que vous avez modifié la valeur de quelque chose d'autre que le fichier a été sélectionné, la prochaine fois que le fichier d'entrée est cliqué sur le onchange
événement se déclenche.
e.target.value = '';
résolu pour moiAu lieu d'utiliser onchange utilisation oninput événement
Aucun des ci-dessus a travaillé pour moi, j'ai effectivement eu à créer un nouveau "factice" fichier champ de saisie à chaque fois qu'il a été changé - ce qui me permet de capturer l'événement change de nouveau.
Le processus a été pour moi:
OnChange
- déplacer le fichier d'entrée à un autre élément
- créer un nouveau fichier d'entrée pour capturer l'événement change de nouveau
addEventListener l'habitude de travailler pour IE8(Pas sûr à ce sujet à partir de IE9). Nous avons besoin d'utiliser attachEvent listiner. Si vous avez besoin de la croix-prise en charge du navigateur puis utiliser cette
ok eh bien, selon @Flambino l'entrée est en cours de re-rendus. Pour quelque raison que ce peut être, pour moi sa pertinence.
L' $.on('change', callback) fonctionnalité est perdue.
Essayez d'utiliser .fonction de délégué qui, je l'adore!
http://api.jquery.com/delegate/
Ok, donc délégué est exactement le même, il dit juste jquery si il y a un élément d'affichage à l'écran avec un particulier de la poignée, joindre une fonctionnalité à elle.
Donc, même si l'élément est un nouveau rendu, il continuera à fonctionner.
Vous pouvez penser que c'est jeter de la fonction & dire quel est la différence, mais cela m'a sauvé beaucoup de temps sur des projets.
J'ai eu l' .changement de rappel à feu sur chaque nouveau fichier par la réaffectation des de la .changement de fonction à la fin de son propre rappel:
Dans mon cas, j'utilise ajax pour télécharger le fichier.
Je viens d'effacer la valeur de l'entrée avec le gestionnaire d'événement onclick.