Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2011, 02h01   #1
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 82
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 82
Points : 27
Points : 27
Par défaut encapsulation d'objets

Bonjour,

J'aimerais utiliser l'encapsulation d'objets pour créer un objet qui va être utiliser pour gérer la compatibilité d'addEventListener et de attachEvent.

Le but c'est qu'à chaque fois que je vais créer un évènement, je vais utiliser un seul et même objet qui va gérer tout seul les problèmes de compatibilités entre IE et Mozilla, ce qui évitera les répétitions dans le code.

J'ai écris un script mais je suis pas sûr de sa bonne syntaxe, surtout qu'il ne fonctionne pas. J'aimerais savoir ce qui cloche SVP :

Code :
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
 
/*
- initialisation de la variable 'myDeclaration'
- si l'objet détecté par le navigateur est addEventListener : utiliser cette syntaxe, avec les 3 paramètres de la fonction
- si c'est IE : utiliser cette syntaxe, sans le 3ème paramètre car attachEvent ne le permet pas
*/
var sameEventTrigger = function(evenement, fonction, diffusion) {
	var myDeclaration = '';
 
	if (event.addEventListener) {
		myDeclaration = addEventListener(evenement, fonction, diffusion);
	}
	else if (event.attachEvent) {
		myDeclaration = attachEvent(evenement, fonction);
	}
	return myDeclaration;
}
 
// instanciation de l'objet, avec des valeurs en paramètres
var eventImage = new sameEventTrigger('click', imgAlert, false);
 
// fonction appelée par eventImage
function imgAlert() {
	var img = document.getElementsByTagName('img');
	alert(img);
}
Code :
<img src="desert.jpg" alt="Désert" title="Désert" />
Merci.
chok371 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 04h45   #2
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 073
Points : 4 073
Code javascript :
1
2
3
4
5
6
7
function declencheur(cible, condition, effet) {
   if (cible.addEventListener) cible.addEventListener(condition, effet, false);
   else if (cible.attachEvent) cible.attachEvent("on" + condition, effet);
}
 
var elementCible = document.getElementById("idDeTonElement")
declencheur(elementCible, "click", function() {alert("coucou");});
... fera une alerte "coucou" à chaque clic, quel que soit le navigateur.
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 15h40   #3
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 82
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 82
Points : 27
Points : 27
Merci, mais le code ne fonctionne pas.
chok371 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 18h26   #4
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 073
Points : 4 073
Citation:
Envoyé par chok371 Voir le message
Merci, mais le code ne fonctionne pas.
Merci, mais cette phrase n'a aucun sens. n'est pas assez claire

Tu peux préciser ?
Et même plus que préciser : montre-nous l'extrait de code qui "ne fonctionne pas" ...
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 20h04   #5
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 82
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 82
Points : 27
Points : 27
Je ne vois pas d'où vient le problème.
chok371 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 20h07   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 802
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 802
Points : 35 807
Points : 35 807
Code :
var sameEventTrigger = function(evenement, fonction, diffusion)
Code :
if (event.addEventListener)
event, c'est quoi ?
D'après le nom, on pourrait penser que c'est l'événement, mais dans ce cas, pas étonnant que "ça marche pas" puisque addEventListener, tout comme attachEvent s'applique à un élément HTML

Citation:
Le but c'est qu'à chaque fois que je vais créer un évènement, je vais utiliser un seul et même objet qui va gérer tout seul les problèmes de compatibilités entre IE et Mozilla, ce qui évitera les répétitions dans le code.
Le problème c'est que dans ta façon de faire, tu crées pour chaque événement une nouvelle instance de ton objet ce qui n'a aucun intérêt à part encombrer la mémoire...

