Сортировка в таблице

106
16 апреля 2022, 15:20

Использую такой код сортировка в таблице. Все работает нормально, но есть один момент который хотелось бы улучшить. Как при клике th в thead добавлять определенные классы для выведения стрелок направления сортировки? Т.е. что бы при нажатии на поле добавлялся стиль например asc при сортировке по возрастанию, а при повторном нажатии добавлялся стиль desc. В принципе стили можно добавлять и удалять таким образом

        if(this.classList.contains('asc')) {
            this.classList.add("desc");
            this.classList.remove("asc");
        } else {
            this.classList.add("asc");
            this.classList.remove("desc");
        }

но проблема в том что таким образом естественно не удаляются стили у других элементов по которым не было клика, а нужно их удалять, что бы убирать стиль направления сортировки у неактивного столбца

Answer 1

Думаю как-то так. Но вам нужно

function sortTable(table, col, reverse) {
    // изменяем tHead
    let th = table.tHead;
    [...th.rows].forEach(row => { 
      [...row.cells].forEach((cell, index) => { 
          cell.classList.remove("asc");
          cell.classList.remove("desc");
          if (index === col){
             if(reverse) {
                cell.classList.add("desc");            
             } else {
                cell.classList.add("asc");            
             } 
          }  
       // временное решение удалите на своём примере
       cell.innerText = cell.innerText.replaceAll(" asc",  "");
       cell.innerText = cell.innerText.replaceAll(" desc", "");
       
       if (index === col){       
        if(reverse) {
            cell.innerText += " desc";
        } else {
            cell.innerText += " asc";
        }        
       } // конец временного решения
        
      });
    });
    
    // ваш основной код без изменения
    
    var tb = table.tBodies[0], // use `<tbody>` to ignore `<thead>` and `<tfoot>` rows
        tr = Array.prototype.slice.call(tb.rows, 0), // put rows into array
        i;
    reverse = -((+reverse) || -1);
    tr = tr.sort(function (a, b) { // sort rows
        return reverse // `-1 *` if want opposite order
            * (a.cells[col].textContent.trim() // using `.textContent.trim()` for test
                .localeCompare(b.cells[col].textContent.trim())
               );
    });
    for(i = 0; i < tr.length; ++i) tb.appendChild(tr[i]); // append each row in order
}
function makeSortable(table) {
    var th = table.tHead, i;
    th && (th = th.rows[0]) && (th = th.cells);
    if (th) i = th.length;
    else return; // if no `<thead>` then do nothing
    while (--i >= 0) (function (i) {
        var dir = 1;
        th[i].addEventListener('click', function () {sortTable(table, i, (dir = 1 - dir))});
    }(i));
}
function makeAllSortable(parent) {
    parent = parent || document.body;
    var t = parent.getElementsByTagName('table'), i = t.length;
    while (--i >= 0) makeSortable(t[i]);
}
window.onload = function () {makeAllSortable();};
table {width: 100%;font: 12px arial;}
th, td {min-width: 40px;text-align: center;}
th {font-weight: bold;}
<table>
  <thead>
    <tr>
      <th>c1</th>
      <th>c2</th>
      <th>c3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>a</td><td>t</td><td>p</td>
    </tr>
    <tr>
      <td>a</td><td>v</td><td>r</td>
    </tr>
    <tr>
      <td>f</td><td>a</td><td>d</td>
    </tr>
    <tr>
      <td>h</td><td>t</td><td>i</td>
    </tr>
  </tbody>
</table>

READ ALSO
Прогресс-бар картинкой

Прогресс-бар картинкой

Опыта в php и css у меня всего пара месяцевВозникла необходимость сделать красивый прогресс-бар для браузерной онлайн-игры в виде картинкок(одна...

167
Js ошибка Maximum call stack size exceeded

Js ошибка Maximum call stack size exceeded

Реализовываю алгоритм быстрой сортировки, но она работает только когда элементов меньше чем +-3000Если элементов больше - вылезает эта ошибка

88
React добавить дочерней компоненте onClick

React добавить дочерней компоненте onClick

У меня есть множество компоентов в dropdown спискеНадо чтобы при нажатии на любой из элементов списка, происходило конкретное действие

87
JS Получение изображения из input

JS Получение изображения из input

Есть форма html для загрузки изображения:

94