Å finne den nærmeste, forrige element med spesifikke data attributt jquery

stemmer
46

Dette har vært problema meg de gått noen timer nå.

Jeg har en tabell. Innenfor denne tabellen jeg leter etter den nærmeste, tabellen rad med en bestemt data attributt. Jeg gjør dette søket rett etter en vellykket bruk av jQuery sorterbar. Jeg har prøvd nesten alt, og det kommer alltid opp med feil ting.

Her er hva jeg bruker

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);    
}

I hovedsak er den variable newIndex ment for å gripe den nye posisjonen for rad etter å ha blitt sortert, er menuLevel ment for å ta tak i data attributten menynivå av den tabellraden, og menuId er flytte til en annen data egenskap av tabellraden .

Det er spesielt på jakt etter nærmeste, forrige menynivå attributt i tabellradene. Så hvis en tabell rad med en meny-nivå egenskap av 2 flyttes, er det på jakt etter den nærmeste raden med et menynivå egenskap av en.

Den fulle jquery sorterbar script jeg bruker ved behov

$(#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

Publisert på 29/10/2013 klokken 05:35
bruker
På andre språk...                            


1 svar

stemmer
2

.prevreturnerer bare det umiddelbart foregå element, betyr det ikke holde utkikk etter den nærmeste element som samsvarer med velgeren. Bruk .prevAllfor å finne alle de elementene som sams en velger, og deretter bruke .first()til å begrense det ned til den første, som er den nærmeste. Og hvis du vil søke etter en bestemt data-menu-levelegenskap, må du sette det i velgeren; ringer .data("menu-level", 1) sett attributtet, betyr det ikke søke etter den.

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);    
}
Svarte 29/10/2013 kl. 05:40
kilden bruker

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