Envoyé par : jérôme
Date : 30/06/2011 14:50
Salut, essaye simplement avec setAttribute()...
Envoyé par : vic_le_faucheur
Date : 01/07/2011 09:35
merci pour cette alternative qui fonctionne parfaitement.
j'aimerais quand même essayer de faire fonctionner les élément dans la balise "implementation" car aucun ne fonctionne ..., si vous avez des exemples ou des solutions
merci
Envoyé par : mistervince
Date : 01/07/2011 09:41
Attention, les éléments dans le binding ne doivent pas avoir d'attribut id. Sur le principe, on utilise un binding pour créer un nouvel élément et donc pouvoir en ajouter plusieurs sur la même page (ce qui ferait plusieurs éléments avec le même id). Le textbox à l'intérieur du binding n'est pas accessible depuis le document.
Il faut créer des propriétés et des méthodes au niveau du binding, qui seront alors disponibles sur l'élément (par exemple propriété number et méthode generate) qui permettront d'utiliser
document.getElementById('random-box').generate(); //ou document.getElementById('random-box').number = 12; var n = document.getElementById('random-box').number;
au niveau du binding :
<content> <xul:textbox xbl:inherits="value"/> </content> <implementation> <property name="number"> <setter> this.setAttribute("value", val); </setter> <getter> return this.getAttribute("value"); </getter> </property> <method name="generate"> this.number = Math.random(); </method> </implementation>
Quelques remarques :
<binding id="randomizer" extends="chrome://global/content/bindings/textbox.xml#textbox"> ... </binding>
//css randomizer { -moz-binding: url(...); } //xul <randomizer id="r" value="30"/>
Envoyé par : mistervince
Date : 01/07/2011 09:44
et sinon, pour modifier des éléments à l'intérieur du binding, tu dois utiliser les méthodes de parcours du DOM. Dans ton exemple, pour modifier le textbox
<method name="setColor"> this.firstChild.style.color = "red"; </method>
Envoyé par : vic_le_faucheur
Date : 01/07/2011 12:01
bas déjà, un GROS GROS merci pour ta réponse : super claire, super concise, super complète (bravo !)
sinon ça marche toujours pas ... ^^
exemple.xul
<?xml version="1.0" encoding="utf-8" ?> <!-- importation des feuilles de style --> <?xml-stylesheet href="chrome://exemple/skin/exemple.css" type="text/css" ?> <window pack="center" title="exemple" persist="screenX screenY" xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <!-- importation du javascript --> <script src="exemple.js" /> <!-- création des racourcis clavier --> <keyset> <key keycode="VK_ESCAPE" id="closeWindow" oncommand="window.close();" /> </keyset> <random value="25" id="random-box"/> <button label="Générer" oncommand="document.getElementById('random-box').generate();"/> <button label="Voir" oncommand="document.getElementById('random-box').number"/> </window>
exemple.css
@import url("chrome://global/skin/"); /* ========================================== */ /* ================== noms ================== */ /* ========================================== */ random { -moz-binding: url('chrome://exemple/skin/exemple.xml#random'); }
exemple.xml
<?xml version="1.0"?> <bindings xmlns="http://www.mozilla.org/xbl" xmlns:xbl="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <binding id="random"> <content> <xul:textbox xbl:inherits="value"/> </content> <implementation> <property name="number"> <setter> this.setAttribute("value", val); </setter> <getter> return this.getAttribute("value"); </getter> </property> <method name="generate"> this.number = Math.random(); </method> </implementation> </binding> </bindings>
pour la fonction generate ça me met : blablabla is not a function et pour la valeur number ça me met undefined.
merci pour tout !
Envoyé par : mistervince
Date : 01/07/2011 14:15
oups
Une petite erreur de syntaxe dans la définition de la méthode : le code doit être entouré par une balise body.
<method name="generate"> <body> <![CDATA[ this.number = Math.random(); ]]> </body> </method>
De plus, c'est plus prudent d'entourer tous les codes javascript avec
<![CDATA[ ]]>
pour éviter qu'ils soient interprétés au niveau xml, même si là il n'y a pas de problème.
Ca a l'air de marcher maintenant.
Envoyé par : Raphael
Date : 02/07/2011 07:33
Sinon, je ne sais pas si ça répond à tes besoins, mais perso pour éviter de coder dans mes XBL, je colle des attributs à mon binding que j'hérite à l'intérieur.
Genre, mon binding prend :
bindingelement.setAttribute("mavalue","testvalue");
et ensuite dans mon textbox XBL :
xbl:inherits="value=mavalue"
Envoyé par : vic_le_faucheur
Date : 02/07/2011 18:41
merci à tous les deux !
mistervince -> ça ne marche toujours pas (toujours ce même message d'erreur) : aurais tu un exemple complet que je puise le copier pour voir si le problème ne viendrais tout simplement pas de moi ?
Raphael -> je crois que je vais prendre ta solution ^^ (je voudrais juste arriver une fois à faire marcher les implémentations avant)
merci beaucoup !
Envoyé par : mistervince
Date : 04/07/2011 10:07
Il faut bien sûr utiliser au maximum l'héritage des attributs, mais ajouter une propriété permet de les manipuler plus facilement. C'est ce qui est souvent fait dans les bindings de firefox pour les attributs 'courants' (value, disabled, ...), un attribut a une propriété équivalente pour plus de simplicité.
Voilà un exemple avec 2 bindings :
fichier random.xml
<?xml version="1.0" encoding="UTF-8"?> <bindings xmlns="http://www.mozilla.org/xbl" xmlns:xbl="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <binding id="random1" extends="chrome://global/content/bindings/textbox.xml#textbox"> <implementation> <method name="generate"> <body> <![CDATA[ this.value = Math.random(); ]]> </body> </method> </implementation> </binding> <binding id="random2"> <content> <xul:textbox xbl:inherits="value,disabled"/> <xul:button label="générer" oncommand="document.getBindingParent(this).generate()"/> <xul:button label="voir" oncommand="document.getBindingParent(this).showValue()"/> </content> <implementation> <property name="value"> <setter> <![CDATA[ this.setAttribute("value", val); ]]> </setter> <getter> <![CDATA[ return this.getAttribute("value"); ]]> </getter> </property> <constructor> <![CDATA[ this.generate(); ]]> </constructor> <method name="generate"> <body> <![CDATA[ this.value = Math.random(); ]]> </body> </method> <method name="showValue"> <body> <![CDATA[ alert(this.value); ]]> </body> </method> </implementation> </binding> </bindings>
fichier doc.xul
<vbox> <hbox> <textbox id="random1" class="random" value="25"/> <button label="Générer" oncommand="document.getElementById('random1').generate();"/> <button label="Voir" oncommand="alert(document.getElementById('random1').value)"/> </hbox> <random/> </vbox>
et la liaison se fait dans doc.css :
textbox.random { -moz-binding: url(random.xml#random1); } random { -moz-binding: url(random.xml#random2); }
Attention, au niveau des urls, il faut vérifier que l'accès est possible. Si tu ouvres dans ton navigateur l'url du fichier random.xml (celle dans le fichier css), tu dois voir le code source des bindings. C'est peut-être là l'origine de tes problèmes : si firefox ne connait pas l'url du binding, il ne connait évidemment pas la méthode generate.
Par contre, je ne sais pas s'il y a quelque chose de spécial à faire pour utiliser un nouveau binding dans une extension, peut-être au niveau du fichier manifest ou du fichier chrome ?
bon courage
Envoyé par : vic_le_faucheur
Date : 04/07/2011 11:01
alors déjà un grand merci pour avoir pris le temps de faire un exemple aussi complet.
par contre je ne sais pas pourquoi tant que je n'enlève pas cette partie, il me dit qu'il y a une erreur à la fin de la ligne ...
<content> <xul:textbox xbl:inherits="value,disabled"/> <xul:button label="générer" oncommand="document.getBindingParent(this).generate()"/> <xul:button label="voir" oncommand="document.getBindingParent(this).showValue()"/> </content>
et même si je l'enlève, les erreurs restent :
Erreur : document.getElementById("random1").generate is not a function Fichier Source : chrome://exemple/content/exemple.xul Ligne : 1
je relis et relis le tutoriel, normalement il n'y a rien à faire ... (et ça marche pour le contenu mais pas pour les implémentation)
je vais continuer à chercher mais je n'y croit plus beaucoup ...
Envoyé par : mistervince
Date : 04/07/2011 11:50
Tu dois avoir 3 fichiers
/*les règles de base des éléments */ @import url(chrome://global/skin/); /*le lien vers les nouveaus bindings*/ textbox.random { -moz-binding: url(chrome://exemple/content/random.xml#random1); } random { -moz-binding: url(chrome://exemple/content/random.xml#random2); }
Et le seul fichier que tu dois afficher, c'est exemple.xul.
Si ça ne marche pas comme ça, essaye d'ouvrir dans firefox les urls chrome://exemple/content/exemple.css et chrome://exemple/content/random.xml pour vérifier que les fichiers sont accessibles.
Envoyé par : vic_le_faucheur
Date : 04/07/2011 11:57
c'est exactement ce que j'ai =(
en fait ça se comporte comme si ce qu'il y avais entre les balises implementation n'était pas lues ...
Envoyé par : mistervince
Date : 04/07/2011 12:04
Je suis désolé, je n'ai plus d'idée pour l'instant ). Je n'ai jamais eu de problème comme ça avant.
Vincent.
Envoyé par : vic_le_faucheur
Date : 04/07/2011 12:18
tu n'as pas à être désolé ^^
tu as passé déjà beaucoup de temps à m'aider : c'est moi qui suis désolé de ne pas y être arriver malgré tes conseils.
juste une dernière piste que j'explore : quand j'ouvre exemple.xul : mon contenu s'affiche correctement. Mais quand j'ouvre exemple.xml, il m'indique qu'il y a une erreur.
-> ça pourrait venir de là que le reste n'est pas pris en compte.
je te tiendrais au courant si j'arrive à faire marcher.
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.