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 :

Priorité au plus gradé ?


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Priorité au plus gradé ?
    Bonsoir,
    j'ai eu un "ptit souss'aïe" de priorité.
    Voici le topo :
    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
    <!-- Scripts jQuery : initialisation -->
    <script type="text/javascript" src="http://code.jquery.com/jquery.js"></script>
    <script type="text/javascript" >
    $(document).ready(function() {
    	// ------------------------------------------------------------------
    	// 1er script
    	$('body').on('keyup', 'input', function() {
    		var valeur = $(this).val();
    		if(valeur!=''){	$(this).next('span').html('OK, input renseigné !');
    		}
    	});
    	// ------------------------------------------------------------------
    	// 2ème script
    	$('#blocForm').on('keyup', 'input', function () {
    		var valeur = $(this).val();
    		if(valeur!=''){	$(this).next('span').html('Bonne valeur, ma foi !');
    		}
    	});
    	// ------------------------------------------------------------------
    });
    </script>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <body>
    <form id="blocForm">
    	<input name="test" type="text" value="" />
    	<span></span>
    </form>
    </body>
    Quand on tape du texte dans l'input, il s'affiche (cela provient du 1er script) :
    OK, input renseigné !
    OR, le 2ème script "voudrait bien" afficher :
    'Bonne valeur, ma foi !'
    Le problème conflit vient du fait que le 1er script commence par :
    alors que le 2ème script commence par :
    Mon instinct me dit que 'body' est "plus gradé que" (= "de niveau supérieur à") '#blocForm', puisqu'il l'englobe.
    D'ailleurs, en remplaçant $('#blocForm') par $('body') dans le 2ème, ça donne le résultat attendu. Ce qui ne me surprends pas.

    MAIS (sachant que je souhaite garder 'keyup' dans les 2 scripts) :
    => est-il possible de donner la priorité au 2ème script (en conservant $('#blocForm') ) ??
    => ou d'exécuter le 2ème script APRES le 1er ??
    Avec .delay() ?? (mais je n'ai pas réussi à le mettre où il faudrait)

    Merci.
    Dernière modification par Invité ; 07/11/2012 à 23h00.

  2. #2
    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 : 75
    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
    Lors d'un événement keyup sur l'input, celui-ci remonte la hiérarchie du DOM. Il passe donc bien d'abord sur le formulaire avant d'atteindre le body.

    Le problème n'est pas là, mais dans l'usage de html() au lieu de append(), car html() supprime le contenu existant avant d'insérer la nouvelle valeur.

    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
    	// ------------------------------------------------------------------
    	// 1er script
    	$('body').on( 'keyup', 'input', function(){
    		var valeur = $(this).val();
    		if(valeur!=''){	$(this).next('span').append(' OK, input renseigné !');
    		}
    	});
     
    	// ------------------------------------------------------------------
    	// 2ème script
    	$('#blocForm').on( 'keyup', 'input', function(){
    		var valeur = $( this ).val();
     
    		if ( valeur!='' ){
    			$( this ).next( 'span' ).html( 'Bonne valeur, ma foi !' );
    		}
    	});
    	// ------------------------------------------------------------------

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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir Daniel,
    je ne souhaite pas afficher les deux textes.
    En fait, ceci n'est qu'un exemple.
    Dans la réalité, j'ajoute des <span>, avec des class différentes, et d'autres choses...

    J'aurais très bien pu mettre en exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$( this ).next( 'span' ).removeClass().addClass( 'class1' );
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		$( this ).next( 'span' ).removeClass().addClass( 'class2' );
    Je voudrais que le 2ème script "prenne le dessus" sur le 1er.
    Possible, ou pas ?

    Mais bon. J'ai l'impression qu'on ne peut pas grand chose contre la hiérarchie...
    Si ??

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Comme l'explique Daniel, lorsque tu utilises les événements délégués, tu poses le gestionnaire sur l'élément de référence. Dans ton cas, les événements concernent les balises <input>et sont posés respectivement sur l'objet body et #blocForm.
    Lorsque l'événement est déclenché sur un input, celui-ci se propage vers le haut de l'arborescence du DOM. Lorsqu'il atteint la balise #blocForm, le gestionnaire vérifie si l'événement a été généré par le bon élément (ce qui est le cas) et la fonction ad hoc est lancée. L'événement continue à se propager, atteint le body qui déclenche la fonction idoine.
    Donc les deux fonctions ont été exécutée mais tu n'as juste pas eu le temps de le voir.

    Si tu veux éviter que l'événement remonte jusqu'au body, c'est-à-dire stopper sa propagation, tu peux utiliser la méthode stopPropagation().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $('#blocForm').on( 'keyup', 'input', function(e){
        e.stopPropagation();
        // suite des instructions
    });
    event.stopPropagation()
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Si tu veux éviter que l'événement remonte jusqu'au body, c'est-à-dire stopper sa propagation, tu peux utiliser la méthode stopPropagation().
    Bovino, mon héros !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/02/2013, 23h55
  2. Réponses: 2
    Dernier message: 17/01/2013, 16h21
  3. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  4. Les langages les plus faciles et à apprendre en priorité
    Par florent2005 dans le forum Débuter
    Réponses: 6
    Dernier message: 07/10/2005, 21h35
  5. [Datareport] Etat plus large que le papier
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/09/2002, 11h45

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