Code :
1
2
3
4
function imgAlert() {
	var img = document.getElementsByTagName('img');
	alert(img);
}
Le "s" de getElementsByTagName ne correspond ni à une lubie ni à une farce des concepteurs de JavaScript mais au fait que la méthode renvoie une collection d'objets HTML, tu dois donc spécifier sur quel élément tu veux travailler.
Citation:
Merci, mais le code ne fonctionne pas.
Pour peu que tu adaptes certains paramètres du code à ta page, le code proposé par Romain est tout à fait correct
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 00h23   #7
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 82
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 82
Points : 27
Points : 27
Citation:
event, c'est quoi ?
D'après le nom, on pourrait penser que c'est l'événement, mais dans ce cas, pas étonnant que "ça marche pas" puisque addEventListener, tout comme attachEvent s'applique à un élément HTML
je croyais qu'AEL faisait partie de l'objet event, donc pour moi c'était "est ce que le navigateur détecte la méthode AEL de l'objet event"

Citation:
Le problème c'est que dans ta façon de faire, tu crées pour chaque événement une nouvelle instance de ton objet ce qui n'a aucun intérêt à part encombrer la mémoire...
ok, mais si il y a plus d'objet, c'est toujours de l'encapsulation ?

Citation:
Pour peu que tu adaptes certains paramètres du code à ta page, le code proposé par Romain est tout à fait correct
je l'ai fait mais j'ai du oublier quelque chose (p-e le windos.onload ?).

voici le code complet :

Code :
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 
	<title>Encapsulation</title>
 
	<script type="text/javascript">
/*
	- si l'objet détecte par le navigateur est addEventListener : utiliser cette syntaxe, avec les 3 param�tres de la fonction
	- si c'est IE : utiliser cette syntaxe, sans le 3ème paramètre car attachEvent ne le permet pas
*/
function declencheur(cible, condition, effet) {
   if (cible.addEventListener) cible.addEventListener(condition, effet, false);
   else if (cible.attachEvent) cible.attachEvent("on" + condition, effet);
}
 
var elementCible = document.getElementById("idDeTonElement")
declencheur(elementCible, "click", function() {alert("coucou");});
	</script>
</head>
<body>
 
<img src="desert.jpg" alt="Désert" title="Désert" id="idDeTonElement" />
 
</body>
</html>
merci
chok371 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 01h52   #8
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 073
Points : 4 073
Citation:
Envoyé par chok371 Voir le message
... j'ai du oublier quelque chose (p-e le windos.onload ?). ...
Oui a priori ce n'est que ça
Au moment ou le script inclus dans <head> est interprété, le DOM de la page n'est pas encore dispo, donc le getElementById échoue et le gestionnaire n'est appliqué à rien...

Place l'attribution du gestionnaire à ton élément (comme tu semblais le deviner déjà vu ta remarque) dans le gestionnaire window.onload, par exemple :
Code html :
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 
	<title>Encapsulation</title>
 
	<script type="text/javascript">
/*
	- si l'objet détecte par le navigateur est addEventListener : utiliser cette syntaxe, avec les 3 param�tres de la fonction
	- si c'est IE : utiliser cette syntaxe, sans le 3ème paramètre car attachEvent ne le permet pas
*/
function declencheur(cible, condition, effet) {
   if (cible.addEventListener) cible.addEventListener(condition, effet, false);
   else if (cible.attachEvent) cible.attachEvent("on" + condition, effet);
}
 
declencheur(window, "load", function() {
   var elementCible = document.getElementById("idDeTonElement");
   declencheur(elementCible, "click", function() {alert("coucou");});
});	</script>
</head>
<body>
 
<img src="desert.jpg" alt="Désert" title="Désert" id="idDeTonElement" />
 
</body>
</html>
Et ensuite si, comme c'est probable, tu as d'autres gestionnaires à attribuer et autres choses à initialiser, fais-toi une fonction initialiser() que tu appelles sur le window.onload, dans laquelle tu placeras l'ensemble de tes traitements...

Tiens-nous au jus
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 02h10   #9
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 82
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 82
Points : 27
Points : 27
C'était bien ça merci !
chok371 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h37.


 
 
 
 
Partenaires

Hébergement Web