47 Stimmen

HTML-Tabelle sortieren

Also im Grunde bin ich eine Mysql-Abfrage, die Daten aus meiner Datenbank holt und zeigt es in einem leicht zu lesen Layout für meine Benutzer.

Name-----Address----Sales Person

Sie verstehen das Wesentliche. Und nun möchte ich, dass der Benutzer die Html-Tabelle nach, sagen wir, Vertriebsmitarbeitern sortiert. Wie kann ich das einfach mit einem Dropdown-Menü machen?

<div class='menu'>
  <ul>
    <li><a href='#'><span>Sales Person</span></a>
      <ul>
        <li><a href='#'><span>Melissa</span></a></li>
        <li><a href='#'><span>Justin</span></a></li>
        <li><a href='#'><span>Judy</span></a></li>
        <li><a href='#'><span>Skipper</span></a></li>
        <li><a href='#'><span>Alex</span></a></li>
      </ul>
    </li>
  </ul>
</div>

56voto

smilyface Punkte 4119

Hier ist eine weitere Bibliothek.

Erforderliche Änderungen sind -

  1. sorttable js hinzufügen

  2. Klassenname hinzufügen sortable zu Tisch.

Klicken Sie auf die Tabellenüberschriften um die Tabelle entsprechend zu sortieren:

<script src="https://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>

<table class="sortable">
  <tr>
    <th>Name</th>
    <th>Address</th>
    <th>Sales Person</th>
  </tr>

  <tr class="item">
    <td>user:0001</td>
    <td>UK</td>
    <td>Melissa</td>
  </tr>
  <tr class="item">
    <td>user:0002</td>
    <td>France</td>
    <td>Justin</td>
  </tr>
  <tr class="item">
    <td>user:0003</td>
    <td>San Francisco</td>
    <td>Judy</td>
  </tr>
  <tr class="item">
    <td>user:0004</td>
    <td>Canada</td>
    <td>Skipper</td>
  </tr>
  <tr class="item">
    <td>user:0005</td>
    <td>Christchurch</td>
    <td>Alex</td>
  </tr>

</table>

55voto

verisimilitude Punkte 4807

Prüfen Sie, ob Sie mit einem der unten genannten JQuery-Plugins arbeiten können. Einfach genial und bieten eine breite Palette von Optionen zu arbeiten durch, und weniger Schmerzen zu integrieren :)

https://github.com/paulopmx/Flexigrid - Flexgrid
http://datatables.net/index - Datentabellen.
https://github.com/tonytomov/jqGrid

Wenn nicht, müssen Sie einen Link zu diesen Tabellenköpfen haben, der ein serverseitiges Skript zum Aufrufen der Sortierung aufruft.

22voto

Tom P Punkte 5479

Die Art und Weise, wie ich HTML-Tabellen im Browser sortiert habe, verwendet einfaches, ungeschminktes Javascript.

Der grundlegende Prozess ist folgender:

  1. Hinzufügen eines Klick-Handlers zu jeder Tabellenüberschrift
  2. der Click-Handler notiert den Index der zu sortierenden Spalte
  3. die Tabelle wird in ein Array von Arrays (Zeilen und Zellen) umgewandelt
  4. dieses Array wird mit der Javascript-Sortierfunktion sortiert
  5. werden die Daten aus dem sortierten Array wieder in die HTML-Tabelle eingefügt Tabelle

Die Tabelle sollte natürlich schönes HTML sein. Etwa so...

<table>
 <thead>
  <tr><th>Name</th><th>Age</th></tr>
 </thead>
 <tbody>
  <tr><td>Sioned</td><td>62</td></tr>
  <tr><td>Dylan</td><td>37</td></tr>
  ...etc...
 </tbody>
</table>

Also, zuerst die Klick-Handler hinzufügen...

const table = document.querySelector('table'); //get the table to be sorted

table.querySelectorAll('th') // get all the table header elements
  .forEach((element, columnNo)=>{ // add a click handler for each 
    element.addEventListener('click', event => {
        sortTable(table, columnNo); //call a function which sorts the table by a given column number
    })
  })

Das funktioniert im Moment nicht, weil die sortTable Funktion, die im Event-Handler aufgerufen wird, nicht existiert.

Schreiben wir es...

function sortTable(table, sortColumn){
  // get the data from the table cells
  const tableBody = table.querySelector('tbody')
  const tableData = table2data(tableBody);
  // sort the extracted data
  tableData.sort((a, b)=>{
    if(a[sortColumn] > b[sortColumn]){
      return 1;
    }
    return -1;
  })
  // put the sorted data back into the table
  data2table(tableBody, tableData);
}

Jetzt kommen wir zum Kern des Problems, wir müssen die Funktionen table2data um Daten aus der Tabelle zu erhalten, und data2table um sie nach dem Sortieren wieder einzubauen.

Hier sind sie ...

