Envoyé par : cokinou
Date : 24/01/2007 14:04
Bonjour
Je suis entrain de travailler sur un objet XBL qui contient des SVG.
J'aimerai appelé les méthode de mon objet XBL mais il m'indique que ma fonction n'est pas défini....
En clair, j'ai un XBL :
<?xml version="1.0"?> <bindings xmlns="http://www.mozilla.org/xbl" xmlns:xbl="http://www.mozilla.org/xbl" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <binding id="test"> <content> <xul:hbox> <svg:svg width="16" height="16" onclick="test();"> <svg:rect x="1" y="1" width="14" height="14" fill="red"/> </svg:svg> <xul:button oncommand="test()" label="Test"/> </xul:hbox> </content> <implementation> <method name="test"> <body> <![CDATA[ alert('test'); ]]> </body> </method> </implementation> </binding> </bindings>
Mais je n'arrive pas a avoir la même chose entre le click sur mon svg et le click sur le bouton.... Sur le bouton ca marche, sur le svg ca me met "test is not defined".
Si vous avez des idées, n'hésitez pas ;-)
Envoyé par : Paul Rouget
Date : 24/01/2007 23:11
Dans le domaine du possible, je te conseille d'utiliser la balise <handlers>, mais sinon, pour ton problème, c'est étrange que ça bug, mais en général, on utilise plutôt le addEventListener dans le constructeur, je trouve que dans le cas d'un XBL, c'est bien plus propre.
Envoyé par : hhf
Date : 25/01/2007 02:18
a vu de nez dans ton cas dans l'attribut oncommand tu doit mettre :
parentNode.parentNode.test();
soit
<xul:button oncommand="parentNode.parentNode.test();" label="Test"/>
ou au pire : this.parentNode.parentNode.test();
idem pour le onclick du SVG
<svg:svg width="16" height="16" onclick="parentNode.parentNode.test();">
Envoyé par : cokinou
Date : 25/01/2007 09:49
Paul Rouget a écrit:
Dans le domaine du possible, je te conseille
d'utiliser la balise <handlers>, mais sinon, pour
ton problème, c'est étrange que ça bug, mais en
général, on utilise plutôt le addEventListener
dans le constructeur, je trouve que dans le cas
d'un XBL, c'est bien plus propre.
Le code était juste un exemple pour tester, mais dans mon "vrai" code j'utilise des handlers.... Mais le problème avec des handlers c'est que l'élément sur lequel se passe l'événement est l'élément SVG que je pointe (exemple une ligne de mon svg) et non le svg total.... or mon svg est nettement plus complexe que juste un rectangle rouge et j'en ai plusieurs sur ma page donc impossible de savoir le quel a produit l'événement (le DOM ne fonctionnant pas dans SVG apparement).
Par contre, ta solution avec le addEventListener est nickel, je n'y avais pas pensé mais elle fonctionne exactement comme ce que je veux. Je vais le tester sur mon code final mais apparemment c'est exactement ce que je cherche.
hhf a écrit:
a vu de nez dans ton cas dans l'attribut oncommand
tu doit mettre :
parentNode.parentNode.test();
soit
<xul:button
oncommand="parentNode.parentNode.test();"
label="Test"/>
ou au pire : this.parentNode.parentNode.test();
idem pour le onclick du SVG
<svg:svg width="16" height="16"
onclick="parentNode.parentNode.test();">
Cela marche très bien pour le bouton, mais le problème c'est qu'apparemment le DOM ne fonctionne pas dans le SVG.... donc parentNode est tout le temps vide... impossible de remonter sur l'élément parent du svg (de même impossible de descendre dans le svg). C'est très dommage :-( mais vu que le addEventListener proposé par Paul Rouget foncionne nickel, je vais me servir de ca
Merci encore à vous deux ;-)
Envoyé par : Paul Rouget
Date : 25/01/2007 10:01
Le DOM fonctionne avec le SVG.
Envoyé par : cokinou
Date : 25/01/2007 10:18
Paul Rouget a écrit:
Le DOM fonctionne avec le SVG.
Si le DOM fonctionne, comme cela se fait que je ne peux pas accéder aux noeuds de mons svg (parentNode et childNodes me renvoi toutjours null) ?
Sinon, pour le addEventListener j'ai un petit souci, si jamais dans ma fonction appelé lors du click j'ai besoin de this, ce this est l'élément qui a appelé le listener... Comment puis-je retrouver mon élément global (mon <binding id="test">) ? J'ai essayé le document.getElementById('test') mais ca marche pas :-(
Envoyé par : papy
Date : 25/01/2007 10:47
Dans un binding, il y a une branche supplémentaires dans le DOM. Elle contient tout les fils cachés (ceux qui sont dans le binding) du noeud. Tu peux y accéder ainsi :
childs = document.getAnonymousNodes(node);
Pour ton deuxième problème, il existe une méthode qui renvoi le noeud qui correspond au binding à partir d'un de ses fils :
rootNode = document.getBindingParent(node);
Envoyé par : cokinou
Date : 25/01/2007 10:56
papy a écrit:
Dans un binding, il y a une branche
supplémentaires dans le DOM. Elle contient tout
les fils cachés (ceux qui sont dans le binding) du
noeud. Tu peux y accéder ainsi :
childs = document.getAnonymousNodes(node);
Pour ton deuxième problème, il existe une méthode
qui renvoi le noeud qui correspond au binding à
partir d'un de ses fils :
rootNode = document.getBindingParent(node);
Bon, ben avec tout ca si j'y arrive pas.... c'est que vraiment....
En tout cas merci pour ces deux fonctions, elles vont me permettre de diminuer un peu mon code.... et de pourvoir enfin appelé ma fonction à partir de mon svg :-D
Merci beaucoup
Envoyé par : Paul Rouget
Date : 25/01/2007 11:34
Tu peux aussi faire ça:
var self = this; function foobar(event) { self. ...; } monElt.addEventListener("click", foobar, ...);
Envoyé par : cokinou
Date : 25/01/2007 12:26
Paul Rouget a écrit:
Tu peux aussi faire ça:
var self = this;
function foobar(event) {
self. ...;
}
monElt.addEventListener("click", foobar, ...);
J'ai testé ca, mais vu que j'ai plusieurs élément, le self s'auto-écrasait, et ma fonction ne s'appliquait pas sur le bon élément... Mais avec le document.getBindingParent(node); ca marche nickel.
Encore merci
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.