L'élément document et le reste...

Résolu
alexflex25 Messages postés 106 Date d'inscription vendredi 29 septembre 2006 Statut Membre Dernière intervention 6 mars 2012 - 7 mai 2010 à 15:16
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 - 9 mai 2010 à 19:36
Bonjour,
En désespoir de cause je viens vous demander de l'aide une n-ème fois.

Soit la class javascript suivante :
var alerting = Class.create({
initialize: function(){
},
alerter: function(condition){
if(condition == true){
alert('alert');
}
}
});


Soit le code exécuté suivant:
Event.observe(window,'load',function (){
Event.observe(document,'click',function(){
var a = new alerting();
a.alerter(true);
});

Event.observe($('menu_nv_1'),'click',function(){
var a = new alerting();
a.alerter(false);
});
});									  


Ma question est la suivante:

Pourquoi lorsque je clique sur mon élément "menu_nv_1" j'ai mon message d'alerte qui s'affiche?

Je pense qu'il s'agit d'un "pseudo héritage" des méthodes attaché à l'élément "document" dans tous les autres objet du document.

Dans le cas ou ma "pseudo explication" soit la bonne j'aimerais savoir s'il y a une solution.

Merci d'avance.

6 réponses

PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
7 mai 2010 à 18:59
Bonjour,
ce n'est pas le message de l'élément "menu_nv_1" qui s'affiche mais celui du document.
C'est un problème de propagation.
La solution est de stopper celle ci en modifiant ton appel comme suit
Event.observe(window,'load',function (){
  Event.observe(document,'click',function(){
    var a = new alerting();
    a.alerter('Bonjour du document');
  });
  //-- Appel modifie
  Event.observe($('menu_nv_1'),'click',function(e){ // ajout parametre e
    var a = new alerting();
    a.alerter('Bonjour de menu_nv_1');
    e.stop(); // stoppe la propagation
  });
});


;O)
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 mai 2010 à 15:16
Bonjour,
Première remarque :
Préféres les fonctions anonyme que la création de celle ci avec la syntaxe new Function, moins clair à mettre en oeuvre entre autres.

Deuxième remarque :
Lorsque tu cliques sur un élément du document, si celui ci n'a pas d'événement associé c'est le document qui le reçoit, ce qui veut dire qu'il faut mettre un événement sur tes DIVs leur indiquant de ne rien faire. En clair onclick = stopPropagation.

Troisième remarque :
Comme tu utilises une bibliothèque, autant en utiliser ses fonctionnalités, d'autant qu'il y a 2 façon de gérer les événement, une globale, IExplorer et une affectée à chaque objet, FireFox, Opéra, Safari ( voir le e en paramètre dans l'exemple ci aprés )...

exemple pour bien voir la remarque 2
var alerting  = Class.create({
  initialize: function (obj_, param_) {
    this.obj = obj_;
    obj_.param = param_; // pour bien voir
  },
  alerter: function (condition) {
    if (condition == true) {
      this.obj.onclick = function (e) {
        alert('onclick :\n' + this.param);
        if (e) {
          alert('e existe !'); // pour bien voir
          e.stopPropagation();
          e.preventDefault();
        } else {
          alert('event existe !'); // pour bien voir
          event.cancelBubble = true;
          event.returnValue = false;
        }
      }
    }
  }
});

Event.observe(window, 'load', function () {
  var a = new alerting(document, 'Click sur document');
  a.alerter(true);
  var b = new alerting($('menu_nv_1'), 'Hello! de menu_nv_1');
  b.alerter(true);
  var c = new alerting($('menu_nv_2'));
  c.alerter(false);
});


pour tenir compte de la remarque 3 il est préférable d'écrire
if (condition == true) {
  Event.observe(this.obj, 'click', function (e) {
    alert('onclick :\n' + this.param);
    e.stop();
  });
}
l'écriture en est du coup allégée

Il te reste donc a affecter un non événement sur les objets que tu ne veux pas faire entrer en jeu...

"Réfléchi!", tu ne sera pas loin de ton premier code...
;O)
3
alexflex25 Messages postés 106 Date d'inscription vendredi 29 septembre 2006 Statut Membre Dernière intervention 6 mars 2012
9 mai 2010 à 10:35
Bonjour,

Merci beaucoup pour cette solution, grâce à cela j'ai pu rechercher de la documentation pour en apprendre plus sur la "propagation" en JavaScript.
Pour aller plus loin voici un autre petit challenge qui me pose à nouveau le même type de problème?

Sur le même plan...
Soit la classe suivante:
var alerting = Class.create({
initialize: function(obj){
this.obj = obj;
},
alerter: function(condition){
if(condition == true){
this.obj.onclick = new Function ("alert('exemple parmis tant dautre')");
}
}
});


