Voici un petit code que je me suis amusé à mettre en place qui était prévu au départ pour créer dynamiquement des formulaires html, mais qui en fin de compte s'avère être bien plus universel !
la "librairie":
un peu d'explications:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 <script type='text/javascript'> var Flux=new Array(); var isIE =(document.all)?true:false; Array.prototype.ArrayPos=function(quoi){ var Position=-1; for (i=0;this[i];i++){ if (quoi==this[i]){Position=i;} } return Position; } $Close=function(Closing){ var FluxPos=Flux.ArrayPos(Closing) var FluxLength=Flux.length; var SpliceLength=FluxLength-FluxPos+1; var AppendLot=Flux.splice(FluxPos+1,SpliceLength); for(l=0;AppendLot[0];l++){ Closing.appendChild(AppendLot.shift()) } if(Flux.length==1){document.body.appendChild(Flux.pop())} } var $C= function (HasH){ var Elt=''; var Special=false; switch(HasH['type']){ case('radio' ): Elt=(isIE)?'<input name="'+HasH['name']+'">':HasH['obj']; Special=(isIE)?true:false; break; case('checkbox' ): Elt=(isIE)?'<input name="'+HasH['name']+'">':HasH['obj']; Special=(isIE)?true:false; break; case('file' ): Elt=(isIE)?'<input name="'+HasH['name']+'">':HasH['obj']; Special=(isIE)?true:false; break; default: Elt=HasH['obj']; Special=(isIE)?true:false; } if(HasH['obj']=='label'){Elt=(isIE)?'<label for="'+HasH['htmlFor']+'">':HasH['obj']; Special=(isIE)?true:false; } if(HasH['obj']=='select'){Elt=(isIE)?('<select name="'+HasH['name']+'" '+((HasH['multiple']==1)?'multiple ':'')+' >'):HasH['obj']; Special=(isIE)?true:false; } if(HasH['obj']=='form'){Elt=(isIE)?('<form name="'+HasH['name']+' >'):HasH['obj']; Special=(isIE)?true:false; } var Obj=document.createElement(Elt); for (elt in HasH){ if (elt != 'obj'){ if(elt=='css'){ for(Styl in HasH['css']){Obj.style[Styl]=HasH['css'][Styl];} } else{ if(isIE){ if(!Special || (elt!='name' && elt!='for' )){ Obj[elt]=HasH[elt]; } } else{ Obj[elt]=HasH[elt]; } } } } Flux.push(Obj); return Obj; }
ce code permet de créer à la volée des elements DOM et d'ordonnancer leur niveau parent/child simplement, par quelques lignes de code...
- Prérequis:
Un array qui stocke les objets au fur a mesure de leur création et qui sert d'ordonanceur pour les append . (Flux)
J'avais également besoin d'une fonction indexOf mais sur un arrray = > j'ai du créer le prototype d'array ArrayPos.
- La création des Objets:
Elle se fait au moyen de la fonction $C qui prend en paramètre un hash
il faut respecter l'ordre des éléments du hash en mettant en première position la balise souhaitée
la fonction $C créé l'objet puis lui assigne les attributs
Code : Sélectionner tout - Visualiser dans une fenêtre à part {'obj':'baliseHTML', ......}
pour ce qui est du style css, les prorpiétés de styles devront être rédigées sous leur form javascript ex: font-size = > fontSize
ces propriétés seront sous form de "sous Hash"
Attention: les attribut doivent également être libéllés sous leur forme javascript, par exemple pour un label le for s'écrira htmlFor
pour un select multiple on ecrira 'multiple':1
le read-only s'ecrira readOnly
pour les porpriété de style :
css : border-bottom => javascript : borderBottom
css : list-style-type => javascript : listStyleType
Attention: float = > cssFloat pour FFX
cssFloat n'est pas implémenté par IE. C'est styleFloat dans ce cas. (Merci MofC)
NB: On peut utilmiser la propriété cssText du style qui permet de conserver la syntxe css des propriétés de style:
[/code]
Code : Sélectionner tout - Visualiser dans une fenêtre à part "css":{"cssText":"color:red;font-size:10px;list-style-type:square;"}
- Parents/Child :
l'array Flux est incrémenté de l'objet créé.
ainsi on obtient un array d'objets du type:
Flux => (obj1,obj2,obj3 ...)
Pour déterminer le niveau parent / enfant il suffit de "fermer un objet créé auparavant au moyen de la fonction $Close( obj )
fonctionnement de la fonction $Close():
On recupère la position de l'objet dans l'array Flux
Code : Sélectionner tout - Visualiser dans une fenêtre à part $Close(obj3)Flux.ArrayPos(obj3) retourne 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part Flux => (obj1,obj2,obj3,obj4,obj5)
on separe Flux en deux...
AppendLot qui prend au moyen d'un splice tous les objets àprès l'obj3
on obtient donc:
Flux =>(obj1,obj2,obj3)
et
AppendLot=>(obj4,obj5)
il ne reste plus qu'à boucler sur AppendLot pour Appender un à un les obj à obj3 ? avec Flux.pop().appendChild(AppendLot.shift())
qui fait d'une pierre tori coups:
* le shift de AppendLot appende l'element
* et le retire du tableau
* le plop retire le dernier element de Flux
Voilà pour le principe de base:
Un exemple simple pour la création d'un select:
plus complexe le formulaire complet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 var myselect= $C({'obj':'select'}) ; $C({'obj':'option', 'value':'1','innerHTML':'option 1'}) ; $C({'obj':'option', 'value':'2','innerHTML':'option 2'}) ; $Close(myselect);
Prévu à la base pour les formulaires on peut en fait utiliser cette librairie pour toute les balises html !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 function Construct(){ var myform=$C( {"obj":"form","method":"get","action":self.location.href} ); var myFieldSet= $C( {"obj":"fieldset","css":{'border':"solid 2px",'borderColor':'red',"width":"200px",'padding':'10px'} } ); var legend=$C( {"obj":"legend","innerHTML":"Enregistrez vous"} ); $C( {"obj":"div","innerHTML":"LOGIN","css":{'color':"green",'fontFamily':'verdana'} } ); var myinput=$C({"obj":"input","type":"text","name":"montexte",'css':{'color':'red'} } ); $C({'obj':'br'}) ; $C({'obj':'br'}) ; var myselect= $C({'obj':'select'}) ; $C({'obj':'option', 'value':'1','innerHTML':'option 1'}) ; $C({'obj':'option', 'value':'2','innerHTML':'option 2'}) ; $Close(myselect); $Close(myFieldSet); var myDiv= $C( {"obj":"div","css":{'border':"solid 2px",'borderColor':'red',"width":"200px",'padding':'10px','textAlign':'center','marginTop':'2px'} } ); var mysubmit=$C({"obj":"input","type":"submit","value":"go","css":{"width":"100px"} } ); $Close(myDiv) $Close(myform) }
Et juste pour la petite histoire j'ai rèvé ce code ce matin entre 5h00 et 6h00, et hormis la fonction ArrayPos qui dans mon rève devait fonctionner avec indexOf, je n'ai fait que taper le code que j'ai rèvé ...
Je pense que je vais aller me faire soigner
Partager