114 votes

Comment déclencher un événement lors de la sélection d'un fichier ?

J'ai un formulaire comme

<form  onSubmit="return disableForm(this);" action="upload.php" method="post" name="f" id="wizecho" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button onClick="return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;">
        Upload Image
    </button>
</form>

Il s'agit de télécharger une image.

Ici, je dois cliquer sur le bouton pour télécharger l'image et je dois utiliser onClick événement. Je veux supprimer le bouton de téléchargement et dès que le fichier est sélectionné dans l'entrée, je veux déclencher l'événement. Comment faire ?

0 votes

Si vous craignez de sélectionner deux fois le même fichier, @applecrusher a une meilleure solution que la réponse sélectionnée. stackoverflow.com/a/40581284/1520304

145voto

Vincent Ramdhanie Points 46265

Utiliser l'événement de changement sur l'entrée du fichier.

$("#file").change(function(){
         //submit the form here
 });

34 votes

Et que se passe-t-il lorsque vous soumettez le formulaire de manière asynchrone, que vous ne quittez pas la page et que vous essayez à nouveau de télécharger le même fichier ? Ce code ne sera exécuté qu'une seule fois, la deuxième fois, la sélection du même fichier n'entraînera pas d'événement de changement.

6 votes

L'objection de @ChristopherThomas est exactement la raison pour laquelle je suis ici, et heureusement il y a une réponse très sous-estimée ci-dessous qui la résout, des années plus tard : stackoverflow.com/a/40581284/4526479

2 votes

Ne se déclenche pas lorsque je sélectionne à nouveau le même fichier. Y a-t-il une autre façon de procéder qui puisse fonctionner à chaque fois ?

78voto

Darin Dimitrov Points 528142

Vous pouvez vous abonner à l'événement onchange du champ de saisie :

<input type="file" id="file" name="file" />

et ensuite :

document.getElementById('file').onchange = function() {
    // fire the upload here
};

57voto

applecrusher Points 954

Il s'agit d'une question plus ancienne qui nécessite une réponse plus récente qui répondra à la préoccupation de @Christopher Thomas ci-dessus dans les commentaires de la réponse acceptée. Si vous ne naviguez pas hors de la page et que vous sélectionnez le fichier une seconde fois, vous devez effacer la valeur lorsque vous cliquez ou faites un touchstart (pour mobile). La méthode ci-dessous fonctionnera même si vous quittez la page et utilise jquery :

//the HTML
<input type="file" id="file" name="file" />

//the JavaScript

/*resets the value to address navigating away from the page 
and choosing to upload the same file */ 

$('#file').on('click touchstart' , function(){
    $(this).val('');
});

//Trigger now when you have selected any file 
$("#file").change(function(e) {
    //do whatever you want here
});

0 votes

Est-ce compatible avec tous les navigateurs ? On dirait qu'il utilise simplement val('') qui ne fonctionne pas dans la plupart des navigateurs.

0 votes

Quel navigateur ne fonctionne pas sur lequel vous avez essayé ? Essayez de cloner l'objet avec lui-même si le problème persiste.

4 votes

Mon problème était d'utiliser element.setAttribute("value", "") Si vous n'utilisez pas jQuery, vous devez utiliser element.value = "" pour que l'élément de dossier soit vraiment clair.

3voto

Dimitri Points 3651

Vous pourriez ajouter un gestionnaire d'événement javascript pour l'événement onchange et déclencher le téléchargement à partir de celui-ci :

<input type="file" name="file" onchange="uploadFile()" />

function uploadFile() {
return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;
}

1voto

Mohit Singh Points 53

Faites ce que vous voulez après que le fichier ait été chargé avec succès. Juste après la fin du traitement du fichier, mettez la valeur du contrôle du fichier à une chaîne vide. Ainsi, le .change() sera toujours appelé même si le nom du fichier change ou non.

  $('#myFile').change(function () {
    LoadFile("myFile");//function to do processing of file.
    $('#myFile').val('');// set the value to empty of myfile control.
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X