IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Fonction qui se lance toute seule à plusieurs reprises ?


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut Fonction qui se lance toute seule à plusieurs reprises ?
    Bonsoir,
    Je travaille avec le DOM en jquery, j'affiche des images uploadées par l'utilisateur, puis l'utilisateur peut les supprimer de l'écran (en cliquant sur une petite croix rouge, image dont la classe est delete). Sauf que je ne sais pas pourquoi, la fonction de suppression est parfois exécutée plusieurs fois, alors qu'appelée une seule fois !

    voici mon code commenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    			var compteur=0;
    			$(document).ready(function()
    			{   
     
    			var options ={
    					dataType:  'json', 
    					beforeSubmit: function(){
    					$('#loader').html('<img src="img/loading.gif" id="waiting">'); // L'animation de chargement
    					},
    					success:function(data){
     
    						$('#waiting').remove(); // on supprime l'animation de chargement
    						// Si erreur est set à 1... on annule et on prévient
    						if(data.erreur=='1'){
    							$('#results').html(data.message); // On affiche le message d'erreur dans la div
    						}
    						// Si l'upload s'est bien passé, on affiche l'image
    						else{
    							Ajouter_photo(data.image); // ici data.image est le chemin vers mon image
    						}
    					}
    				}
    				// fonction qui permet de faire valider le formulaire dès la selection d'une image
    				$('#up').submit(function() { 
    					// inside event callbacks 'this' is the DOM element so we first 
    					// wrap it in a jQuery object and then invoke ajaxSubmit 
    					$(this).ajaxSubmit(options); 
    					// !!! Important !!! 
    					// always return false to prevent standard browser submit and page navigation 
    					return false; 
    				}); 
     
    				// A la selection d'une image, on submit automatiquement le formulaire
    				$('#file').change(function() {
    					$('#up').submit();
    				});
    			})
     
    			// Ajout à l'écran d'une image
    			function Ajouter_photo(image){
    				var id=image.substr(15,10) //creation d'un id sans "." ni "/" à l'intérieur
    				compteur++;
    				alert("ajout: "+compteur);
    				if (compteur==3){
    				$("input#file").hide(); // on cache le champs à partir de 3 images affichées, l'utilisateur ne peut uploader que 3images max.
    				}
    				// création de la sctructure d'affichage ce qui va donner un truc comme ça <div class="relatif" id="numero_unnique"><div class="absolu"><img src="la/source/" /><img class="delete" id="numero_unique" src=img/delete-icon-small.png></div></div> 
    				var divRel = document.createElement("div");
    				divRel.setAttribute("class","relatif");
    				divRel.setAttribute("id",id);
     
    				var divAbs = document.createElement("div");
    				divAbs.setAttribute("class","absolu");
     
     
    				var img = document.createElement("img");
                    img.setAttribute("src",image);
     
    				var imgDel = document.createElement("img");
                    imgDel.setAttribute("src","img/delete-icon-small.png");
                    imgDel.setAttribute("id",id);
    				imgDel.setAttribute("class","delete");
     
     
                    divRel.appendChild(divAbs);
    				divAbs.appendChild(img);
    				divAbs.appendChild(imgDel);
    				$("#results").append(divRel);
    				$(".delete").click(function() { // eventhandler losrque l'on clique sur l'icone delete, on supprime la photo 
    					Supprimer_photo(id);
    				});
    			}
     
    			function Supprimer_photo(id){ // cette fonction est appellée plusieurs fois.. sans raison
    				alert(id);
    				//alert(compteur+" avt");
    				$("#"+id+"").fadeOut(function() {
    				$("#"+id+"").remove();
    				});
    				if (compteur==3){
    				$("input#file").show();
    				}
    				compteur--;	
    			}
    le alert placé dans la fonction de suppression m'indique des id plausibles avant la suppression, mais ces id n'existent pas.. du coup mon compteur est décrémenté quand même et cela fausse tout..

    CORRECTION :

    Voici le code fonctionnel, le souci venait de la fonction s'occupant de l'envent $(".delete").click(function().. qui n'était pas assez spécifique, l'ajout d'un id unique dans la selection est donc adéquat, comme ceci : $("#"+id+" img").click(function()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <script type="text/javascript">
    			var compteur=0;
    			$(document).ready(function()
    			{   
     
    			var options ={
    					dataType:  'json', 
    					beforeSubmit: function(){
    					$('#loader').html('<img src="img/loading.gif" id="waiting">'); // L'animation de chargement
    					$('#erreur').remove();
    					},
    					success:function(data){
     
    						$('#waiting').remove(); // on supprime l'animation de chargement
    						// Si erreur est set à 1... on annule et on prévient
    						if(data.erreur=='1'){
    							$('#loader').html('<span id="erreur" class="erreur">'+data.message+'</span>'); // On affiche le message d'erreur dans la div
    						}
    						// Si l'upload s'est bien passé, on affiche l'image
    						else{
    							Ajouter_photo(data.image); // ici data.image est le chemin vers mon image
    						}
    					}
    				}
    				// fonction qui permet de faire valider le formulaire dès la selection d'une image
    				$('#up').submit(function() { 
    					// inside event callbacks 'this' is the DOM element so we first 
    					// wrap it in a jQuery object and then invoke ajaxSubmit 
    					$(this).ajaxSubmit(options); 
    					// !!! Important !!! 
    					// always return false to prevent standard browser submit and page navigation 
    					return false; 
    				}); 
     
    				// A la selection d'une image, on submit automatiquement le formulaire
    				$('#file').change(function() {
    					$('#up').submit();
    				});
    			})
     
    			// Ajout à l'écran d'une image
    			function Ajouter_photo(image){
    				var id=image.substr(15,10) //creation d'un id sans "." ni "/" à l'intérieur
    				compteur++;
    				//alert("ajout: "+compteur);
    				if (compteur==3){
    				$("input#file").hide(); // on cache le champs à partir de 3 images affichées, l'utilisateur ne peut uploader que 3images max.
    				}
    				// création de la sctructure d'affichage ce qui va donner un truc comme ça <div class="relatif" id="numero_unnique"><div class="absolu"><img src="la/source/" /><img class="delete" id="numero_unique" src=img/delete-icon-small.png></div></div> 
    				var divRel = document.createElement("div");
    				divRel.setAttribute("class","relatif");
    				divRel.setAttribute("id",id);
     
    				var divAbs = document.createElement("div");
    				divAbs.setAttribute("class","absolu");
     
     
    				var img = document.createElement("img");
                    img.setAttribute("src",image);
     
    				var imgDel = document.createElement("img");
                    imgDel.setAttribute("src","img/delete-icon-small.png");
                    imgDel.setAttribute("id",id);
    				imgDel.setAttribute("class","delete");
     
     
                    divRel.appendChild(divAbs);
    				divAbs.appendChild(img);
    				divAbs.appendChild(imgDel);
    				$("#results").append(divRel);
    				$("#"+id+" img").click(function() { // eventhandler losrque l'on clique sur l'icone delete, on supprime la photo 
    					Supprimer_photo(id);
    				});
    			}
     
    			function Supprimer_photo(id){ // cette fonction est appellée plusieurs fois.. sans raison
    				//alert(id);
    				//alert(compteur+" avt");
    				$("div#"+id+"").fadeOut(function() {
    				$("div#"+id+"").remove();
    				});
    				if (compteur==3){
    				$("input#file").show();
    				}
    				compteur--;	
    			}
    		</script>

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 140
    Par défaut
    Bonjour,

    pour moi ton code va bien, il n'execute supprimer image qu'une fois, lorsque l'icone de suppression est cliquée.

    par contre, comme l'icone de suppression est sur l'image, l'évènement associé au clique sur l'image est aussi déclenché, pour moi ca fait apparaitre une nouvelle image (la meme) à la suite.

    je ne sais pas si je t'ai aidé, mais j'ai observé ce que donne ton code en testant juste ca dans une page vierge , et le body qui porte l'id results

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $(document).click(function(){
      Ajouter_photo('https://calendar.google.com/googlecalendar/images/calendar_logo_vr.png');            
                });

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $(".delete").click(function() {
       Supprimer_photo(id);
       return false;
    });

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    Bonsoir,
    Merci à tous les deux. Le souci venait en fait du handler qui était associé à de nombreuses balises, j'ai rajouté une dépendance à l'id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $("#"+id+" img").click(function() {...
    Merci encore

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    danielhagnoul je m'aperçois que j'avais répondu à côté, le return false; il est indispensable? car je lis énormément de code qui n'a jamais de return false.. ?

    Une autre question, a priori on essaye d'éviter le plus possible les variables globales, ici mon compteur, il y a une technique pour éviter cela ? (je lisais dans ton cahier d'exercice les clôtures, ça peut servir pour ça ?)

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Le return false évite l'action par défaut et la propagation des événements. La clôture permet de travailler dans un espace clos, mais je n'ai pas assez de temps pour voir si c'est utile pour votre code.

    Par contre, il ne faut jamais déclarer des gestionnaires d'événements dans une fonction qui sera appelée plus d'une fois, car vous créez autant de fois l'événement que vous appelez la fonction. C'est sans doute l'origine de votre problème pour la suppression.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/07/2012, 15h26
  2. Macro qui se lance toute seule, sans mon autorisation
    Par csempere dans le forum VBA Word
    Réponses: 5
    Dernier message: 06/06/2009, 09h10
  3. Tri personnalisé qui se lance tout seul
    Par zert84 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/09/2008, 12h35
  4. [webcam] qui se lance toute seule
    Par zodd dans le forum Sécurité
    Réponses: 7
    Dernier message: 20/02/2008, 10h22
  5. Un evenement qui se lance tout seul ?
    Par insane_80 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/03/2007, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo