Ошибка сортировщика таблиц jQuery

Только что обновился до последнего сортировщика таблиц и выглядит как сломанный или что-то в этом роде. Каждый раз, когда я пытаюсь открыть свою страницу, Firebug говорит:

table.config.parsers не определен

И это просто ломает весь мой Javascript. Если я верну версию tablesorter, она будет работать нормально.

Javascript:

$("#List").tablesorter({ 
    widgets: ['zebra'],
    headers: { 
        4: { sorter: false }
    }
})

HTML:

<table id="List" class="tablesort ui-widget-content ui-corner-top">
    <thead>
      <tr class="ui-widget">
          <th>Pa&iacute;s</th>
          <th>ISO</th>
          <th>ISO3</th>
          <th>CODE</th>
          <th>&nbsp;</th>
      </tr>
    </thead>
    <tbody>
    </tbody>
</table>

person alexandre    schedule 16.12.2010    source источник
comment
просмотрите документацию последней версии... возможно, была изменена сигнатура какой-либо функции... или есть какие-то изменения в конфигурации   -  person Vivek    schedule 16.12.2010
comment
просто используя базовые вещи... они не изменили основную функцию tablesorter(), я уверен в этом: P   -  person alexandre    schedule 16.12.2010
comment
мы можем увидеть ваш JavaScript и HTML?   -  person Nalum    schedule 16.12.2010
comment
Я скопировал ваш код сюда (jsfiddle.net/Nalum/TDr4A) и не получил ошибок. . У вас есть какой-либо другой javascript на странице?   -  person Nalum    schedule 16.12.2010
comment
Как я уже сказал, в предыдущей версии все работало нормально, но когда я использую последнюю версию, она просто ломается, поэтому я сомневаюсь, что у моих js есть что-то с этим.   -  person alexandre    schedule 16.12.2010
comment
Это может быть так, но просмотр любого другого JavaScript на странице позволит мне и другим людям помочь вам. То, что вы предоставили до сих пор, работает, поэтому я не могу вам помочь без дополнительной информации.   -  person Nalum    schedule 16.12.2010
comment
Можете дать ссылку на неработающую страницу?   -  person Nalum    schedule 16.12.2010
comment
pastebin.com/CRUQ0nix здесь JS. Страница, которая не работает, я не могу предоставить ссылку, так как наш сервер разработки не является общедоступным для Интернета =\, но почти все мои сортировки таблиц работают в предыдущей версии, но не в последней. Я использую последнюю версию jquery/jqueryui, если это имеет значение.   -  person alexandre    schedule 16.12.2010
comment
Вы когда-нибудь догадывались об этом? (У меня сейчас такая же проблема.)   -  person Lance    schedule 03.03.2011


Ответы (7)


Хотя в приведенном выше ответе об этом не упоминается, я смог воспроизвести ошибку, сначала создав экземпляр tablesorter(), а затем инициировав запрос сортировки.

Этот порядок событий будет необходим при добавлении или замене существующих данных таблицы новыми данными через AJAX или иным образом:

// populate our table body with rows
$("#myTable tbody").html(json.tbody);

// let the sorting plugin know that we made a update
$("#myTable").trigger("update");

// set sorting column and direction, this will sort on the first and third column
var sorting = [[2,1],[0,0]];

// sort
$("#myTable").trigger("sorton",[sorting]);

Комбинация события «обновление» и «сортон», похоже, вызывает ошибку. К тому времени, когда событие "sorton" обрабатывается, DOM не был назначен table.config.parsers - отсюда и ошибка.

Исправление состоит в том, чтобы обернуть обработку события «sorton» тайм-аутом в 1 миллисекунду.

