lol
Et ça a été chaud à trouver. Je suis parti du DOM pour finalement en arriver là. La plupart des exemples que je trouvais ne fonctionnaient pas pour créer du CSS à la volée, et les indications de microsoft eux-mêmes étaient loi d'être valable. ![8O](https://www.developpez.net/forums/images/smilies/icon_eek.gif)
L'astuce consiste à attacher un behavior à un ou des éléments en utilisant les selecteurs DOM.
Un behavior, est une propriété dynamique, un comportement.
La première chose était de pouvoir créer du CSS dynamiquement :
document.createStyleSheet()
Pour ajouter une ou des règle(s):
document.createStyleSheet().addRule(selector,cssProperties);
En suite, à l'aide de l'attribut behavior:, on va pouvoir changer le comportement des éléments résultant du sélecteur (ici '*', c'est à dire tous).
Le comportement est ici d'ajouter de nouvelles propriétés à tous les éléments du DOM : getElementsByNode(Name|Type), en faisant le binding sur le nouveau prototype d'Element (qui, sous IE7, n'est pas un objet reconnu). Ce binding peut se faire via HTC (url) ou via du code (expression).
1 2 3
| <style>
* {behavior: expression(...)}
</style> |
Nouvelle astuce : comment empiler plusieurs instructions ?
A l'aide de "void(...) || void(...)" : Au moins une évaluation doit être vraie. Comme le résultat est tout le temps 'undefined' on est sur que toutes seront évalué. ![:ccool:](https://www.developpez.net/forums/images/smilies/ccool.gif)
* {behavior: expression(void(...)||void(...)...)}
N.B : Un seul behavior par element, le point-virgule sépare les attributs CSS
Il n'y a plus qu'à décorer les éléments en faisant le binding :
void(this.property = function(){return bind.apply(this, arguments)})
Le reste, c'est CSS qui s'en occupe. ![:ccool:](https://www.developpez.net/forums/images/smilies/ccool.gif)
(En théorie, Pour mieux comprendre) :
void(this.width = parseCSSInt(this.height) * 2 + 'px') || void(this.height = this.nexSibling != null ? this.nextSibling.style.height : '20px')
Fait que un élément aura sa largeur 2 fois plus grande que sa hauteur. Sa hauteur étant la même que l'élément suivant de même parent ou de 20pixels par défaut. parseCSSInt serait une fonction qui ferait ce qu'elle semble indiquer. (Pas sur avec le trinaire à cause de ':').
Il y a une gestion de synchronisation à s'assurer avec behavior :
element.onreadystatechange = functionHandle || anonymous;
<SCRIPT FOR = object EVENT = onreadystatechange>
element.readyState == 'uninitialized' || 'loading' || 'loaded' || 'interactive' || 'complete'
C'est ce sur quoi je me penche actuellement.
Partager