1. La méthode measure
Elle permet de récupérer une valeur de propriété css calculée exprimée en pixels et nous la renvoie en nombre, ce qui est bien pratique pour faire des calculs : plus besoin de supprimer px, de tester le isNaN et de faire un parse ; prototype s'occupe de tout
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <div id="superparent" class="parent"> <div id="parent" class="parent"> <div id="unElement" style="border-style:solid;border-color:black;border-width:1px 2px 3px 0;padding:2px 4px 1px 0;margin:0 5px 0 5px;width:100px;height:80px;"> </div> </div> </div> <script type="text/javascript"> // Avant : alert($("unElement").getStyle("border-bottom-width")); // --> 3px // Avec prototype 1.7 alert($("unElement").measure("border-bottom")); // --> 3 </script> |
La méthode measure est sympathique, mais l'utilité de récupérer la largeur de la bordure de gauche est assez limitée... le besoin le plus évident de mesurer ainsi des propriétés à lieu quand on cherche à calculer l'espace occupé par un élément. Mais dans ce cas, on se voit mal écrire :
Code : | Sélectionner tout |
1 2 3 4 | var elem = $("unElement"); var widthTotaleOccupee = elem.measure("margin-left") + elem.measure("border-left") + elem.measure("padding-left") + elem.measure("width") + elem.measure("padding-right") + elem.measure("border-right") + elem.measure("margin-left"); alert(widthTotaleOccupee); |
margin-box-width nous donnera donc marges + bordures + padding + width;
Code : | Sélectionner tout |
1 2 3 4 | var elem = $("unElement"); var widthTotaleOccupee = elem.measure("margin-box-width"); alert(widthTotaleOccupee); |
- border-box-width et border-box-height qui donneront la taille de la boite jusqu'aux bordures (sans les marges donc)
- et vous l'aviez deviné,padding-box-width et padding-box-height la taille de la boite avec le padding(sans les marges, ni les bordures).
Voilà qui va simplifier et rendre plus lisible pas mal de code.
A noter que dans le cas de marges négatives, 0 est renvoyé. On sent bien ici que l'idée est de calculer l'espace occupé par un élément.
Comme tout cela ne suffisait pas, un nouvel objet a fait son apparition pour englober toutes ces notions :
2. Element.Layout.
Plutot que de mesurer à chaque fois, on peut demander le layout d'un élément, puis piocher au fur et à mesure de nos besoins dans ces propriétés:
Code : | Sélectionner tout |
1 2 3 4 | var elem = $("unElement"); var elemLayout = elem.getLayout(); alert(elemLayout.get("margin-box-width")); |
Il existe également une méthode getCSS sur Element.Layout qui permettrai de récupérer le layout en une chaîne css. Je mets au conditionnel car je n'ai pas réussi à la faire fonctionner ... c'est une RC...
3. Gestion des événements
La gestion des événements a été encore simplifiée. Il existe maintenant une classe Event.Handler qui permet de créer des Handlers sur des événements ex:
Code : | Sélectionner tout |
1 2 3 4 5 | var elem = $("unElement"); var handler = elem.on("click", function(e) { alert(element.element().identify() + " a été cliqué"); }) |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | var elem = $("unElement"); var clickObserver = function(e) { alert(e.element().identify() + " a été cliqué"); } elem.observe("click", clickObserver); // .. plein de code trop bien elem.stopObserving("click", clickObserver); |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | var elem = $("unElement"); var clickHandler = elem.on("click", function(e) { alert(e.element().identify() + " a été cliqué"); }); // .. plein de code trop bien clickHandler.stop(); // ... encore plus dément clickHandler.start(); |
Code : | Sélectionner tout |
1 2 3 4 5 | var elem = $("unElement"); var clickHandler = elem.on("click", ".parent", function(e, element) { alert(e.element().identify() + " a été cliqué, " + element.identify() + " est passé en parametre aussi !"); }); |
Code : | Sélectionner tout |
1 2 3 | var handler = new Event.Handler(elem, "click", function() {alert(e.element().identify() + " a été clické")}); handler.start(); |