Поиск ближайшего предыдущего элемента, со специфическим атрибутом данных JQuery

голоса
46

Это беспокоило меня за прошедшие несколько часов в настоящее время.

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

Вот что я использую

var newIndex = ui.item.index();
var menuLevel = parseInt($(#menu-table).find([data-menu-nesting=' + newIndex + ']).attr(data-menu-level));
var menuId = $(#menu-table).find([data-menu-nesting=' + newIndex + ']).attr(data-menu-id);

if (menuLevel == 2) {
    var findAboveRowName = $(.menu-table-rows[data-menu-nesting=' + newIndex + ']).prev(.menu-table-rows).data(menu-level,1).attr(data-menu-name);
    alert(findAboveRowName);    
}
if (menuLevel == 3) {
    var findAboveRowName = $(.menu-table-rows[data-menu-nesting=' + newIndex + ']).prev(.menu-table-rows).data(menu-level,2).attr(data-menu-name);
    alert(findAboveRowName);    
}

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

Это специально ищет ближайший предыдущий атрибут, меню уровня в строках таблицы. Таким образом, если строка таблицы с атрибутом меню уровня 2 перемещается, он ищет ближайшую строку таблицы с атрибутом меню уровня 1.

Полный JQuery сортировкой скрипт я использую при необходимости

$(#sortable).sortable({
                update: function(event, ui) {
                    var serial = $('#sortable').sortable('serialize');
                    var newIndex = ui.item.index();
                    var menuLevel = parseInt($(#menu-table).find([data-menu-nesting=' + newIndex + ']).attr(data-menu-level));
                    var menuId = $(#menu-table).find([data-menu-nesting=' + newIndex + ']).attr(data-menu-id);
                    if (menuLevel == 2) {
                        var findAboveRowName = $(.menu-table-rows[data-menu-nesting=' + newIndex + ']).prev(.menu-table-rows).data(menu-level,1).attr(data-menu-name);
                        alert(findAboveRowName);
                        // $.post(./menu-controller.php, { adjustParent: true, id: menuId, parent: findAboveRowName });
                    }
                    if (menuLevel == 3) {
                        var findAboveRowName = $(.menu-table-rows[data-menu-nesting=' + newIndex + ']).prev(.menu-table-rows).data(menu-level,2).attr(data-menu-name);
                        alert(findAboveRowName);
                        // $.post(./menu-controller.php, { adjustParent: true, id: menuId, parent: findAboveRowName });
                    }
                    $.ajax({
                    url: ./menu-controller.php,
                    type: post,
                    data: serial,
                    success: function() {
                        $(#sortable).load(./menu-manager.php #menu-table, function() {
                            $.get('./menu-admin.js');
                        });
                },
                    error: function(){
                        alert(A problem occurred when moving this menu item. Please try again or contact support.);
                    }
                    });
                },
            handle:'.move-item',
            connectWith:'#menu-table',
            placeholder: highlight,
            containment: parent,
            revert: true,
            tolerance: pointer,
            items: 'tbody > *'
});

JSFIDDLE

Задан 29/10/2013 в 06:35
пользователем
На других языках...                            


1 ответов

голоса
2

.prevтолько возвращает немедленно предыдущий элемент, он не держит ищет ближайший элемент , который соответствует селектору. Используйте , .prevAllчтобы найти все элементы , совпадающие с селектором, а затем использовать , .first()чтобы сузить ее до первого, который является ближайшим. И если вы хотите , чтобы выполнить поиск конкретного data-menu-levelатрибута, вы должны положить , что в селекторе; вызова .data("menu-level", 1) устанавливает атрибут, не искать.

if (menuLevel == 2) {
    var findAboveRowName = $(".menu-table-rows[data-menu-nesting='" + newIndex + "']").prevAll(".menu-table-rows[data-menu-level=1]").first().data("menu-name");
    alert(findAboveRowName);    
}
Ответил 29/10/2013 в 06:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more