2013-04-01 3 views
42

Sto utilizzando datatables per visualizzare i dati lato server nelle tabelle.Assegnazione di classi personalizzate a ciascun TD per lo stile - Datatables & jQuery

Tuttavia, non è possibile selezionare e assegnare uno stile alle singole celle (<TD>). Cerco un po 'e l'ho trovato potrebbe essere possibile con:

"fnRowCallback": function(nRow, aData, iDisplayIndex) { 
    .... 
} 

... ma io non sono del tutto sicuro di come, perché ho un tavolo pochi e non tutti hanno lo stesso numero di colonne e righe. Voglio dare una classe comune a tutti TDs di una 'colonna'.

+0

Si dovrebbe essere in grado di indirizzare ogni prima cella di ogni riga, ogni terza cellula di ogni riga, per indirizzare le colonne. Vedi le pseudo classi CSS: https://developer.mozilla.org/en-US/docs/CSS/:nth-child – KKetch

+1

Uso di jQuery, giusto, ma come? – 3zzy

risposta

41

È possibile utilizzare il parametro sClass in Definizione colonne. Ad esempio, se si dispone di 3 colonne e vuole passare classe personalizzata per la seconda e terza colonna, è possibile:

"aoColumns": [ 
    null, 
    { "sWidth": "95px", "sClass": "datatables_action" }, 
    { "sWidth": "45px", "sClass": "datatables_action" } 
] 

È possibile controllare datatables documentation

+0

ha funzionato per me. Thanksss !! –

12

Per coloro che pensano che questa domanda durante la ricerca di fnRowCallback e vogliono aggiungere lo styling in base al contenuto delle cellule piuttosto che utilizzare classi CSS statici, utilizzando il fnRowCallback farà il trucco:

oTable = $('#matrix').dataTable({ 
    ... 
    "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
    for (var i in aData) { 

     // Check if a cell contains data in the following format: 
     // '[state] content' 
     if (aData[i].substring(0,1)=='[') { 

     // remove the state part from the content and use the given state as CSS class 
     var stateName= aData[i].substring(1,aData[i].indexOf(']')); 
     var content= aData[i].substring(aData[i].indexOf(']')+1); 
     $('td:eq('+i+')', nRow).html(content).addClass(stateName); 
     } 
    } 
    } 
}); 

Spero che questo può essere utile per un futuro visitatore :-)

+0

Funziona solo su righe pari, perché ignora altre righe –

+0

Potresti pubblicare un esempio qui: http://jsfiddle.net/? Non vedo perché questo cambierebbe ogni seconda fila. Tutto lo script è: nel caso in cui una condizione sia soddisfatta (all'interno dell'istruzione 'if'), la riga corrente e il numero di cella vengono utilizzati per recuperare un'istanza JQuery della cella e per modificare il contenuto e la classe della cella. Il tuo problema potrebbe essere dovuto al fatto che il tuo codice CSS avesse 'tr: even td' o' tr: odd td' sovrascrivendo lo stile? – SaschaM78

+0

questo è un ottimo soln. Tuttavia, vorrei aggiungere il nome della classe alla riga selezionata e non solo una cella all'interno di quella riga. Puoi aiutarmi con quello ... grazie. – dkjain

10

È possibile utilizzare columnDefs per definire le classi per ogni colonna.

Esempio in CoffeeScript:

$('table').dataTable(
    columnDefs: [ 
    { 
     targets: -1 # targets last column, use 0 for first column 
     className: 'last-column' 
    } 
    ] 
); 

Questo è usare nuovo 1.10+ API.

5

Se si vuole indirizzare la riga o una singola cella in un callback:

var table = $('#order-history-table').DataTable(
    { 
     "ajax": url, 
     "pageLength": 20, 
     "createdRow": function(row, data, dataIndex) { 

      // Add a class to the cell in the second column 
      $(row).children(':nth-child(2)').addClass('text-justify'); 

      // Add a class to the row 
      $(row).addClass('important'); 
     } 
    } 
); 

non ero in grado di ottenere il parametro 'createdCells' di lavorare in modo doveva farlo attraverso la fila.

1

Ecco come farlo utilizzando createdCell, utilizzando DataTables 1.10+ syntax. Il vantaggio di questo approccio è che puoi condizionare le celle in modo condizionale.

"columnDefs": [ 
{ 
     "targets": [16], 
     "createdCell": function(td, cellData, rowData, row, col) { 
      switch(cellData) { 
      case "Pending": 
       $(td).addClass('pending'); 
       break; 
      case "Rejected": 
       $(td).addClass('rejected'); 
       break; 
      case "Approved": 
       $(td).addClass('approved'); 
       break; 
      case "SAP": 
       $(td).addClass('sap'); 
       break; 
      case "Reconciled": 
       $(td).addClass('reconciled'); 
       break; 
      } 
     } 
    } 
], 
0
var table = $('#order-history-table').DataTable(
    { 
     "ajax": url, 
     "pageLength": 20, 
     "createdRow": function(row, data, dataIndex) { 
      // Add a class to the cell in the second column 
      $(row).children(':nth-child(2)').addClass('text-justify'); 
      // Add a class to the row 
      $(row).addClass('important'); 
     } 
    } 
); 
+0

Dovresti aggiungere anche qualche descrizione. –

Problemi correlati