Voila je fais un planning et je voudrais pouvoir fusionner les cellules du tableau lorsque je sélectionne les cellules.
Voila mon exemple et j'aimerai que lorsque je sélectionnne avec une couleur les cellules je veux que ca devienne un seul bloc
Version imprimable
Voila je fais un planning et je voudrais pouvoir fusionner les cellules du tableau lorsque je sélectionne les cellules.
Voila mon exemple et j'aimerai que lorsque je sélectionnne avec une couleur les cellules je veux que ca devienne un seul bloc
si c'est sur une seul ligne il faut modifier le colspan de l'une des cellules, concanténer le contenu des cellules selectionnées puis supprimer les tds devenus inutiles ...
si ça s'étend sur plusieurs lignes ... heu ça devient un peu plus complexe , il faudra alors faire la même chose sue le colspan
comment on fait avec du javscript pour modifier les collspan
j'ai pas testé mais peut être auras tu besoin de passer par un setAttribute ou le style ...Code:document.getElementsByTagName('table')[0].getElementsByTagnName('td')[2].colspan=3
non marche pas.
En fait si tu as regardé mon exemple je veux que quand je sélectionne plusieurs cellules au lieu que ca fait plen de carré de la meme couleur je veux que ca devienne un bloc de la meme couleur
S majuscule ... :oops:Code:colSpan
un exemple juste avec le onclick sur la première cellule et sasn concaténation de contenu ...
Code:
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 <script type='text/javascript'> function mergeCells(cellule){ var NextTD cellule.colSpan="2"; NextTD=cellule.nextSibling; while(cellule.nextSibling.tagName!='TD'){NextTD=cellule.nextSibling.nextSibling;} cellule.parentNode.removeChild(NextTD) } </script> </head> <body> <table border="1" width="100%"> <tr> <td onclick="mergeCells(this)"> </td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> </tr> <tr> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> </tr> </table>
ton exemple ne marche pas. Il y a un probleme avec ton script.
je rectifie le script marche pas sur firefox mais fonctionne sur ie. Mais il faut que cela fontionne sur ie et sur firefox. Si tu sait comment faut faire pour firefox
ha oui firefox ...
Code:while(cellule.nextSibling.tagName.toLowerCase()!='td'){NextTD=cellule.nextSibling.nextSibling;}
merci je vais essayer de l'adapter pour mon planning.
Je pense que j'aurai un probleme pour faire l'effet inverse.
splitter des cellules ?
c'est faisable mais faudra vérifier le nombre de td sur la ligne
Il y a un probleme sur firefox. en fait la cellule s'étire bien mzis ne supprime pas les autres
arf nextSibling... bon je vais émuler ça...
en fait ce n'est pas que sur firefox. Dès que les colSpan est supérieur à deux il fait pas attention aux cellules qui son selectionnné au milieux.
arf ben faut compter le nombre de tds ..
Comment veux tu que je fasse?
Voila la fonction que j'ai faite. Sachant que le nombre de td est passé
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function mergeCells(cellule,nb){ for(i=0;i<=nb;i++){ var NextTD cellule.colSpan=nb; NextTD=cellule.nextSibling; if(navigator.userAgent.indexOf("Firefox") != -1) { while(cellule.nextSibling.tagName.toLowerCase()!='td'){ NextTD=cellule.nextSibling.nextSibling; } } else { while(cellule.nextSibling.tagName!='TD'){ NextTD=cellule.nextSibling.nextSibling; } } cellule.parentNode.removeChild(NextTD); } }
Cette fonction marche mais j'aimerais que quand je choisi rien Je puisse reconstruire les morceaux supprimer
?? tu as fusionné les contenus ?
tu veux dire revenir à la configiration initiale en scindant les cellules ?
heu pour ne pas être ennuyé pas les interprétation divergentes de Nodes entre FFx et IE, je te conseille d'appliquer un nodeCleaner ...
une recherche sur le forum t'apportera toute la lumière sur le nodeCLeaner
ok je regarde
Je sais que je suis pénible mais pourrez tu m'indiquer où je pourrais trouver ce fameux nodeCleaner
ce qui simplifie le code comme ceci:
Code:
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
74
75 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>Nouvelle page 1</title> <script type='text/javascript'> function clean(n){ for(i=0;i<n.length;i++){ var t=[n[i].previousSibling,n[i].nextSibling]; for(j=0;j!=2;j++){ if(t[j] && t[j].nodeType==3){ if(!/\S/.test(t[j].data)){ n[i].parentNode.removeChild(t[j]) } } } } } window.onload=function(){ clean(document.getElementsByTagName('*')) } function mergeCells(cellule){ var NextTD; var ThisTD; var ThisTR=cellule.parentNode; var here; var TRChilds=ThisTR.getElementsByTagName('*'); cellule.colSpan="2"; for (i=0;i<TRChilds.length;i++){if(ThisTR.childNodes[i]==cellule){here=i;}} here=here+1; while(TRChilds[here].tagName.toLowerCase()!='td'){here++;} TRChilds[here-1].innerHTML+=" "+TRChilds[here].innerHTML ThisTR.removeChild(TRChilds[here]); } </script> </head> <body> <table border="1" width="100%"> <tr> <td onclick="mergeCells(this)">1</td> <td width="20%">2</td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> </tr> <tr> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> <td width="20%"> </td> </tr> </table> </body> </html>
en fait ce que je veux c'est quand je choisi rien et que je clique sur un bloc de couleur, les cases ce remettent comme à l'origine sauf les autres
le problème, à part le fait que je n'ai rien compris à ce que tu voulais faire ..., c'est qu'il faudrait avoir sauvegardé quelquepart la structure initiale nombre de td par ligne et contenu initial ...
en plus si tu colorises deux cellules déja fusionnées, il faura additionner les colspan ...
le problème reste toujours de garder une trace de l'historique de fusion ...
je suis en train de voir comment je vais faire. Je te tiens au courant.
Si tu as des idées dit le moi.
souhaites tu autoriser plusieurs niveaux de regroupements ?
genre
refusionner un groupe de cellulesavec un autre groupe ?
Oui je veux faire ca
alors là ça s'avére complexe ...
car si j'ai bien compris ce n'est pas une simple annulation que tu veux faire, mais pouvoir rendre à n'importe quel moment un retour à la situation précédente d'un td ...
en plu ssi tu as plusieurs regourpements différents sur une même ligne ...
je verrais bien un système d'array histroique ...
genre un array par tr avec une codification des regroupements ...
mais dasn la pratique je ne vois pas encore trop bien la codification qui permettrait de retourver les regourpements faits sur un div ...
Vi ca va etre chaud mais bon j'ai pas le choix je dois le faire
En y repensant...
Si tu stockes au niveau de l'id du td les fusions
en concaténant
au départ tu aurais
tu fusionnes les deux premiers:Citation:
id='11' id='12' id='13'
tu fusionnes les deux cellules restantes:Code:id='(11_12)' id='13'
ensuite un peu de parsing sur les id et tu as ton historique ...Code:id='((11_12)-13)'
Ce que tu me dit est une bonne idée mais je ne peu pas faire ainsi car toute mes fonction sont faite sur les id
alors attribues un attrubut perso supplémentaire ...
Code:document.getElementById('montd').regroup="((id1+id2)+id3)
je ne vois pas comment tu veux que je fasse
ben ce que tu aurais fait avec l'id .. fais le avec regroup ...
essaye d'attribues le regroup puis de faire un alert(this.regroup)
C'est quoi faire un regroup?
Un petit exemple
tu piges le principe, en fait tu ajoutes juste un attribut au td afin d'y stocker la chaine qui sera représentative de tes regourpements ...Code:
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 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>Nouvelle page 1</title> <script type='text/javascript'> function populate(){ var TDS=document.getElementsByTagName('table')[0].getElementsByTagName('td'); for (i=0;i<TDS.length;i++){ TDS[i].regroup = "moi je suis le td numéro " + i TDS[i].onclick=function(){alert(this.regroup)} } } </script> </head> <body onload="populate()"> <table> <tr> <td> one </td> <td> two </td> </tr> </table> </body> </html>
C'est bon je suis arriver a faire ce que je voulé
mais il y a un prob avec ie qui me créer bien les cellules mais supprime les bordureCode:
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 function recreateCellsother(){ var cellule=Cellcourante; var nb=cellule.colSpan; cellule.colSpan=1; cellule.style.backgroundColor="#FFFFFF"; cellule.style.color="1px" var j=parseInt(idcourant)+1; var rep=1; if (cellule.nextSibling=='undefined'){ rep=0; } if(rep==0){//alors la cellule est en fin de ligne for(i=2;i<=nb;i++){ element = document.createElement("td"); element.setAttribute("colSpan",1); element.setAttribute("id",j); currenttext = document.createTextNode(""); element.appendChild(currenttext); cellule.parentNode.appendChild(element); cellule=element; j=j+1; } } else { celluleproch=cellule.nextSibling; for(i=2;i<=nb;i++){ element = document.createElement("td"); element.setAttribute("colSpan",1); element.setAttribute("id",j); element.setAttribute("border","1px"); currenttext = document.createTextNode(""); element.appendChild(currenttext) addEvent(element, 'mousedown', sel_mousedown, false); addEvent(element, 'mouseup', sel_mouseup, false); addEvent(element, 'dblclick', sel_dblclick,false); cellule.parentNode.insertBefore(element,celluleproch); j=j+1; } } }
Code:element.style.border="solid 1px black";