11548 sujets

JavaScript, DOM et API Web HTML5

salut à tous,
ça fait pas mal de temps que je joue avec les gestionnaires d'évenements JS, et je bute sur un problème épineux...
voilà, si j'écris dans une fonction : (je simplifie volontairement...)
var toto = document.createElement("div");
toto.id = "id1";
toto.onmousemove = function(){ mafonction(event,this.id); };
document.body.appendChild(toto);

ça marche dans tous les navigateurs, mais pas dans firefox qui m'affche "event is not defined".

vous noterez que j'ai absolument besoin de passer plusieurs arguments à la fonction "mafonction" (pas seulement event et this.id d'ailleurs...). je ne peux donc pas écrire :
toto.onmousemove = mafonction;


le seul truc qui marche dans firefox est d'écrire par exemple :
toto.setAttribute("onmousemove","mafonction(event,this.id)");

ce qui fonctionne dans firefox et safari, mais peut être pas ailleurs ? et de toute façon ça revient à l'écrire en dur dans le code de la page... pas terrible.

donc la question est : existe-t-il un moyen de passer l'objet event en argument à firefox en DOM 0 ?

Petite précision : le vrai code est netement plus complexe, j'ai notamment besoin de préfixer l'appel à la fontion "monautrefonction" avec un nom d'objet, puisqu'elle est une méthode d'un objet. je l'appelle comme ceci, en tant que méthode de l'objet "monobjet" : monobjet.monautrefonction(...), et plus précisément pluisqu'il y a un passage de variable en argument dans la fonction "mafonction", comme ceci :
window\[identifiant\].monautrefonction(...);
ou "identifiant" n'est autre que l'argument 2 transmis pas la fonction "mafonction".
(j'ai échappé les brackets, le forum n'aime pas ça...)
je sais c'est pas très clair...

que pensez vous de tout ça ? Smiley cligne
Modifié par pecos (13 Mar 2009 - 15:15)
Salut,

Firefox respecte la norme et met à disposition "event" en tant qu'argument de la fonction représentant le gestionnaire d'événement et non en tant que variable globale :
var toto = document.createElement("div");
toto.id = "id1";
toto.onmousemove = function(e) { mafonction(e || window.event, this.id); };
document.body.appendChild(toto);

Modifié par Julien Royer (13 Mar 2009 - 14:11)
bon alors, julien, je te remercie énormément pour la solution que tu m'a donnée, et QUI MARCHE !!! Smiley smile Smiley smile
Le fait est que je ne connaissais pas cette façon de passer l'event à ma fonction, je viens de tester dans firefox et safari, aucun souci dans les deux. j'imagine aussi que ça doit marcher dans IE puisqu'il gère l'event de la même manière que SAFARI.

C'est quand même bien domage que la doc sur mozilla dev center soit aussi succincte et ne parle pas de cette syntaxe, parce que ça m'aurait bien aidé depuis des lustres !!! Smiley confused

juste pour info, voici le code qui fonctionne, si ça t'intérresse, c'est juste un petit proof of concept que j'ai écrit pour essayer de voir où ça merdait, maintenant que ça marche je peux m'attaquer au vrai projet, qui est nettement plus costaud... Smiley cligne
(tu remarqueras effectivement que j'ai encapsulé les fonctions dans la fonction principale, ce qui explique la relative complexité et l'usage de "window[]" à tous les étages...

function slide(nom){
		var cont = document.createElement("div");
		cont.className = "dive";
		cont.id = nom;
		this.MOV = 0;
		this.T = 90;
		this.calcul = function(a){ this.T = 2*a; }
		this.bouge = function(evt,ident){
			if(window\[ident\].MOV == 1){
			if(window.event) { var menux = window.event.offsetX;}
			else { var menux = evt.layerX;}
			document.getElementById("t"+ident).value = menux;
			window\[ident\].calcul(menux);}
			}
		cont.onmousedown = function(){ window\[this.id\].MOV = 1; }
		cont.onmouseup = function(){ window\[this.id\].MOV = 0; }
		cont.onmousemove = function(e){ window[this.id].bouge(e || window.event,this.id); } // c'est ici que ça posait problème, maintenant ça marche !!!
		document.getElementById("t1").appendChild(cont);
		}


(j'ai encore échappé tous les brackets... dommage que ça ne passe pas avec le forum ! )
Modifié par pecos (13 Mar 2009 - 14:55)