When using server-side processing, rather than passing this
into the inline()
method (where this
is the td
cell) we need to translate the
cell node into an index using cell().index()
.
The reason for this is that when server-side processing is enabled, each redraw will refresh the table, resulting in the original cell no longer being in the
document (it has been discarded and replaced). Using the cell index allows the reference to the correct cell to be maintained over the redraw.
This example shows that in practice.
First name | Last name | Position | Office | Start date | Salary |
---|
The Javascript shown below is used to initialise the table shown in this example:
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 | var editor; // use a global for the submit and return data rendering in the examples $(document).ready( function () { editor = new $.fn.dataTable.Editor( { ajax: "../../controllers/staff.php" , table: "#example" , fields: [ { label: "First name:" , name: "first_name" }, { label: "Last name:" , name: "last_name" }, { label: "Position:" , name: "position" }, { label: "Office:" , name: "office" }, { label: "Extension:" , name: "extn" }, { label: "Start date:" , name: "start_date" , type: "datetime" }, { label: "Salary:" , name: "salary" } ] } ); // Activate an inline edit on click of a table cell $( '#example' ).on( 'click' , 'tbody td:not(:first-child)' , function (e) { editor.inline( table.cell( this ).index(), { onBlur: 'submit' } ); } ); var table = $( '#example' ).DataTable( { dom: 'Bfrtip' , ajax: { url: '../../controllers/staff.php' , type: 'POST' }, serverSide: true , order: [[ 1, 'asc' ]], columns: [ { data: null , defaultContent: '' , className: 'select-checkbox' , orderable: false , searchable: false }, { data: "first_name" }, { data: "last_name" }, { data: "position" }, { data: "office" }, { data: "start_date" }, { data: "salary" , render: $.fn.dataTable.render.number( ',' , '.' , 0, '$' ) } ], select: { style: 'os' , selector: 'td:first-child' }, buttons: [ { extend: "create" , editor: editor }, { extend: "edit" , editor: editor }, { extend: "remove" , editor: editor } ] } ); } ); |
In addition to the above code, the following Javascript library files are loaded for use in this example:
The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:
<table id="example" class="display" cellspacing="0" width="100%">
<thead>
<tr>
<th></th>
<th>First name</th>
<th>Last name</th>
<th>Position</th>
<th>Office</th>
<th width="18%">Start date</th>
<th>Salary</th>
</tr>
</thead>
</table><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div><div class="line number30 index29 alt1">30</div><div class="line number31 index30 alt2">31</div><div class="line number32 index31 alt1">32</div><div class="line number33 index32 alt2">33</div><div class="line number34 index33 alt1">34</div><div class="line number35 index34 alt2">35</div><div class="line number36 index35 alt1">36</div><div class="line number37 index36 alt2">37</div><div class="line number38 index37 alt1">38</div><div class="line number39 index38 alt2">39</div><div class="line number40 index39 alt1">40</div><div class="line number41 index40 alt2">41</div><div class="line number42 index41 alt1">42</div><div class="line number43 index42 alt2">43</div><div class="line number44 index43 alt1">44</div><div class="line number45 index44 alt2">45</div><div class="line number46 index45 alt1">46</div><div class="line number47 index46 alt2">47</div><div class="line number48 index47 alt1">48</div><div class="line number49 index48 alt2">49</div><div class="line number50 index49 alt1">50</div><div class="line number51 index50 alt2">51</div><div class="line number52 index51 alt1">52</div><div class="line number53 index52 alt2">53</div><div class="line number54 index53 alt1">54</div><div class="line number55 index54 alt2">55</div><div class="line number56 index55 alt1">56</div><div class="line number57 index56 alt2">57</div><div class="line number58 index57 alt1">58</div><div class="line number59 index58 alt2">59</div><div class="line number60 index59 alt1">60</div><div class="line number61 index60 alt2">61</div><div class="line number62 index61 alt1">62</div><div class="line number63 index62 alt2">63</div><div class="line number64 index63 alt1">64</div><div class="line number65 index64 alt2">65</div><div class="line number66 index65 alt1">66</div><div class="line number67 index66 alt2">67</div><div class="line number68 index67 alt1">68</div><div class="line number69 index68 alt2">69</div><div class="line number70 index69 alt1">70</div><div class="line number71 index70 alt2">71</div><div class="line number72 index71 alt1">72</div><div class="line number73 index72 alt2">73</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="js keyword">var</code> <code class="js plain">editor; </code><code class="js comments">// use a global for the submit and return data rendering in the examples</code></div><div class="line number2 index1 alt1"> </div><div class="line number3 index2 alt2"><code class="js plain">$(document).ready(</code><code class="js keyword">function</code><code class="js plain">() {</code></div><div class="line number4 index3 alt1"><code class="js spaces"> </code><code class="js plain">editor = </code><code class="js keyword">new</code> <code class="js plain">$.fn.dataTable.Editor( {</code></div><div class="line number5 index4 alt2"><code class="js spaces"> </code><code class="js plain">ajax: </code><code class="js string">"../../controllers/staff.php"</code><code class="js plain">,</code></div><div class="line number6 index5 alt1"><code class="js spaces"> </code><code class="js plain">table: </code><code class="js string">"#example"</code><code class="js plain">,</code></div><div class="line number7 index6 alt2"><code class="js spaces"> </code><code class="js plain">fields: [ {</code></div><div class="line number8 index7 alt1"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"First name:"</code><code class="js plain">,</code></div><div class="line number9 index8 alt2"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"first_name"</code></div><div class="line number10 index9 alt1"><code class="js spaces"> </code><code class="js plain">}, {</code></div><div class="line number11 index10 alt2"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"Last name:"</code><code class="js plain">,</code></div><div class="line number12 index11 alt1"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"last_name"</code></div><div class="line number13 index12 alt2"><code class="js spaces"> </code><code class="js plain">}, {</code></div><div class="line number14 index13 alt1"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"Position:"</code><code class="js plain">,</code></div><div class="line number15 index14 alt2"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"position"</code></div><div class="line number16 index15 alt1"><code class="js spaces"> </code><code class="js plain">}, {</code></div><div class="line number17 index16 alt2"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"Office:"</code><code class="js plain">,</code></div><div class="line number18 index17 alt1"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"office"</code></div><div class="line number19 index18 alt2"><code class="js spaces"> </code><code class="js plain">}, {</code></div><div class="line number20 index19 alt1"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"Extension:"</code><code class="js plain">,</code></div><div class="line number21 index20 alt2"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"extn"</code></div><div class="line number22 index21 alt1"><code class="js spaces"> </code><code class="js plain">}, {</code></div><div class="line number23 index22 alt2"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"Start date:"</code><code class="js plain">,</code></div><div class="line number24 index23 alt1"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"start_date"</code><code class="js plain">,</code></div><div class="line number25 index24 alt2"><code class="js spaces"> </code><code class="js plain">type: </code><code class="js string">"datetime"</code></div><div class="line number26 index25 alt1"><code class="js spaces"> </code><code class="js plain">}, {</code></div><div class="line number27 index26 alt2"><code class="js spaces"> </code><code class="js plain">label: </code><code class="js string">"Salary:"</code><code class="js plain">,</code></div><div class="line number28 index27 alt1"><code class="js spaces"> </code><code class="js plain">name: </code><code class="js string">"salary"</code></div><div class="line number29 index28 alt2"><code class="js spaces"> </code><code class="js plain">}</code></div><div class="line number30 index29 alt1"><code class="js spaces"> </code><code class="js plain">]</code></div><div class="line number31 index30 alt2"><code class="js spaces"> </code><code class="js plain">} );</code></div><div class="line number32 index31 alt1"> </div><div class="line number33 index32 alt2"><code class="js spaces"> </code><code class="js comments">// Activate an inline edit on click of a table cell</code></div><div class="line number34 index33 alt1"><code class="js spaces"> </code><code class="js plain">$(</code><code class="js string">'#example'</code><code class="js plain">).on( </code><code class="js string">'click'</code><code class="js plain">, </code><code class="js string">'tbody td:not(:first-child)'</code><code class="js plain">, </code><code class="js keyword">function</code> <code class="js plain">(e) {</code></div><div class="line number35 index34 alt2"><code class="js spaces"> </code><code class="js plain">editor.inline( table.cell( </code><code class="js keyword">this</code> <code class="js plain">).index(), {</code></div><div class="line number36 index35 alt1"><code class="js spaces"> </code><code class="js plain">onBlur: </code><code class="js string">'submit'</code></div><div class="line number37 index36 alt2"><code class="js spaces"> </code><code class="js plain">} );</code></div><div class="line number38 index37 alt1"><code class="js spaces"> </code><code class="js plain">} );</code></div><div class="line number39 index38 alt2"> </div><div class="line number40 index39 alt1"><code class="js spaces"> </code><code class="js keyword">var</code> <code class="js plain">table = $(</code><code class="js string">'#example'</code><code class="js plain">).DataTable( {</code></div><div class="line number41 index40 alt2"><code class="js spaces"> </code><code class="js plain">dom: </code><code class="js string">'Bfrtip'</code><code class="js plain">,</code></div><div class="line number42 index41 alt1"><code class="js spaces"> </code><code class="js plain">ajax: {</code></div><div class="line number43 index42 alt2"><code class="js spaces"> </code><code class="js plain">url: </code><code class="js string">'../../controllers/staff.php'</code><code class="js plain">,</code></div><div class="line number44 index43 alt1"><code class="js spaces"> </code><code class="js plain">type: </code><code class="js string">'POST'</code></div><div class="line number45 index44 alt2"><code class="js spaces"> </code><code class="js plain">},</code></div><div class="line number46 index45 alt1"><code class="js spaces"> </code><code class="js plain">serverSide: </code><code class="js keyword">true</code><code class="js plain">,</code></div><div class="line number47 index46 alt2"><code class="js spaces"> </code><code class="js plain">order: [[ 1, </code><code class="js string">'asc'</code> <code class="js plain">]],</code></div><div class="line number48 index47 alt1"><code class="js spaces"> </code><code class="js plain">columns: [</code></div><div class="line number49 index48 alt2"><code class="js spaces"> </code><code class="js plain">{</code></div><div class="line number50 index49 alt1"><code class="js spaces"> </code><code class="js plain">data: </code><code class="js keyword">null</code><code class="js plain">,</code></div><div class="line number51 index50 alt2"><code class="js spaces"> </code><code class="js plain">defaultContent: </code><code class="js string">''</code><code class="js plain">,</code></div><div class="line number52 index51 alt1"><code class="js spaces"> </code><code class="js plain">className: </code><code class="js string">'select-checkbox'</code><code class="js plain">,</code></div><div class="line number53 index52 alt2"><code class="js spaces"> </code><code class="js plain">orderable: </code><code class="js keyword">false</code><code class="js plain">,</code></div><div class="line number54 index53 alt1"><code class="js spaces"> </code><code class="js plain">searchable: </code><code class="js keyword">false</code></div><div class="line number55 index54 alt2"><code class="js spaces"> </code><code class="js plain">},</code></div><div class="line number56 index55 alt1"><code class="js spaces"> </code><code class="js plain">{ data: </code><code class="js string">"first_name"</code> <code class="js plain">},</code></div><div class="line number57 index56 alt2"><code class="js spaces"> </code><code class="js plain">{ data: </code><code class="js string">"last_name"</code> <code class="js plain">},</code></div><div class="line number58 index57 alt1"><code class="js spaces"> </code><code class="js plain">{ data: </code><code class="js string">"position"</code> <code class="js plain">},</code></div><div class="line number59 index58 alt2"><code class="js spaces"> </code><code class="js plain">{ data: </code><code class="js string">"office"</code> <code class="js plain">},</code></div><div class="line number60 index59 alt1"><code class="js spaces"> </code><code class="js plain">{ data: </code><code class="js string">"start_date"</code> <code class="js plain">},</code></div><div class="line number61 index60 alt2"><code class="js spaces"> </code><code class="js plain">{ data: </code><code class="js string">"salary"</code><code class="js plain">, render: $.fn.dataTable.render.number( </code><code class="js string">','</code><code class="js plain">, </code><code class="js string">'.'</code><code class="js plain">, 0, </code><code class="js string">'$'</code> <code class="js plain">) }</code></div><div class="line number62 index61 alt1"><code class="js spaces"> </code><code class="js plain">],</code></div><div class="line number63 index62 alt2"><code class="js spaces"> </code><code class="js plain">select: {</code></div><div class="line number64 index63 alt1"><code class="js spaces"> </code><code class="js plain">style: </code><code class="js string">'os'</code><code class="js plain">,</code></div><div class="line number65 index64 alt2"><code class="js spaces"> </code><code class="js plain">selector: </code><code class="js string">'td:first-child'</code></div><div class="line number66 index65 alt1"><code class="js spaces"> </code><code class="js plain">},</code></div><div class="line number67 index66 alt2"><code class="js spaces"> </code><code class="js plain">buttons: [</code></div><div class="line number68 index67 alt1"><code class="js spaces"> </code><code class="js plain">{ extend: </code><code class="js string">"create"</code><code class="js plain">, editor: editor },</code></div><div class="line number69 index68 alt2"><code class="js spaces"> </code><code class="js plain">{ extend: </code><code class="js string">"edit"</code><code class="js plain">, editor: editor },</code></div><div class="line number70 index69 alt1"><code class="js spaces"> </code><code class="js plain">{ extend: </code><code class="js string">"remove"</code><code class="js plain">, editor: editor }</code></div><div class="line number71 index70 alt2"><code class="js spaces"> </code><code class="js plain">]</code></div><div class="line number72 index71 alt1"><code class="js spaces"> </code><code class="js plain">} );</code></div><div class="line number73 index72 alt2"><code class="js plain">} );</code></div></div></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2" style="display: none;">1</div></td><td class="code"><div class="container" style="display: none;"><div class="line number1 index0 alt2" style="display: none;"> </div></div></td></tr></tbody></table>
This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:
1 |
The following CSS library files are loaded for use in this example to provide the styling of the table:
The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.
This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.
Editor submits and retrieves information by Ajax requests. The two blocks below show the data that Editor submits and receives, to and from the server. This is updated live as you interact with Editor so you can see what is submitted.
The following shows the data that has been submitted to the server when a request is made to add, edit or delete data from the table.
// No data yet submitted
The following shows the data that has been returned by the server in response to the data submitted on the left and is then acted upon.
// No data yet received
Please refer to the DataTables documentation for full information about its API properties and methods.
Additionally, there are a wide range of extensions and plug-ins which extend the capabilities of DataTables.
DataTables designed and created by SpryMedia Ltd © 2007-2018
DataTables is licensed under the MIT license.