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 :

Deux événements jQuery .on() sur la même page


Sujet :

jQuery

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut Deux événements jQuery .on() sur la même page
    Bonjour,

    Je suis actuellement en train de travailler sur une application web de gestion de produits (c'est une base de données en somme).
    Dans la partie administration, j'ai un référentiel permettant de paramétrer différentes informations nécessaires à l'usage de l'application (marques, revendeurs, utilisateurs, ...), se présentant chacun sous la forme d'un tableau.

    Pour chaque donnée, j'ai créé deux liens : Supprimer et Editer. Derrière, il y a :
    • href : #
    • class = "remove brands value=X


    Où les classes permettent de définir l'action à réaliser (remove ou edit), le type de référentiel (l'idée étant de mutualiser le traitement de ces deux liens avec les autres référentiels) et la valeur de l'élément.

    Je voudrai, en cliquant sur un des liens, qu'un appel AJAX se fasse pour réaliser l'opération.
    Cela fonctionne avec un des deux liens mais pas avec les deux.

    Le code source gérant le lien de suppression :
    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
     
    jQuery(document).off().on('click', '.remove', function(event) {
    	event.preventDefault();	// empèche le traitement standard (redirection vers la cible du lien)
     
    	// lecture des classes
    	var classes = jQuery(this).attr('class').split(" ");
    	var tab = classes[2].split("=");	// lecture de la valeur
    	var ref = tab[1];
    	switch(classes[1]) {
    		case 'brands':
    			$.ajax({
    				url: "index.php?page=admin&action=deleteBrand",
    				type: "POST",
    				data: ({
    					brand_ref: ref
    				}),
    				dataType: "json",
    				success: function(response) {
    					updateGrid();	// mise à jour du tableau
    				}
    			});
    			break;
    		default:
    			break;
    	}
    });
    Sachant que j'ai eu le cas où plusieurs appels AJAX se faisait, j'ai dû rajouter le .off().

    Au début, je me suis dit que je vais faire pareil que cette fonction juste en remplacant .remove par .edit (correspondant à la classe présente dans le lien d'édition) mais cette stratégie ne fonctionne pas et fait planter l'ensemble de la page.

    Comment gérer deux évènements on click ?

    Merci de votre aide

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par yoshi84300 Voir le message
    Au début, je me suis dit que je vais faire pareil que cette fonction juste en remplacant .remove par .edit (correspondant à la classe présente dans le lien d'édition) mais cette stratégie ne fonctionne pas et fait planter l'ensemble de la page.
    Ben tu as dû te planter quelque part, mais sur le principe il n'y a aucune raison que cela ne fonctionne pas. Mais bon faudrait peut être aussi changer la destination de la requête ajax, les variables jointes dans la requête et sans doute aussi l'action en retour de requête (puisque "supprimer" et "éditer" n'ont pas les mêmes conséquences).

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    tu peux mettre ce que tu veux dans la fonction .
    un exemple ci dessous pour lancer deux actions différentes suite à un seul onclick.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
         <script type="text/javascript">
                                            $(function (e) {
                                                $(".remove").click(function (e) {
                                                                        event.preventDefault();	
                                                                    console.log('even 1');
                                                                    alert(' event 2' );
     
                                            });
    </script>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Merci pour vos réponses

    Citation Envoyé par ABCIWEB Voir le message
    Ben tu as dû te planter quelque part, mais sur le principe il n'y a aucune raison que cela ne fonctionne pas. Mais bon faudrait peut être aussi changer la destination de la requête ajax, les variables jointes dans la requête et sans doute aussi l'action en retour de requête (puisque "supprimer" et "éditer" n'ont pas les mêmes conséquences).
    Je suis d'accord, ce serai parfaitement logique mais il doit y avoir un truc qui bloque.

    Pour info, chaque tableau est contenu dans une page distincte qui est appelé par un arbre. C'est le contrôleur qui inclus la page demandée.
    Le tableau étant généré dynamiquement par le contrôleur.

    Tu veux dire faire une fonction commune, lire la valeur de la classe et en fonction, faire un appel AJAX différent ? J'y est pensé mais quelle "balise" lire ?

  5. #5
    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 : 73
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $( "body" ).on( 'click', '.remove', function( event) { //... });
    $( "body" ).on( 'click', '.edit', function( event) { //... });
    Ce sont deux gestionnaires d'événements différents !

    Le premier intercepte un événement "click" sur les éléments du DOM ayant la classe ".remove".
    Le second intercepte un événement "click" sur les éléments du DOM ayant la classe ".edit".

    Voir : Différences entre on() avec 1 ou 2 sélecteurs

    Rien ne vous empêche de traiter les événements "click" dans la même fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var clickHandler = function( ev ){ //votre code avec la transaction AJAX };
     
    $( "body" ).on( 'click', '.remove', clickHandler );
    $( "body" ).on( 'click', '.edit', clickHandler );

    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.)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message

    Rien ne vous empêche de traiter les événements "click" dans la même fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var clickHandler = function( ev ){ //votre code avec la transaction AJAX };
     
    $( "body" ).on( 'click', '.remove', clickHandler );
    $( "body" ).on( 'click', '.edit', clickHandler );
    C'est grosso modo mon idée de base mais qui refuse de fonctionner. Après, le sélecteur jQuery porte sur le document et pas la balise body. Je vais essayer avec la balise.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    J'ai essayé cette solution. Elle "marche" lors du premier clic mais fait planter le reste du script. Par exemple, je clique sur le lien d'édition tout va bien puis je clique sur le lien de suppression et le script plante
    Edit : j'ai l'impression que c'est le dernier event on() qui prend la main sur l'autre event.



    Une idée ?

    Merci

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 48
    Points : 24
    Points
    24
    Par défaut
    Bonsoir,

    Problème résolu
    J'ai fait une fonction commune à la suppression et à l'édition. La différence se fait par la classe présente dans le lien.

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    jQuery("tbody").off().on('click', function(event) {
        if(($(event.target).hasClass('remove')) || ($(event.target).hasClass('edit'))) {
            // détection d'un lien de suppression ou d'édition pour bloquer le traitement standard, sinon c'est un lien classique
        }
    });

    Merci pour votre aide

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

Discussions similaires

  1. Deux bibliothèques jQuery sur une même page
    Par hous04 dans le forum jQuery
    Réponses: 3
    Dernier message: 27/12/2012, 10h22
  2. [ODS HTML] Mettre deux graphiques côte à côte sur une même page
    Par mamclarss dans le forum ODS et reporting
    Réponses: 4
    Dernier message: 23/07/2012, 10h40
  3. Deux scripts jquery sur la même page ?
    Par beegees dans le forum jQuery
    Réponses: 1
    Dernier message: 01/03/2011, 23h34
  4. [MySQL] Connexion à deux bases de données sur la même page !
    Par Mike91 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/06/2008, 10h27
  5. Faire deux défilements d'images sur une même page
    Par ndsaerith dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/09/2007, 18h42

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