Сортировка динамически сгенерированной таблицы по алфавиту - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь отсортировать таблицу по алфавиту. Это основано на 2-м столбце каждой строки (под заголовком «Заголовок»). Мой код прекрасно работает, когда изолирован в HTML-файл. Находится здесь ...

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

Функция sortTable ...

function sortTable() {
var table, rows, switching, i, x, y, shouldSwitch;
table = document.getElementById("manga-tracker").getElementsByTagName('table')[0];
switching = true;
/* Make a loop that will continue until
no switching has been done: */
while (switching) {
    // Start by saying: no switching is done:
    switching = false;
    rows = table.getElementsByTagName("tr");
    /* Loop through all table rows (except the
    first, which contains table headers): */
    for (var i = 1; i < (rows.length - 1); i++) {
        // Start by saying there should be no switching:
        shouldSwitch = false;
        /* Get the two elements you want to compare,
        one from current row and one from the next: */
        x = rows[i].getElementsByTagName("td")[1].getElementsByTagName('a')[0].text;
        y = rows[i + 1].getElementsByTagName("td")[1].getElementsByTagName('a')[0].text;
        console.log('x: '+x+', y: '+y);
        // Check if the two rows should switch place:
        if (x.toLowerCase() > y.toLowerCase()) {
            // If so, mark as a switch and break the loop:
            shouldSwitch = true;
            break;
        }
    }
    if (shouldSwitch) {
        /* If a switch has been marked, make the switch
        and mark that a switch has been done: */
        rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
        switching = true;
    }
}

}

Это то, что создает таблицу путем получения данных с сервера. HTML-код, созданный этой функцией, выглядит точно так же, как и HTML-код, который я предоставил в примере с кодовым элементом в верхней части этого поста.

function populateMangaTracker() {
$('#manga-tracker').html("<table><th> </th><th>Title</th><th>Released</th><th>Owned</th><th>Read</th><th>Last Updated</th><th>Posted By</th></table>");
$.ajax({
    method: 'GET',
    url: 'populate-mangatracker.php',
});
$.getJSON('populate-mangatracker.php', function(data){
    $.each( data, function( key, val ) { 
        $('#manga-tracker table').append("<tr><td><input type='checkbox' name='delete-manga' value='"+val.id+"' /></td><td><a href='?id="+val.id+"'>"+val.title+"</a></td><td>"+val.total+"</td><td>"+val.owned+"</td><td>"+val.volRead+"</td><td>"+val.lastUpdated+"</td><td>"+ val.owner.charAt(0).toUpperCase() + val.owner.substr(1) +"</td></tr>");
    });
    // add onclick event to #manga-tracker links
    $('#manga-tracker a').on('click', function(e) {
        e.preventDefault();
        e.stopPropagation();
        var pathName = $(this).attr('href').split('=');
        pathName = pathName[1];
        if(pathName >= 0) {
            window.location = 'edit-manga.php?id='+pathName;
        }
    });
});

}

Внутри функции tableSort () ... Когда я пытаюсь использовать console.log () внутри цикла for (), он не работает, потому что переменная 'lines' имеет длину только 1, следовательно, что-либо после индекса 1 неизвестно.

Когда я console.log () 'rows' перед циклом for (), он содержит все 10 тегов tr. Я не понимаю, куда собирается содержимое массива ... Может кто-нибудь помочь мне заставить это работать?

Пожалуйста и спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я попробовал решение @ sureperformances.Хотя он будет работать, когда изолирован в отдельном файле, он не будет работать в моем проекте.Затем я подумал о том, что @ sureperformances предлагает для хранения данных, а не элементов. Это меня поразило.Я мог бы просто отсортировать данные, прежде чем выводить их в таблицу.Я просто усложнял вещи.

function populateMangaTracker() {
var toBeSorted = [];
$('#manga-tracker').html("<table><th> </th><th>Title</th><th>Released</th><th>Owned</th><th>Read</th><th>Last Updated</th><th>Posted By</th></table>");
$.ajax({
    method: 'GET',
    url: 'populate-mangatracker.php',
});
$.getJSON('populate-mangatracker.php', function(data){
    $.each( data, function( key, val ) { 
        /* Stored data in an array */
        toBeSorted[key] = {
            'id': val.id,
            'title': val.title,
            'total': val.total,
            'owned': val.owned,
            'read': val.volRead,
            'lastUpdated': val.lastUpdated,
            'owned': val.owner.charAt(0).toUpperCase() + val.owner.substr(1)
        };
    });
    /* Then sorted alphabetically here */
    toBeSorted.sort(sortObject); // sort alphabetically

    /* And outputted data to table here */
    for(var i = 0; i < toBeSorted.length; i++) {
        $('#manga-tracker table').append("<tr><td><input type='checkbox' name='delete-manga' value='"+toBeSorted[i].id+"' /></td><td><a href='?id="+toBeSorted[i].id+"'>"+toBeSorted[i].title+"</a></td><td>"+toBeSorted[i].total+"</td><td>"+toBeSorted[i].owned+"</td><td>"+toBeSorted[i].volRead+"</td><td>"+toBeSorted[i].lastUpdated+"</td><td>"+toBeSorted[i].owner+"</td></tr>");
    }
});

}

0 голосов
/ 15 мая 2018

Если вы в порядке, удалив элементы таблицы и добавив их снова, попробуйте следующее:

const tbody = document.querySelector('#manga-tracker tbody');
const [trhead, ...trs] = [...tbody.children];
trs.sort((tr1, tr2) => tr1.children[1].textContent.localeCompare(tr2.children[1].textContent));
tbody.textContent = '';
[trhead, ...trs].forEach(tr => tbody.appendChild(tr));
<div id="manga-tracker-wrapper">
  <form action="delete-manga.php" method="POST">
    <div id="manga-tracker">
      <table>
        <tbody>
          <tr>
            <th> </th>
            <th>Title</th>
            <th>Released</th>
            <th>Owned</th>
            <th>Read</th>
            <th>Last Updated</th>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="7"></td>
            <td><a href="?id=7">Arifureta: From Commonplace to World's Strongest</a></td>
            <td>20</td>
            <td>1</td>
            <td>1</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="6"></td>
            <td><a href="?id=6">Akame ga KILL!</a></td>
            <td>14</td>
            <td>14</td>
            <td>14</td>
            <td>2018-05-13</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="11"></td>
            <td><a href="?id=11">Dragonball Super</a></td>
            <td>2</td>
            <td>1</td>
            <td>1</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="12"></td>
            <td><a href="?id=12">7th Garden</a></td>
            <td>8</td>
            <td>1</td>
            <td>1</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="13"></td>
            <td><a href="?id=13">Attack on Titan</a></td>
            <td>25</td>
            <td>2</td>
            <td>0</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="14"></td>
            <td><a href="?id=14">The Ancient Magus' Bride</a></td>
            <td>8</td>
            <td>7</td>
            <td>7</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="15"></td>
            <td><a href="?id=15">Beasts of Abigaile</a></td>
            <td>3</td>
            <td>3</td>
            <td>3</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="16"></td>
            <td><a href="?id=16">Berserk</a></td>
            <td>39</td>
            <td>6</td>
            <td>6</td>
            <td>2018-05-14</td>
          </tr>
          <tr>
            <td><input type="checkbox" name="delete-manga" value="17"></td>
            <td><a href="?id=17">Fairy Tale</a></td>
            <td>63</td>
            <td>1</td>
            <td>0</td>
            <td>2018-05-14</td>
          </tr>
        </tbody>
      </table>
    </div>
  </form>
  <div id="delete-response">
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...