Manca del codice per capire bene; quella roba va dentro un ciclo???
codice:
posizione.appendChild(riga)
Cos'è esattamente "posizione"? Presumo si tratti delle righe già esistenti, cioè quelle relative al ruolo.
In tal caso non puoi inserire un <tr> direttamente dentro un altro <tr>. Considera che ogni tabella deve rispettare una struttura ben precisa che di base è <table><tr><td>...</td></tr></table>.
Ad occhio ti direi che puoi risolvere applicando opportunamente l'attributo rowspan ai <td> laterali. Il valore di rowspan dovrà essere relativo al numero di righe che compongono i dati da inserire. A quel punto potrai creare le nuove righe a seguire con i relativi dati (vedi mio esempio sotto).
In alternativa si potrebbero creare delle mini tabelle che dovranno essere inserite una per ogni cella in cui andranno i nuovi dati, ma la cosa rischia di diventare farraginosa in questo caso.
Altri errori di validazione:
codice:
<thead>
<colgroup span="4" width="400px" background-colour="orange"></colgroup>
...
</thead>
L'elemento <colgroup> deve essere un figlio diretto di <table>; non va posto dentro <thead>; eventualmente va messo prima.
Personalmente farei a meno di usare tale elemento per formattare la tabella; ti consigli invece di fare uso dei CSS, magari definendo delle regole da includere nel documento (dentro <head>) e non in-linea nei tag della tabella.
L'attributo background-colour non si può sentire; a parte l'errore ortografico (la u in più in colour) non esiste comunque un attributo HTML background-color (che tuttalpiù è una proprietà CSS), magari sarebbe possibile usare l'attributo bgcolor ma non è comunque consentito per questo elemento. Anche qui, sempre meglio usare il CSS, come poi hai fatto nei <tr> sotto, ma meglio includere lo stile nel documento ed evitare di sporcare i contenuti con style in-linea.
Ancora, l'uso dell'attributo width per il colgroup non è supportato in HTML5; usare il CSS.
Analogamente la proprietà width, anche se applicata col CSS, non puoi definirla per le singole celle in questo modo:
codice:
<th style="border:solid;width:200px">
infatti le celle, le relative righe e colonne, nonché l'intera tabella, normalmente si dimensionano in automatico in base ai loro contenuti. Certo, è possibile impostare comunque delle dimensioni, magari all'intera tabella o anche alle colonne, ma non come hai fatto tu. In alcuni casi è necessario applicare alla tabella la regola table-layout:fixed attraverso il CSS.
Qui qualche pasticcio:
codice:
<th style="border:solid;width:200px">Squadra</td>
nelle varie righe simili a questa, hai aperto un <th> ma poi hai usato </td> per la chiusura. Chiaramente va corretto; o utilizzi <th>...</th> o utilizzi <td>...</td>.
Infine, di norma per tutte le righe di una tabella è necessario definire uno stesso numero di colonne, altrimenti avresti un codice non valido, come nel tuo caso. E' vero che i dati li stai inserendo dinamicamente, ma sarebbe comunque opportuno avere una struttura iniziale che sia valida.
Per verificare la validità del codice ti consiglio l'uso di un validatore (ad esempio questo).
Un ultimo consiglio: non capisco l'uso di quegli id che hai applicato ai vari elementi della tabella. Partendo dal fatto che un id deve essere univoco, in vista di avere magari diverse istanze di quella stessa tabella (in cui magari cambiano giusto i contenuti ma non la struttura base) sarebbe meglio usare delle classi se ti serve ad esempio fare riferimento, via script, ai vari elementi all'interno di una tabella; magari usare l'id solo nel tag principale <table> se ti serve distinguerlo da altre possibili istanze dello stesso tipo di tabella. Sono giusto dei consiglio.
Qui quella che potrebbe essere la tabella di base:
codice:
<!DOCTYPE HTML>
<html lang="it">
<head>
<title>Esempio</title>
<meta charset="utf-8">
<style>
.tabella-ruoli {
table-layout: fixed;
border-collapse: collapse;
width: 800px;
font: 14px sans-serif;
}
.tabella-ruoli .tabella-ruoli_nome {
font-style: italic;
}
.tabella-ruoli,
.tabella-ruoli th,
.tabella-ruoli td {
border: 1px solid Gray;
padding: 3px;
}
.tabella-ruoli > thead > tr:nth-child(1){
background-color: Orange;
}
.tabella-ruoli > thead > tr:nth-child(2){
background-color: Yellow;
}
.tabella-ruoli > tbody th{
background-color: WhiteSmoke;
}
.tabella-ruoli td:nth-child(2),
.tabella-ruoli td:nth-child(3){
text-transform: uppercase;
}
</style>
</head>
<body>
<table id="squadre" class="tabella-ruoli">
<thead>
<tr>
<th>Squadra</th>
<th class="tabella-ruoli_nome" colspan="3"></th>
</tr >
<tr>
<th>Ruolo</th>
<th>Nome</th>
<th>Squadra</th>
<th>Quotazione</th>
</tr>
</thead>
<tbody>
<tr class="tabella-ruoli_portieri"> <th>Portieri</th> <td colspan="3"></td></tr>
<tr class="tabella-ruoli_difensori"> <th>Difensori</th> <td colspan="3"></td></tr>
<tr class="tabella-ruoli_centrocampisti"><th>Centrocampisti</th><td colspan="3"></td></tr>
<tr class="tabella-ruoli_attaccanti"> <th>Attaccanti</th> <td colspan="3"></td></tr>
</tbody>
</table>
</body>
</html>
Chiaramente il problema in oggetto è ancora irrisolto perché ora bisogna capire come popolare la tabella; senza vedere il resto del tuo script non riesco a capire qual è la struttura dei dati in arrivo e quali criteri stai usando per trattarli e appiccicarli alla tabella; se puoi dare qualche altra indicazione posso provare ad abbozzare qualche riga di JavaScript.