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 :

Controler l'ordre d'exécution des fonctions liées à un même événement


Sujet :

jQuery

  1. #1
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut Controler l'ordre d'exécution des fonctions liées à un même événement
    Bonjour à tous,

    Je me pose un question toute bête. Si je "bind" plusieurs fonctions à un même événement, exemple (3 fonctions sur un click de bouton):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      $(document).on('click', '#submit', function() {
      	function1();			
       });
     
       $(document).on('click', '#submit', function() {
    	function2();			
       });
     
        $(document).on('click', '#submit', function() {
    	function3();			
       });
    Puis je gérer l'ordre d’exécution après pression sur le bouton #submit?
    Apparemment avec ce code, les 3 fonctions s'exécutent simultanément or je voudrais que la fonction2 ne démarre qu'à la fin de la fonction 1 et que la 3 ne démarre qu'à la fin de la 2 (Exécution séquentielle).
    Je pensais à une solution "bidouille" qui consisterait à déclencher manuellement un nouvel événement avec la fonction .trigger() à la fin de la fonction 1 et 2 puis à lier le démarrage des fonctions 2 et 3 à ces nouveaux événements successifs.

    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Non, déclaré de la sorte les trois fonctions s'exécuteront en parallèle. Pour les exécuter séquentiellement, il suffit de les enchaîner tout bêtement (en supposant que ces fonctions soient synchrones)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $(document).on('click', '#submit', function() {
       function1();
       function2();
       function3();
    });

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Tu peux effectuer ce que t'as conseillé Sylvain, en n'oubliant pas que s'il s'agit de fonctions asynchrones (genre appel AJAX), il faudra utiliser des fonctions de callback à la place d'une suite d’exécution.

    Celà dit, si tu souhaite déclarer successivement les fonctions appelées, rien ne t’empêche de créer une fonction pour ce fonctionnement, du style :

    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
    var execAllFct = function(fctTab) {
        return function() {
            for (var i=0; i<fctTab.length; i++) {
                tabfct[i]()
            }
        }
    };
     
    var devenirCalife = [
        epouserPrincesse: function() {...},
        comploterAvecIznogoud: function() {...},
        doublerIznogoud: function() {...},
        SavourerSonHarem: function() {...}
    ];
     
    $document.on('click', '#submit', execAllFct(devenirCalife))
    Pour un exemple dans le cas de fonctions synchrones.

  4. #4
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Merci pour vos réponses!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $(document).on('click', '#submit', function() {
       function1();
       function2();
       function3();
    });
    C'est vrai que cette solution semble la plus simple mais dans mon cas ce n'est pas possible.
    Il faut que je détaille un peu plus le contexte:
    J'ai une interface qui permet la saisie d'infos par l'utilisateur et l'upload de 2 fichiers.
    Pour l'upload j'utilise le plugin "blueimp/jQuery-File-Upload".

    Voila à quoi ressemble l'instanciation du plugin pour le champs image $(#file-img):

    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
     
    $('#file-img').fileupload({
            dataType: 'json',
    	autoUpload: false,
    	formData: {type: 'business', proposal: 'demand'},
    	add: function (e, data) {
    		var uploadErrors = [];
    		var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
    		if(data.originalFiles[0]['type'] && !acceptFileTypes.test(data.originalFiles[0]['type'])) {
    			uploadErrors.push('Not an accepted file type');
    		}
    		if(data.originalFiles[0]['size'] && data.originalFiles[0]['size'] > 4000000) {
    			uploadErrors.push('File size is too big');
    		}
    		if(uploadErrors.length > 0) {
    				alert(uploadErrors.join("\n"));
    		} else {
    			$.each(data.files, function (index, file) {
    				$("#txt-file-img").val(file.name);
    			});
    			$("#btn_add_valid").on('click',function () {
    			        $("#loading_img_modal").modal("show");
    			        data.submit();
    			});
    		}
    	},
    	done: function (e, data) {
    	        $("#loading_img_modal").modal("hide");
    	},
    	progressall: function (e, data) {
    		var progress = parseInt(data.loaded / data.total * 100, 10);
    		$('#upload-img .bar').css(
    			'width',
    			progress + '%'
    		);
    		$('#img-percentage').text(
    			progress + '%'
    		);
    	},
    	fail: function (e, data) {
    		alert('Error');
    		$("#loading_img_modal").modal("hide");
    	}
    });
    Dans le code ci-dessus, la ligne qui lance l'upload est la suivante:
    On voit bien que je fais un bind sur le click du bouton $("#btn_add_valid")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $("#btn_add_valid").on('click',function () {
    	$("#loading_img_modal").modal("show");
    	data.submit();
    });
    Le problème c'est que J'ai une autre instance du même genre pour le champs document qui permet l'upload de .pdf ou de .doc.
    J'ai également l' appel d'une fonction ajax pour modifier la base de donnée qui se lance aussi lors du click sur $("#btn_add_valid")

    Toutes ces fonctions doivent être exécuter dans un certain ordre.
    J'ai besoin des infos insérées dans la base pour définir le chemin lors de l'upload des fichiers...

    en n'oubliant pas que s'il s'agit de fonctions asynchrones (genre appel AJAX), il faudra utiliser des fonctions de callback à la place d'une suite d’exécution.
    Je crois en effet que la solution se situe dans les callbacks. Il faut que je regarde ça de plus près.

  5. #5
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    D'après ce que je comprends, si je souhaite que l'upload du document commence quand l'upload de l'image est terminé il me faut faire quelque chose
    comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $('#file-img').fileupload({/**Le code pour l'upload de l'image**/})
    	.bind('fileuploadprocessdone', function () { 
    		$('#file-doc').fileupload({/**Le code pour l'upload du doc **/})
    	})
    Ensuite il me faut placer ce code dans ma fonction ajax

    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
     
    $.ajax({
    	type:'POST',
    	url:'/index.php?option=com_test&task=addProposal&format=raw',
    	data:{	name_en: name_en,
    		use_en: use_en,
    		desc_en: desc_en
    	},
    	beforeSend:function(){
    		$("#loading_modal").modal("show");
    	},
    	complete:function(){
    		$("#loading_modal").modal("hide");
    	},
    	success:function(msg){
    		$('#file-img').fileupload({/**Le code pour l'upload de l'image**/})
    			.bind('fileuploadprocessdone', function () { 
    				$('#file-doc').fileupload({/**Le code pour l'upload du doc **/})
    			})		
     
    	},
    });

    Pour ajouter en compléxité, les champs pour l'upload sont optionnels ce qui implique que l'utilisateur peut vouloir uploader un document sans uploader d' image!!
    Dans ce cas de figure le code ci-dessus ne devrait pas fonctionner... Je continue à chercher.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Je ne comprend toujours pas pourquoi tu souhaite que l'une de ces actions soit effectuée avant l'autre en fait...

  7. #7
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Je ne comprend toujours pas pourquoi tu souhaite que l'une de ces actions soit effectuée avant l'autre en fait...
    La fonction AJAX met à jour la base et j'ai besoin de ces infos pour définir le répertoire dans lequel je vais stocker les fichiers uploadés (Le répertoire est créé juste avant l'upload et porte le nom inséré dans la base).

    Pour ce qui est des 2 fonctions d'upload (image et document). J'affiche pour chacune d'entre elles, une barre de chargement. Je souhaitais juste attendre que le premier chargement soit terminé pour faire disparaître le premier loading et faire apparaître le second (peu importe l'ordre en fait)....

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 125
    Points : 149
    Points
    149
    Par défaut
    Au plus simple,

    Par défaut tu désactive le bouton de l'image, en promise de success de l'ajax pour l'envoi du document, tu active le bouton, sinon tu indique une erreur.

    Bien sur tu sécurise le tout sur le serveur, si le répertoire n'existe pas à l'envoie de l'image, tu renvoie une erreur.

    A moins que j'ai mal compris, tu n'as qu'un bouton de validation de formulaire pour les 2 fichier ? Mais tu veux que ce bouton provoque successivement l'envoi des 2 fichiers ?

  9. #9
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    tu n'as qu'un bouton de validation de formulaire pour les 2 fichier ? Mais tu veux que ce bouton provoque successivement l'envoi des 2 fichiers ?
    C'est exactement ça

    J'ajoute quelques autres points:
    - Quand je clique sur le bouton de validation j'envoie aussi les infos du formulaires et je créé une nouvelle entrée dans la base.
    - L' id de cette nouvelle entrée (un numéro unique) est utilisé comme nom pour la création d' un répertoire qui va contenir le ou les fichiers uploadés.
    - L'upload de fichier est optionnel -> Le répertoire peut contenir 1,2 ou 0 fichier (le répertoire est créé même si il reste vide)
    - Les contrôles du type de fichier et de la taille limite sont appliqués lors de la sélection de chaque fichier mais l'envoie des fichiers n'a lieu que lors du click sur le bouton validation du formulaire

Discussions similaires

  1. Ordre d'exécution des controller
    Par kheironn dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 30/10/2014, 15h08
  2. Ordre d'exécution des fonctions
    Par tom06440 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/10/2010, 15h16
  3. [URL Rewriting] ordre d'exécution des règles
    Par safisafi dans le forum Apache
    Réponses: 1
    Dernier message: 21/11/2006, 18h52
  4. [AJAX] Ajax et exécution des fonctions javascript
    Par Bobtop dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/06/2006, 15h22
  5. ordre d'exécution des événements onblur et onfocus
    Par letycaf dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/05/2006, 15h30

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