OVH Cloud OVH Cloud

l'event qui tue

3 réponses
Avatar
Etienne SOBOLE
salut

bon j'ai pour habitude de faire un truc genre
<img id='myid' ... onmousedown='fct(this, event);'>

ma fonction etant
function fct(obj, ev)
{

}

jusque la tout va bien, ca me permet d'avoir l'objet event sous ie et
l'objet ev sous firefox

mais a un moment j'affecte dynamiquement null a la methode onmousedown de
myid
getElementById('myid').onmousedown = null;

mais comment je fait apres pour remettre fct(this, event); sur l'evenement
jusque la je faisais
getElementById('myid').onmousedown = function anonymous() {fct(this,
event);};

mais je ne m'etais jamais apercu que cela ne marchait pas du tout sous
firefox.
le ev que je recois n'est pas du tout bon.
ou plus exactement, le event de
getElementById('myid').onmousedown = function anonymous() {fct(this,
event);};
n'existe pas !

alors comment faire
pourquoi ca marche dans le html et pas en javascript !

merci
Etienne

3 réponses

Avatar
ASM

[création ou re-création d'events à la volée]

rechercher sur Google : AddEvent
pour apprendre sans doute beaucoup de choses à ce sujet

Mais ...
on n'en avait pas déjà un peu parlé lors du pb du shift ?
http://groups.google.com/group/fr.comp.lang.javascript/msg/adebec3935d3b70?rnum=1

regarder :
http://developer.mozilla.org/fr/docs/DOM:event
en bas les Méthodes


à tous zzazzards
en supposant qu'on puisse s'éviter de trop nombreues lignes :

jusque la je faisais
getElementById('myid').onmousedown = function anonymous() {
fct(this, event);};


getElementById('myid').onmousedown = function() {fct(this, event);};
ou
getElementById('myid').onmousedown = Function("fct(this, event);");
ou
getElementById('myid').onmousedown = "fct(this, event);";

ou
(bien que ce ne soit pas censé servir à çà) :
getElementById('myid').setAttribute = 'fct(this,event);';
ou
getElementById('myid').onmousedown = new fct(this, event);

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Laurent Vilday

<img id='myid' ... onmousedown='fct(this, event);'>

function fct(obj, ev)

jusque la tout va bien, ca me permet d'avoir l'objet event sous ie et
l'objet ev sous firefox


oui puisque IE propose window.event, donc accessible par event dans le
scope global (tout ce qui est dans window est en réalité le scope
global) et que FX fourni l'objet event au moment du déclenchement du
mousedown.

mais comment je fait apres pour remettre fct(this, event); sur l'evenement
jusque la je faisais
getElementById('myid').onmousedown = function anonymous() {fct(this,
event);};

mais je ne m'etais jamais apercu que cela ne marchait pas du tout sous
firefox.
le ev que je recois n'est pas du tout bon.
pourquoi ca marche dans le html et pas en javascript !


parce ce que en HTML, le navigateur fait un peu le travail pour nous et
aussi parce que le scope accessible n'est pas le même.
Alors que en javascript, quand on définit une fonction, l'objet "event"
est supposé être le paramêtre fournit. (j'en ai absolument aucune idée
pour les vieux netscape 4 évidemment)

Pour IE on devrait faire

getById('myid').onmousedown = function() { fct(this, window.event); };

Et pour FX (et certainement d'autres) on devrait faire

getById('myid').onmousedown = function(event) { fct(this, event); };

Donc pour tout le monde il faut faire ça

getById('myid').onmousedown = function(event)
{
event = event?event:window.event;
fct(this, event);
}

http://www.mokhet.com/tests/traditional_onmousedown.html

Cependant je me demande pourquoi créer une function pour transmettre
l'élément (this) et l'événement (event) <div onclick="fct(this,event)">
quand <div onclick="fct(event)"> aurait suffit, puisque this (le
propriétaire de la function) est accessible et représente bien l'élément
<div> cliqué quand la function fct est appellée (sauf si on utilise le
modèle d'événement microsoft, mais là on est en modèle traditionnel). Et
même si le this n'était pas accessible on doit pouvoir s'en sortir en
allant chercher la cible de l'event (event.srcElement pour FX,
window.event.target pour IE et éventuellement
window.event.target.parentNode pour IE quand le nodetype de la cible est
un node texte).

// nodeType 3 = document.TEXT_NODE
// mais bien sûr IE ne connait pas document.TEXT_NODE
// non testé, c'est pour l'idée seulement
function getTargetElement(evt)
{
return (evt.srcElement)?
evt.srcElement:(evt.target)?
(evt.target.nodeType == 3)?
evt.target.parentNode:evt.target:null;
}

Mais c'est au delà de cette conversation je pense, plein de bonne
literrature sur :
http://www.quirksmode.org/js/events_tradmod.html

--
laurent

Avatar
Etienne SOBOLE
oui puisque IE propose window.event, donc accessible par event dans le
scope global (tout ce qui est dans window est en réalité le scope global)
et que FX fourni l'objet event au moment du déclenchement du mousedown.


ok.

parce ce que en HTML, le navigateur fait un peu le travail pour nous et
aussi parce que le scope accessible n'est pas le même.
Alors que en javascript, quand on définit une fonction, l'objet "event"
est supposé être le paramêtre fournit. (j'en ai absolument aucune idée
pour les vieux netscape 4 évidemment)


Oui j'avoue que je limite mes tests a
IE
FireFox
Safari
et opera

Pour IE on devrait faire
getById('myid').onmousedown = function() { fct(this, window.event); };
Et pour FX (et certainement d'autres) on devrait faire
getById('myid').onmousedown = function(event) { fct(this, event); };


y a pas besoin du anonymous ???
semble que non! pourquoi je n'etais ca moi alors?

Donc pour tout le monde il faut faire ça
getById('myid').onmousedown = function(event)
{
event = event?event:window.event;
fct(this, event);
}


yep ca marche merci

http://www.mokhet.com/tests/traditional_onmousedown.html

Cependant je me demande pourquoi créer une function pour transmettre
l'élément (this) et l'événement (event) <div onclick="fct(this,event)">
quand <div onclick="fct(event)"> aurait suffit, puisque this (le
propriétaire de la function) est accessible et représente bien l'élément
<div> cliqué quand la function fct est appellée (sauf si on utilise le
modèle d'événement microsoft, mais là on est en modèle traditionnel). Et
même si le this n'était pas accessible on doit pouvoir s'en sortir en
allant chercher la cible de l'event (event.srcElement pour FX,
window.event.target pour IE et éventuellement
window.event.target.parentNode pour IE quand le nodetype de la cible est
un node texte).


Bon j'avoue que ta question est legitime !
la raison est historique (va t on dire)

Il m'arrive d'appeler ces fonctions hors du context HTML
par exemple supposons que ma fonction passe en rouge l'obj sur lequel tu
cliques
et que j'ai un bouton pour tout passer en rouge. dans ce cas, j'appelle la
fonction en passant tous les objets obj dans le premier paramètre.

evidement tu vas me dire que

obj.fct(...)
aurait eu me meme comportement.

ben... oui...
mais bon a l'epoque ou j'ai commener a coder mon machin je n'y ai pas pensé,
et apres j'ai décidé de garder les memes methodes de programmation.

l'autre raison, c'est que des fois je test le type de l'objet envoyé. et
parfois c'est plus un objet mais un tableau d'objet.
alors je sais que c'est pas térrible, mais je préfère avoir une fonction qui
eventuellement intègre une boucle plutot que deux fonctions distintes.

bouh que c'est vilain... je sais...

// nodeType 3 = document.TEXT_NODE
// mais bien sûr IE ne connait pas document.TEXT_NODE
// non testé, c'est pour l'idée seulement
function getTargetElement(evt)
{
return (evt.srcElement)?
evt.srcElement:(evt.target)?
(evt.target.nodeType == 3)?
evt.target.parentNode:evt.target:null;
}

Mais c'est au delà de cette conversation je pense, plein de bonne
literrature sur :
http://www.quirksmode.org/js/events_tradmod.html

--
laurent


merci en tout cas.

a bientot
Etienne