begin process at 2012 05 29 05:30:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Javascript / DHTML / Ajax

 > 

CSS

 > 

Général

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 7 mai 2010 à 15:16:59 | L'élément document et le reste...

alexflex25

Bonjour,
En désespoir de cause je viens vous demander de l'aide une n-ème fois.

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


Soit le code exécuté suivant:
Code Javascript :
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.
vendredi 7 mai 2010 à 18:59:04 | Re : L'élément document et le reste...

PetoleTeam

Membre Club
Réponse acceptée !
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
Code Javascript :
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)
dimanche 9 mai 2010 à 10:35:26 | Re : L'élément document et le reste...

alexflex25

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:
Code Javascript :
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:
Code Javascript :
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!"
dimanche 9 mai 2010 à 15:16:37 | Re : L'élément document et le reste...

PetoleTeam

Membre Club
Réponse acceptée !
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
Code Javascript :
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
Code Javascript :
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)
dimanche 9 mai 2010 à 16:51:56 | Re : L'élément document et le reste...

alexflex25

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 :

Code Javascript :
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.
Code Javascript :
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.
Code Javascript :
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.
dimanche 9 mai 2010 à 19:27:11 | Re : L'élément document et le reste...

PetoleTeam

Membre Club
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)
dimanche 9 mai 2010 à 19:36:44 | Re : L'élément document et le reste...

PetoleTeam

Membre Club
jai oublié de te signaler
Code Javascript :
e.stop();
à la place de
Code Javascript :
e.stopPropagation();

;O)


Cette discussion est classée dans : élément, function, code, var, document


Répondre à ce message

Sujets en rapport avec ce message

Variable retour de function [ par bydouille ] Bonjour, Je désire faire et utiliser une function qui me renvoie le contenu d'une ligne de tableau (3 cellules) avec comme id : cell-1, cell-2, cell- unterminated string literal [ par kangun ] Bonjour. je me tourne vers vous suite à un problème apparut sur un java script. en effet, je souhaite afficher une bulle au dessus d'une image et chan Aide a la création d'une fonction [ par kyoku59 ] Bonjour. Voila j'ai cette fonction : [code=js] function heures() { var tabHeure= new Array("01","02","03", "04", "05","06","07", "08" recharger les variables suite à un reload [ par goyave ] bonjour suite à un changement de machine et de prog je me trouve confronté à un probleme enervant j'ai un formulaire avec les champs [code=autre]nom Liste déroulante qui masque la suivante si "non selectionné" [ par scoal ] Bonjour, J'ai 3 liste déroulante qui s'enchaine, le contenue de la seconde dépend du "select" de la première et de même pour la troisième en fonction Function qui ne functionne pas... [ par Xiarea ] Bonjour, Je suis entrain d'essayer de faire ouvrir un popup lors d'un double clic sur une image. La nouvelle page doit connaitre les coordonées de la Alternance entre divs [ par Trashful ] Bonjour à tous, J'ai un petit problème et j'espère que votre communauté sera en mesure de corriger mes petites erreurs. N'étant pas un professionnel Pb de validation d'un formualaire [ par HovOne ] Bonsoirje souhaite valider ce formulaire html/php via un script en JS[quote]        "http://www.w3.org/TR/2000/REC-xhtml1-2 modification lightbox .... bouton close en haut a droite [ par petardier ] bonjour,je souhaite modifier une light box en mettant le bouton close en haut a gauche , plutot qu'en bas.Ainsi, quand une image est plus grande que l code html comme cookie [ par g_fuck ] salut! j'ai un code JS servant a storer des cookies : function  SetCookie (name, value) {  var argv = SetCookie.a


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales