Isabelle May
Isabelle May

Reputation: 143

How do I control a DataTables-generated select menu with my own custom dropdown menu?

I've got an auto-generated select menu with four options, which looks like this:

    <div class="dataTables_length" id="table_length">
   <label>
      Show 
      <select name="table_length" aria-controls="table">
         <option value="10">10 results</option>
         <option value="15">15 results</option>
         <option value="25">25 results</option>
         <option value="-1">All results</option>
      </select>
      entries
   </label>
</div>

I also have a div element contained outside of the DataTables area, which has all of the styling that I cannot apply to the select element on account of it being a select element:

<div id="dropdown-container">
    <div id="dropdown">
        <button id="dropdown-button"></button>
        <div id="10-results" class="dropdown-item">
          <p>
            10 results
          </p>
       </div>
       <div id="15-results">
          <p>15 results</p>
       </div>
       <div id="25-results" class="dropdown-item">
         <p>25 results</p>
       </div>
       <div id="all-results" class="dropdown-item">
         <p>All results</p>
       </div>
    </div>
</div>

From what I've researched, I should be able to cause the select value to change on a click using the following jQuery logic:

$("#10-results").on("click", function(){
    $('select').val( 10 );
});

but this doesn't seem to be working!

This is the only select element on the page, and even after injecting a unique class into it the expected result - of each option being activated on clicking the other elements as if that option was itself clicked - is not being seen.

Not sure if this is a DataTables-specific problem, but it doesn't make sense to me to include an un-stylable select element without alternative options being available.

Upvotes: 0

Views: 519

Answers (1)

gaetanoM
gaetanoM

Reputation: 42054

page.len(): This method is used quite simply to get and set the length of the paging used by DataTables for display.

Hence, change your click event handler with:

$("#10-results").on("click", function(){
    $('#yourdatatableid').DataTable().page.len(10).draw();
});

$("#10-results").on("click", function(){
    $('#yourdatatableid').DataTable().page.len(10).draw();
});

$('#yourdatatableid').DataTable({
    "pageLength": 5,
    "lengthMenu": [ [5, 10, 25, 50, -1], [5, 10, 25, 50, "All"] ]
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>

<div id="dropdown-container">
    <div id="dropdown">
        <button id="dropdown-button"></button>
        <div id="10-results" class="dropdown-item">
            <p>
                10 results
            </p>
        </div>
        <div id="15-results">
            <p>15 results</p>
        </div>
        <div id="25-results" class="dropdown-item">
            <p>25 results</p>
        </div>
        <div id="all-results" class="dropdown-item">
            <p>All results</p>
        </div>
    </div>
</div>
<table id="yourdatatableid" class="display" style="width:100%">
    <thead>
    <tr>
        <th>Name</th>
        <th>Position</th>
        <th>Office</th>
        <th>Age</th>
        <th>Start date</th>
        <th>Salary</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>Tiger Nixon</td>
        <td>System Architect</td>
        <td>Edinburgh</td>
        <td>61</td>
        <td>2011/04/25</td>
        <td>$320,800</td>
    </tr>
    <tr>
        <td>Garrett Winters</td>
        <td>Accountant</td>
        <td>Tokyo</td>
        <td>63</td>
        <td>2011/07/25</td>
        <td>$170,750</td>
    </tr>
    <tr>
        <td>Ashton Cox</td>
        <td>Junior Technical Author</td>
        <td>San Francisco</td>
        <td>66</td>
        <td>2009/01/12</td>
        <td>$86,000</td>
    </tr>
    <tr>
        <td>Cedric Kelly</td>
        <td>Senior Javascript Developer</td>
        <td>Edinburgh</td>
        <td>22</td>
        <td>2012/03/29</td>
        <td>$433,060</td>
    </tr>
    <tr>
        <td>Airi Satou</td>
        <td>Accountant</td>
        <td>Tokyo</td>
        <td>33</td>
        <td>2008/11/28</td>
        <td>$162,700</td>
    </tr>
    <tr>
        <td>Brielle Williamson</td>
        <td>Integration Specialist</td>
        <td>New York</td>
        <td>61</td>
        <td>2012/12/02</td>
        <td>$372,000</td>
    </tr>
    <tr>
        <td>Herrod Chandler</td>
        <td>Sales Assistant</td>
        <td>San Francisco</td>
        <td>59</td>
        <td>2012/08/06</td>
        <td>$137,500</td>
    </tr>
    <tr>
        <td>Rhona Davidson</td>
        <td>Integration Specialist</td>
        <td>Tokyo</td>
        <td>55</td>
        <td>2010/10/14</td>
        <td>$327,900</td>
    </tr>
    <tr>
        <td>Colleen Hurst</td>
        <td>Javascript Developer</td>
        <td>San Francisco</td>
        <td>39</td>
        <td>2009/09/15</td>
        <td>$205,500</td>
    </tr>
    <tr>
        <td>Sonya Frost</td>
        <td>Software Engineer</td>
        <td>Edinburgh</td>
        <td>23</td>
        <td>2008/12/13</td>
        <td>$103,600</td>
    </tr>
    <tr>
        <td>Jena Gaines</td>
        <td>Office Manager</td>
        <td>London</td>
        <td>30</td>
        <td>2008/12/19</td>
        <td>$90,560</td>
    </tr>
    <tr>
        <td>Quinn Flynn</td>
        <td>Support Lead</td>
        <td>Edinburgh</td>
        <td>22</td>
        <td>2013/03/03</td>
        <td>$342,000</td>
    </tr>
    <tr>
        <td>Charde Marshall</td>
        <td>Regional Director</td>
        <td>San Francisco</td>
        <td>36</td>
        <td>2008/10/16</td>
        <td>$470,600</td>
    </tr>
    </tbody>
    <tfoot>
    <tr>
        <th>Name</th>
        <th>Position</th>
        <th>Office</th>
        <th>Age</th>
        <th>Start date</th>
        <th>Salary</th>
    </tr>
    </tfoot>
</table>

Upvotes: 1

Related Questions