Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.05.2012, 11:38
Новичок на форуме
Отправить личное сообщение для edmundantes Посмотреть профиль Найти все сообщения от edmundantes
 
Регистрация: 26.04.2012
Сообщений: 7

Сортировка таблицы (даты)
Добрый день, уважаемые форумчане.
Я стажер в одной организации и мне поручили сделать приложения для вывода данных из бд через php в виде таблицы. Все шло хорошо и не было проблем, когда на финальной стадии создания приложения перед мной поставили задачу сортировать данные. Без сабмита по средствам JS, а в нем я практически ничего не понимаю и времени разбираться крайне мало(в дальнейшем собираюсь осваивать). Так вот в интернете куча скриптов сортирующих данные в таблице, но я не нашел рабочего который сортировал бы дату нормально(все они по символьно сравнивают или же не идут на всех версиях браузера). Так если кто может, уделите мне пару минут и исправьте мой скрип, который уже в обороте (что бы сортировал даты). Буду кланяться в ноги и очень признателен.
var initial_sort_id = 1;
    var initial_sort_up = 1;
    var img_dir = ""; // папка с картинками
    var sort_case_sensitive = false; // вид сортировки (регистрозависимый или нет)

    // ф-ция, определяющая алгоритм сортировки
    function _sort(a, b) {
        var a = a[0];
        var b = b[0];
        var _a = (a + '').replace(/,/, '.');
        var _b = (b + '').replace(/,/, '.');
        if (parseFloat(_a) && parseFloat(_b)) return sort_numbers(parseFloat(_a), parseFloat(_b));
        else if (!sort_case_sensitive) return sort_insensitive(a, b);
        else return sort_sensitive(a, b);
    }

    // ф-ция сортировки чисел
    function sort_numbers(a, b) {
        return a - b;
    }

    // ф-ция регистронезависимой сортировки
    function sort_insensitive(a, b) {
        var anew = a.toLowerCase();
        var bnew = b.toLowerCase();
        if (anew < bnew) return -1;
        if (anew > bnew) return 1;
        return 0;
    }

    // ф-ция регистрозависимой сортировки
    function sort_sensitive(a, b) {
        if (a < b) return -1;
        if (a > b) return 1;
        return 0;
    }

    // вспомогательная ф-ция, выдирающая из дочерних узлов весь текст
    function getConcatenedTextContent(node) {
        var _result = "";
        if (node == null) {
            return _result;
        }
        var childrens = node.childNodes;
        var i = 0;
        while (i < childrens.length) {
            var child = childrens.item(i);
            switch (child.nodeType) {
                case 1: // ELEMENT_NODE
                case 5: // ENTITY_REFERENCE_NODE
                    _result += getConcatenedTextContent(child);
                    break;
                case 3: // TEXT_NODE
                case 2: // ATTRIBUTE_NODE
                case 4: // CDATA_SECTION_NODE
                    _result += child.nodeValue;
                    break;
                case 6: // ENTITY_NODE
                case 7: // PROCESSING_INSTRUCTION_NODE
                case 8: // COMMENT_NODE
                case 9: // DOCUMENT_NODE
                case 10: // DOCUMENT_TYPE_NODE
                case 11: // DOCUMENT_FRAGMENT_NODE
                case 12: // NOTATION_NODE
                    // skip
                    break;
            }
            i++;
        }
        return _result;
    }

    // суть скрипта
    function sort(e) {
        var el = window.event ? window.event.srcElement : e.currentTarget;
        while (el.tagName.toLowerCase() != "td") el = el.parentNode;
        var a = new Array();
        var name = el.lastChild.nodeValue;
        var dad = el.parentNode;
        var table = dad.parentNode.parentNode;
        var up = table.up;
        var node, arrow, curcol;
        for (var i = 0; (node = dad.getElementsByTagName("td").item(i)); i++) {
            if (node.lastChild.nodeValue == name){
                curcol = i;
                if (node.className == "curcol"){
                    arrow = node.firstChild;
                    table.up = Number(!up);
                }else{
                    node.className = "curcol";
                    arrow = node.insertBefore(document.createElement("img"),node.firstChild);
                    table.up = 0;
                }
                arrow.src = img_dir + table.up + ".gif";
                arrow.alt = "";
            }else{
                if (node.className == "curcol"){
                    node.className = "";
                    if (node.firstChild) node.removeChild(node.firstChild);
                }
            }
        }
        var tbody = table.getElementsByTagName("tbody").item(0);
        for (var i = 0; (node = tbody.getElementsByTagName("tr").item(i)); i++) {
            a[i] = new Array();
            a[i][0] = getConcatenedTextContent(node.getElementsByTagName("td").item(curcol));
            a[i][1] = getConcatenedTextContent(node.getElementsByTagName("td").item(1));
            a[i][2] = getConcatenedTextContent(node.getElementsByTagName("td").item(0));
            a[i][3] = node;
        }
        a.sort(_sort);
        if (table.up) a.reverse();
        for (var i = 0; i < a.length; i++) {
            tbody.appendChild(a[i][3]);
        }
    }

    // ф-ция инициализации всего процесса
    function init(e) {
        if (!document.getElementsByTagName) return;

        for (var j = 0; (thead = document.getElementsByTagName("thead").item(j)); j++) {
            var node;
            for (var i = 0; (node = thead.getElementsByTagName("td").item(i)); i++) {
                if (node.addEventListener) node.addEventListener("click", sort, false);
                else if (node.attachEvent) node.attachEvent("onclick", sort);
                node.title = "Нажмите на заголовок, чтобы отсортировать колонку";
            }
            thead.parentNode.up = 0;

            if (typeof(initial_sort_id) != "undefined"){
                td_for_event = thead.getElementsByTagName("td").item(initial_sort_id);
                if (document.createEvent){
                    var evt = document.createEvent("MouseEvents");
                    evt.initMouseEvent("click", false, false, window, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, td_for_event);
                    td_for_event.dispatchEvent(evt);
                } else if (td_for_event.fireEvent) td_for_event.fireEvent("onclick");
                if (typeof(initial_sort_up) != "undefined" && initial_sort_up){
                    if (td_for_event.dispatchEvent) td_for_event.dispatchEvent(evt);
                    else if (td_for_event.fireEvent) td_for_event.fireEvent("onclick");
                }
            }
        }
    }

    // запускаем ф-цию init() при возникновении события load
    var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
    if (root){
        if (root.addEventListener) root.addEventListener("load", init, false);
        else if (root.attachEvent) root.attachEvent("onload", init);
    }