Soit le code suivant:
Event.observe(window,'load',function (){
var a = new alerting(document);
a.alerter(true);									  
var b = new alerting($('menu_nv_1'));
b.alerter(false);									  
var c = new alerting($('menu_nv_2'));
c.alerter(false);									  
});	


Le problème et le même que précédemment mais cette fois ci je ne vois pas ou stopper la propagation, pour que dans tout le document une alerte s'affiche à chaque clic, sauf dans le cas ou je clique sur les éléments "menu_nv_1" et "menu_nv_2".

Merci d'avance.

PS: Si la réponse est aussi simple que pour ma première question j'accepterai la réponse : "Réfléchi!"
0
alexflex25 Messages postés 106 Date d'inscription vendredi 29 septembre 2006 Statut Membre Dernière intervention 6 mars 2012
9 mai 2010 à 16:51
Bonjour

Première remarque bien pris en compte...

La deuxième remarque m'oblige donc à attribuer une action "vide" à l'événement "click" sur mes "objets" à exclure, uniquement dans le but intercepter l'événement (click) pour qu'il ne soit pas transmis au document.

Merci pour la troisième remarque.


Voila ma conclusion :

var alerting = Class.create({
initialize: function (obj, message) {
this.obj = obj;
                // obj_.param = param_; // Pour une raison d'habitude j'ai préféré faire
this.message = message; // ceci (+ voir "cela")
},
alerter: function (condition) {
if (condition == true) {
Event.observe(this.obj, 'click', function (e) {
alert('onclick :\n' + this.message);
e.stopPropagation();
}.bind(this)); // cela
}else{
Event.observe(this.obj, 'click', function (e) { //Pour les remarques 2 et 3
e.stopPropagation();                    //Pour les remarques 2 et 3
});                                             //Pour les remarques 2 et 3
}
}
});

Event.observe(window, 'load', function () {
var a = new alerting(document, 'Click sur document');
a.alerter(false);
var b = new alerting($('menu_nv_1'), 'Hello! de menu_nv_1');
b.alerter(true);
var c = new alerting($('menu_nv_2'), 'Hello! de menu_nv_2');
c.alerter(true);
});


Je viens de remarquer une chose à l'instant toujours en gardant la même Class.

Ce code fonction correctement sans aucun problème.
Event.observe(window, 'load', function () {
var a = new alerting(document, 'Click sur document');
a.alerter(false); //ici
var b = new alerting($('menu_nv_1'), 'Hello! de menu_nv_1');
b.alerter(true);  //ici
var c = new alerting($('menu_nv_2'), 'Hello! de menu_nv_2');
c.alerter(true);  //ici
});


En revanche celui-ci pose un problème lors de l'utilisation des boutons "droit" et "central" de la souris.
Event.observe(window, 'load', function () {
var a = new alerting(document, 'Click sur document');
a.alerter(true);   //la
var b = new alerting($('menu_nv_1'), 'Hello! de menu_nv_1');
b.alerter(false);  //la
var c = new alerting($('menu_nv_2'), 'Hello! de menu_nv_2');
c.alerter(false);  //la
});


le message "Click sur document" apparait dans le cas ou je clic sur "menu_nv_1" ou "menu_nv_2" avec le bouton "droit" ou "central" de la souris... Alors que le bouton "gauche" ne pose pas de problème...

Pour encore abuser de ton temps pourrais-je te demander comment as-tu fais pour acquérir une tel connaissance en javascript. Tu aurais peut-être quelque site ou ouvrage à me recommander.

Dans tous les cas merci de ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 mai 2010 à 19:27
en premier lieu il est effectivement important de bien savoir ce que l'on veut comme réaction.

Dans ton cas il est peu être important de ne pas stopper la propagation lorsque tu cliques sur le document.

Dans la fonction onclick il est tout à fait envisageable de tester le bouton appuyé et de réagir en fonction.

...comment as-tu fais pour acquérir une tel connaissance en javascript...
c'est gentil mais sache que j'ignore bien plus de choses que je n'en connais...

il existe une multitude de sites bien fait
- developer.mozilla
- msdn.microsoft
- w3schools
- ...etc...
et encore tous pleins d'autres, sans oublier les tutoriaux ou autres FAQs des différents forums...

* c'est forgeant que l'on devient vachement fatigué...
* il ne sert à rien de réinventer la roue si ce n'est pour comprendre comment elle marche...
;O)
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 mai 2010 à 19:36
jai oublié de te signaler
e.stop();
à la place de
e.stopPropagation();

;O)
0
Rejoignez-nous