Замените существующую привязку «sorton» в jquery.tablesorter.js (строка ~803) следующим:

}).bind("sorton", function (e, list) {
    var me = this;
    setTimeout(function () {
        $(this).trigger("sortStart");
        config.sortList = list;
        // update and store the sortlist
        var sortList = config.sortList;
        // update header count index
        updateHeaderSortCount(me, sortList);
        // set css for headers
        setHeadersCss(me, $headers, sortList, sortCSS);
        // sort the table and append it to the dom
        appendToTable(me, multisort(me, sortList, cache));
    }, 1);

tablesorter() — действительно удобный плагин. Спасибо Кристиану за выпуск.

person jrob00    schedule 29.07.2011

Немного поздно, но это потому, что у вас есть пустой/нет элемента <tr> в <tbody>, и он ожидает хотя бы один <tr>.

person SoSo    schedule 26.03.2011
comment
Один из способов обойти это — начать с фиктивного ‹tr› независимо от того, есть ли в таблице какие-либо данные или нет, а затем скрыть их с помощью js при загрузке документа. - person Val Redchenko; 08.02.2012

Я попробовал некоторые из приведенных выше ответов, но они не помогли на каждой странице, на которой мы использовали таблицы. Основная причина, по которой я понял ошибку, заключается в том, что c=sortList[i][0] не определено либо потому, что у нас есть пустой TR, либо у нас не то же количество TD, что и у TH.

У меня было 8 TH/TD на случай, если у меня есть табличные данные, и 8 TH и один TD на случай, если мне нечего показать. Мне удалось проверить, нет ли у меня данных таблицы, а затем не вызывать таблицы для сортировки по определенным столбцам, которых не существует. Это помогло. Может помочь кому-то с похожим сценарием

if(tableData.length != 0){
  $("#myid").tablesorter( {sortList: [[2,0]]});
}

person Manish Devraj    schedule 23.03.2015
comment
Это помогло мне. Спасибо! Я просто отфильтровал их, используя .filter(function(){ return $(this).find("tbody > tr").length > 0; }).tablesorter(....). (Я тоже использовал sortList. Не уверен, что это влияет.) - person ; 18.07.2016

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

Запуск сортировщика таблиц внутри подпрограммы setTimeout() устранил эту ошибку для меня.

    function initPage() {
        fillMyTable();
        // Init table sorter, but give the browser a second to draw the new table
        setTimeout(function(){ $("#my_table").tablesorter(); }, 1000);
    }
person PaulS    schedule 23.03.2015

Еще один ответ на случай, если кто-нибудь когда-нибудь столкнется с тем же сценарием, что и я. По-видимому, сортировщику таблиц иногда нравится иметь соответствующее количество пустых элементов <td> (таких же, как элементы заголовка) внутри пустого <tr>. Мой частичный пример ниже

<thead>
    <tr>
        <th class="{sorter: 'text'}'' "><a href="javascript:;" title="Sort" class="arrow"><span>Network Name</span></a></th>
        <th class="{sorter: 'text'} "><a href="javascript:;" title="Sort" class="arrow"><span>Type</span></a></th>
        <th class="{sorter: false}"><a href="javascript:;" title="Sort" class="arrow"><span>Interconnections</span></a></th>
        <th class="{sorter: false}">&nbsp;</th>
    </tr>
</thead>

<tbody>
    <tr style="display:none"><td></td><td></td><td></td><td></td></tr>.........................
person Adrian    schedule 04.12.2014

Обратите внимание, что пример AJAX демонстрирует только сценарий, в котором новые строки добавляются к существующим. Когда таблица динамически очищается и заполняется новыми строками, появляется указанная выше ошибка.

Добавление пустой строки

<tr style="display:none"><td></td>...<td></td></tr>

с тем же количеством <td>s, что и количество <th>s в заголовке, устраняет ошибку, но вносит другую: после того, как таблица очищается и заполняется реальными строками, новые строки добавляются к старым.

В качестве альтернативы изменению исходного кода сортировщика таблиц попробуйте следующую последовательность вызова:

$("#my-table").trigger("update");
setTimeout(function() { 
    /* e.g. sort by the second column in descending order */
    var sorting = [[1, 1]];
    $("#my-table").trigger("sorton", [sorting]);
}, 100);
person user1408140    schedule 30.11.2015

Я столкнулся со случаем, когда я получил это сообщение об ошибке, не обновляя таблицы сортировщика специально, а только потому, что количество столбцов в элементе tfoot не соответствовало количеству столбцов в элементах thead и tbody, поэтому плагин таблицы сортировщика сбился с толку.

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

person Fabien Haddadi    schedule 01.05.2018