// this function gets data from the rows and cells 
// within an html tbody element
function table2data(tableBody){
  const tableData = []; // create the array that'll hold the data rows
  tableBody.querySelectorAll('tr')
    .forEach(row=>{  // for each table row...
      const rowData = [];  // make an array for that row
      row.querySelectorAll('td')  // for each cell in that row
        .forEach(cell=>{
          rowData.push(cell.innerText);  // add it to the row data
        })
      tableData.push(rowData);  // add the full row to the table data 
    });
  return tableData;
}

// this function puts data into an html tbody element
function data2table(tableBody, tableData){
  tableBody.querySelectorAll('tr') // for each table row...
    .forEach((row, i)=>{  
      const rowData = tableData[i]; // get the array for the row data
      row.querySelectorAll('td')  // for each table cell ...
        .forEach((cell, j)=>{
          cell.innerText = rowData[j]; // put the appropriate array element into the cell
        })
    });
}

Und das sollte genügen.

Ein paar Dinge, die Sie vielleicht hinzufügen möchten (oder Gründe, warum Sie eine Standardlösung verwenden möchten): Eine Option, um die Richtung und die Art der Sortierung zu ändern, d.h. Sie möchten vielleicht einige Spalten numerisch sortieren ( "10" > "2" ist falsch, weil es sich um Zeichenketten handelt, wahrscheinlich nicht das, was Sie wollen). Die Möglichkeit, eine Spalte als sortiert zu markieren. Eine Art der Datenüberprüfung.

13voto

Penny Liu Punkte 11266

Ein anderer Ansatz zum Sortieren von HTML-Tabellen. (basierend auf W3.JS HTML-Sortierung )

let tid = "#usersTable";
let headers = document.querySelectorAll(tid + " th");

// Sort the table element when clicking on the table headers
headers.forEach(function(element, i) {
  element.addEventListener("click", function() {
    w3.sortHTML(tid, ".item", "td:nth-child(" + (i + 1) + ")");
  });
});

th {
  cursor: pointer;
  background-color: coral;
}

<script src="https://www.w3schools.com/lib/w3.js"></script>
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<p>Click the <strong>table headers</strong> to sort the table accordingly:</p>

<table id="usersTable" class="w3-table-all">
  <!--     
  <tr>
    <th onclick="w3.sortHTML('#usersTable', '.item', 'td:nth-child(1)')">Name</th>
    <th onclick="w3.sortHTML('#usersTable', '.item', 'td:nth-child(2)')">Address</th>
    <th onclick="w3.sortHTML('#usersTable', '.item', 'td:nth-child(3)')">Sales Person</th>
  </tr> 
  -->
  <tr>
    <th>Name</th>
    <th>Address</th>
    <th>Sales Person</th>
  </tr>

  <tr class="item">
    <td>user:2911002</td>
    <td>UK</td>
    <td>Melissa</td>
  </tr>
  <tr class="item">
    <td>user:2201002</td>
    <td>France</td>
    <td>Justin</td>
  </tr>
  <tr class="item">
    <td>user:2901092</td>
    <td>San Francisco</td>
    <td>Judy</td>
  </tr>
  <tr class="item">
    <td>user:2801002</td>
    <td>Canada</td>
    <td>Skipper</td>
  </tr>
  <tr class="item">
    <td>user:2901009</td>
    <td>Christchurch</td>
    <td>Alex</td>
  </tr>

</table>

6voto

Mehrere Tabellen, verschiedene Datentypen und keine externen Bibliotheken

https://github.com/VFDouglas/HTML-Order-Table-By-Column/blob/main/index.html

Pasos:

  1. Fügen Sie Ereignis-Listener zu allen Tabellenköpfen hinzu.
  2. Suchen Sie die Tabelle, die mit der angeklickten Überschrift zusammenhängt, und rufen Sie das Ordnungssymbol auf.
  3. Deklarieren Sie ein Objekt zum Speichern der Tabellenzeilen( tr ) und ein Array von Werten der ausgewählten Spalte.
  4. Iterieren Sie die Werte und prüfen Sie den Datentyp für die künftige Sortierung.
  5. Werte sortieren und die Tabellenüberschrift ändern( th ) Symbol.
  6. Ersetzen Sie die alte tbody mit der bestellten html.

Bearbeiten (11. Januar 2023): Unterstützung für Datumssortierung wurde hinzugefügt.

Fügen Sie einfach ein Attribut namens data-timestamp und übergeben Sie ihm den Zeitstempel des Datums. Der Code kümmert sich dann um den Rest.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<table>
    <thead>
    <tr>
        <th>Column 1 <span>&uarr;</span></th>
        <th>Column 2 <span>&uarr;</span></th>
        <th>Column 3 <span>&uarr;</span></th>
        <th>Column 4 <span>&uarr;</span></th>
        <th>Column 5</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>100</td>
        <td>Nome do produto 22</td>
        <td>ABCASD</td>
        <td>22DDS</td>
        <td>454645</td>
    </tr>
    <tr>
        <td>99</td>
        <td>Nome do produto 12</td>
        <td>AACASD</td>
        <td>22DDS</td>
        <td>354645</td>
    </tr>
    <tr>
        <td>300</td>
        <td>Nome do produto 22</td>
        <td>AcCASD</td>
        <td>32DDS</td>
        <td>554649</td>
    </tr>
    <tr>
        <td>400</td>
        <td>Nomde do produto 22</td>
        <td>AcdCASD</td>
        <td>3d2DDS</td>
        <td>554645</td>
    </tr>
    <tr>
        <td>10</td>
        <td>Nome do produto 1</td>
        <td>cCASD</td>
        <td>DDS</td>
        <td>4645</td>
    </tr>
    </tbody>