Ответить с цитированием
  #2 (permalink)  
Старый 11.05.2012, 11:48
Новичок на форуме
Отправить личное сообщение для edmundantes Посмотреть профиль Найти все сообщения от edmundantes
 
Регистрация: 26.04.2012
Сообщений: 7

Формат даты dd.mm.yyyy
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2012, 12:22
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

советую вам воспользоваться плагином tablesort, там еще пагинатор есть.
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2012, 12:25
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

ой, у вас даже jquery не используется. ну тогда придётся вам дату переделывать в yyyy.mm.dd, а потом делать parse, а потом уже sort().

могу ошибаться я
Ответить с цитированием
  #5 (permalink)  
Старый 17.05.2012, 09:51
Новичок на форуме
Отправить личное сообщение для edmundantes Посмотреть профиль Найти все сообщения от edmundantes
 
Регистрация: 26.04.2012
Сообщений: 7

Мне в дальнейшем пришлось использовать плагин tablesort (пришлось делать думы а то в том плагине не был учтен такой тип записи даты), т.к. простая перестановка года в начало, а дня в конец записи не помогла решить проблему до конца получалась все равно кривая сортировка.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка таблицы, ячейки которой содержат теги stos Events/DOM/Window 9 05.05.2012 02:21
Сортировка таблицы, подгружаемой ajax Serg-inf AJAX и COMET 2 03.10.2011 14:30
проблема с сортировкой даты rave82 jQuery 3 27.09.2011 01:35
Сортировка таблицы. Atilla Events/DOM/Window 1 07.03.2011 17:03
Сортировка таблицы, при помощи js Prizrak177 Общие вопросы Javascript 10 02.09.2010 12:17