Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Porteé de Event et passage de parametres dans une callback

3 réponses
Avatar
Thierry
Bonjour,

Le but est que cette fonction definisse un nouveau handler keypress pour un
element div.

function ShowDlg(dlgID, aCallback) {
document.getElementById(dlgID).style.visibility = "visible";
document.getElementById(dlgID).onkeypress = DlgKeyProc(event,
dlgID,
aCallback);
}

Le probleme est qu'event n'est pas disponible dans cette fonction, et
pas plus dans la fonction DlgKeyProc si je ne passe pas de parametres.

Comment faire ?
L'objet Event n'est pas global ?
J'ai essayé window.event ou document.window.event sans plus de succes...

(la fonction ShowDlg n'est pas appellée en direct mais par d'autres
fonctions, ca serait extrement lourd de passer l'event dans toute la
chaine jusqu'a ShowDlg).


--
Cherche boulot informaticien sur Toulouse, Nantes et Bordeaux de
préférence.
CV par retour de courrier. (gros systèmes s'abstenir)

3 réponses

Avatar
Laurent Vilday
Le but est que cette fonction definisse un nouveau handler keypress pour un
element div.

function ShowDlg(dlgID, aCallback) {
document.getElementById(dlgID).style.visibility = "visible";
document.getElementById(dlgID).onkeypress = DlgKeyProc(event,
dlgID,
aCallback);
}


Il faut attribuer une référence, pas appeler la fonction.

var obj = document.getElementById('mon_tag_HTML');

// ca, c'est pas une référence mais un appel de la fonction
// pourquoi ? parce que les ()
obj.onkeypress = je_suis_pas_une_reference();

// ca, c'est une référence vers la fonction
// pourquoi ? ben y'a pas les ()
obj.onkeypress = je_suis_une_reference;

Dans ce modèle d'événement, lors de l'appel de la référence ( avec un
navigateur réellement DOM compliant va sans dire ), on a plusieurs
choses qui sont mis en ordre :
1) this représente l'objet sur lequel l'event est placé
2) le premier paramètre de la fonction est l'event déclencheur

var b = document.body;
b.onclick = alertes;

function alertes(event)
{
// DOM compliant : [object HTMLBodyElement]
alert(this);
// DOM compliant : [object MouseEvent]
alert(event);
}

Par contre avec IE, l'objet event n'est pas transmis en premier
paramètre. Il faut aller chercher l'objet dans window.event, ce qui donne :

var b = document.body;
b.onclick = alertes;

function alertes(event)
{
event = event? event : window.event;
// DOM compliant : [object HTMLBodyElement]
// IE : [object]
alert(this);
// DOM compliant : [object MouseEvent]
// IE : [object]
alert(event);
}

Le probleme est qu'event n'est pas disponible dans cette fonction, et
pas plus dans la fonction DlgKeyProc si je ne passe pas de parametres.

Comment faire ?


function $(e) { return document.getElementById(e); }
function ShowDlg(dlgID, aCallback)
{
$(dlgID).style.visibility = 'visible';
$(dlgID).onkeypress = function(event)
{
DlgKeyProc(event, dlgID, aCallback};
};
}

Mais attention à *aCallback* et à *dlgID* qui sont alors accessibles en
dehors de leur scope d'application (on a créé une closure ici). Ca ne
représente pas de problème particulier sauf pour IE qui peut alors avoir
ces bien connues fuites de mémoire suivant le type d'objet et ce que tu
en fais.

Le cas typique :

function DlgKeyProc(event, dlgID, aCallback }
{
$(dlgID)._je_provoque_une_fuite_IE = aCallback;
}

--
laurent

Avatar
Laurent Vilday
Comment faire ?


function $(e) { return document.getElementById(e); }
function ShowDlg(dlgID, aCallback)
{
$(dlgID).style.visibility = 'visible';
$(dlgID).onkeypress = function(event)
{
event = event? event : window.event;

DlgKeyProc(event, dlgID, aCallback};
};
}


Désolé pour la ligne oubliée. Je le sais par coeur, j'ai relu et
pourtant j'ai oublié cette ligne indispensable à IE.

--
laurent


Avatar
Thierry
Laurent Vilday wrote in
news:445719d0$0$5057$:

Il faut attribuer une référence, pas appeler la fonction.


Ok, maintenant que tu le dis...

Dans ce modèle d'événement, lors de l'appel de la référence ( avec un
navigateur réellement DOM compliant va sans dire ), on a plusieurs
choses qui sont mis en ordre :
1) this représente l'objet sur lequel l'event est placé


Donc je peux utiliser this.id dans la callback, pas besoin d'utiliser le
param de ShowDlg.

function $(e) { return document.getElementById(e); }
function ShowDlg(dlgID, aCallback)
{
$(dlgID).style.visibility = 'visible';
$(dlgID).onkeypress = function(event)
{
DlgKeyProc(event, dlgID, aCallback};
};
}


Parfait, merci.

--
Cherche boulot informaticien sur Toulouse, Nantes et Bordeaux de
préférence.
CV par retour de courrier. (gros systèmes s'abstenir)