</table>
<br>
<table>
    <thead>
    <tr>
        <th>Column 1 <span>&uarr;</span></th>
        <th>Column 2 <span>&uarr;</span></th>
        <th>Column 3 <span>&uarr;</span></th>
        <th>Column 4 <span>&uarr;</span></th>
        <th>Column 5</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>100</td>
        <td>Nome do produto 22</td>
        <td>ABCASD</td>
        <td>22DDS</td>
        <td>454645</td>
    </tr>
    <tr>
        <td>99</td>
        <td>Nome do produto 12</td>
        <td>AACASD</td>
        <td>22DDS</td>
        <td>354645</td>
    </tr>
    <tr>
        <td>300</td>
        <td>Nome do produto 22</td>
        <td>AcCASD</td>
        <td>32DDS</td>
        <td>554649</td>
    </tr>
    <tr>
        <td>400</td>
        <td>Nomde do produto 22</td>
        <td>AcdCASD</td>
        <td>3d2DDS</td>
        <td>554645</td>
    </tr>
    <tr>
        <td>10</td>
        <td>Nome do produto 1</td>
        <td>cCASD</td>
        <td>DDS</td>
        <td>4645</td>
    </tr>
    </tbody>
</table>
<br>
<table>
    <thead>
    <tr>
        <th>Column 12222222222 <span>&uarr;</span></th>
        <th>Column 2 <span>&uarr;</span></th>
        <th>Column 3 <span>&uarr;</span></th>
        <th>Column 4 <span>&uarr;</span></th>
        <th>Column 5 <span>&uarr;</span></th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>100</td>
        <td>Nome 221</td>
        <td>ABCASD</td>
        <td>D</td>
        <td data-timestamp="1671667200">22/12/2022</td>
    </tr>
    <tr>
        <td>99</td>
        <td>Nome 12</td>
        <td>AACASD</td>
        <td>C</td>
        <td data-timestamp="1671840000">24/12/2022</td>
    </tr>
    <tr>
        <td>300</td>
        <td>Nome 222</td>
        <td>AcCASD</td>
        <td>A</td>
        <td data-timestamp="1671494400">20/12/2022</td>
    </tr>
    <tr>
        <td>400</td>
        <td>Nome 22</td>
        <td>AcdCASD</td>
        <td>B</td>
        <td data-timestamp="1702857600">18/12/2023</td>
    </tr>
    <tr>
        <td>10</td>
        <td>Nome 11</td>
        <td>cCASD</td>
        <td>A</td>
        <td data-timestamp="1672012800">26/12/2022</td>
    </tr>
    </tbody>
</table>
<script>
    window.onload = function() {
        document.querySelectorAll('th').forEach((element) => { // Table headers
            element.addEventListener('click', function() {
                let table = this.closest('table');

                // If the column is sortable
                if (this.querySelector('span')) {
                    let order_icon = this.querySelector('span');
                    let order      = encodeURI(order_icon.innerHTML).includes('%E2%86%91') ? 'desc' : 'asc';
                    let separator  = '-----'; // Separate the value of it's index, so data keeps intact

                    let value_list = {}; // <tr> Object
                    let obj_key    = []; // Values of selected column

                    let string_count = 0;
                    let number_count = 0;

                    // <tbody> rows
                    table.querySelectorAll('tbody tr').forEach((line, index_line) => {
                        // Value of each field
                        let key = line.children[element.cellIndex].textContent.toUpperCase();

                        // Check if value is date, numeric or string
                        if (line.children[element.cellIndex].hasAttribute('data-timestamp')) {
                            // if value is date, we store it's timestamp, so we can sort like a number
                            key = line.children[element.cellIndex].getAttribute('data-timestamp');
                        }
                        else if (key.replace('-', '').match(/^[0-9,.]*$/g)) {
                            number_count++;
                        }
                        else {
                            string_count++;
                        }

                        value_list[key + separator + index_line] = line.outerHTML.replace(/(\t)|(\n)/g, ''); // Adding <tr> to object
                        obj_key.push(key + separator + index_line);
                    });
                    if (string_count === 0) { // If all values are numeric
                        obj_key.sort(function(a, b) {
                            return a.split(separator)[0] - b.split(separator)[0];
                        });
                    }
                    else {
                        obj_key.sort();
                    }

                    if (order === 'desc') {
                        obj_key.reverse();
                        order_icon.innerHTML = '&darr;';
                    }
                    else {
                        order_icon.innerHTML = '&uarr;';
                    }

                    let html = '';
                    obj_key.forEach(function(chave) {
                        html += value_list[chave];
                    });
                    table.getElementsByTagName('tbody')[0].innerHTML = html;
                }
            });
        });
    }
</script>
</body>
</html>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X