Как использовать Jquery TableSorter для сортировки столбца, который содержит Кбит / с, Мбит / с, Гбит / с? - PullRequest
1 голос
/ 10 марта 2019

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

В столбце, который содержит меру пропускной способности, будет отображаться значение с одной из трех единиц: Кбит / с, Мбит / с илиGbps.Как я могу настроить jquery tablesorter, чтобы он обращал внимание на модуль?

У меня уже есть Mottie's tablesorter , работающий для этой таблицы, и поведение по умолчанию - смотреть на целое число и сортировать только на основеего ценность.Ну, как вы знаете, 9,46 Мбит / с намного больше, чем 901 Кбит / с, но TableSorter просматривает только числовое значение и сортирует таблицу так, чтобы 901 Кбит / с> 9,46 Мбит / с.

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

Моя таблица данных <table id="vlan-table"> загружается через Jquery после загрузки веб-страницы, а затемvlan-таблица перезагружается каждые 60 секунд для получения последних данных (также через Jquery), поэтому мой плагин TableSorter уже более сложен, чем обычно.

  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
  <script type="text/javascript" src="plugins/jquery.tablesorter.js"></script>

<!-- Load vlan-table on page load -->
  <script type="text/javascript">
    $(function ($) {
      $("#vlan-table").load("data/vlan-table.html", callback);
      function callback() {
        $("div#vlan-table table").tablesorter({
          sortList: [[0, 0]]
        });
      }
    });
  </script>

<!-- Reload vlan-table table every 60 seconds -->
  <script type="text/javascript">
    window.onload = setupRefresh;
    function setupRefresh() {
      setInterval("refreshBlock();", 60000);
    }
    function refreshBlock() {
      $('#vlan-table').load("data/vlan-table.html", callback);
      function callback() {
        $("div#vlan-table table").tablesorter({
          sortList: [[0, 0]]
        });
      }
    }
  </script>

Я попытался создать собственный анализатор для заменыкаждая единица Кбит / с / Мбит / с / Гбит / с (и пространство непосредственно перед ней) с номером, который должен обеспечить правильную сортировку, но я не знаю, куда поместить этот пользовательский анализатор:

$.tablesorter.addParser({
        id: 'data-rate-parser',
        is: function(s, table, cell, $cell){
          return false;
        },
        format: function(s, table, cell, cellIndex) {
          .replace(/ Kbps/,1000)
          .replace(/ Mbps/, 1000000)
          .replace(/ Gbps/, 1000000000)
        },
        type: 'numeric'
      });

Я имеюпопытался поместить его в собственный раздел <script></script> страницы и внутри функции callback(), но безуспешно.

В идеале, наилучшим вариантом будет преобразование каждого показателя пропускной способности обратно в 'бит в секунду - только для сортировки, но делать это в JS выше моего уровня навыков.Спасибо!

1 Ответ

1 голос
/ 11 марта 2019

Woohoo!В итоге я понял это!

Этот ответ на другой вопрос помог мне показать, куда именно добавляется часть функции addParser.

Вот рабочая JS Fiddle .На случай, если что-нибудь случится с JS Fiddle, я поместил код JS ниже.

$(document).ready(function() {

  $.tablesorter.addParser({
    id: 'bandwidth',
    is: function(s) {
      return false;
    },
    format: function(s) {
      return s.toLowerCase()
        .replace(/\.\d+ kbps/, 1000)
        .replace(/\.\d+ mbps/, 1000000)
        .replace(/\.\d+ gbps/, 1000000000)
    },
    type: 'numeric'
  });


  $("#vlan-table").tablesorter({
    sortInitialOrder: 'desc',
    sortRestart: true,
    headers: {
    1: {
    sorter: 'bandwidth'
    },
      2: {
        sorter: 'bandwidth'
      },
      4: {
        sorter: 'bandwidth',
        sortInitialOrder: 'asc'
      }
    }
  });
});

Проблемы в моей первоначальной функции addParser были:

  • Отсутствует возврат s ()
  • Простая замена «Кбит / с» на цифру не будет работатьпотому что «кбит / с» идет после десятичной точки.Я заменил простую замену на шаблон регулярного выражения, который просто соответствует буквальному периоду, одной или нескольким цифрам и одной из единиц.Таким образом, функция сортировки по существу заменяет «123 Кбит / с» на «1231000» и заменяет «313 Мбит / с» на «3131000000», что позволяет ей правильно сортировать таблицу.
  • Я не указал, какие столбцы таблицы я хотелприменить пользовательский парсер к.Обратите внимание, что addParser содержит переменную id:, которую я назначил bandwidth, а в функции .tablesorter анализатор 'bandwidth' применяется к столбцам по их номеру индекса (где первый столбец - индекс 0).

Для моей страницы, которая перезагружает таблицу за 60 секунд для отображения обновленных данных, я просто помещаю .tablesorter и .tablesorter.addParser в свои функции callback (). Здесь - это вопрос и ответ, который помог мне понять, как использовать обратный вызов.

Всем, кто в будущем найдет это полезным, не стесняйтесь оставлять комментарии!

...