Het vinden van de dichtstbijzijnde, vorige element met specifieke gegevens attribuut jQuery

stemmen
46

Dit is verontrustend me voor de voorbije paar uur nu.

Ik heb een tafel. Binnen die tabel ik ben op zoek naar de dichtstbijzijnde, vorige tabel rij met een specifieke gegevens attribuut. Ik doe deze zoekopdracht direct na een succesvol gebruik van jQuery sorteerbaar. Ik heb bijna alles geprobeerd en het komt altijd met de verkeerde dingen.

Hier is wat ik gebruik

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

In wezen is de variabele newIndex verondersteld om de nieuwe positie van de rij te pakken nadat gesorteerd, wordt menuLevel verondersteld om de gegevens attribuut menu-level van die tabel rij grijpen, en menuId grijpt een andere data attribuut van die tabel rij .

Het is specifiek op zoek naar de dichtstbijzijnde, vorige menu-level attribuut in de tabel rijen. Dus als een tabel rij met een menu-niveau attribuut van 2 wordt verplaatst, is het op zoek naar de dichtstbijzijnde tafel rij met een menu-niveau attribuut van 1.

De volledige jQuery worden gesorteerd script ik gebruik als dat nodig is

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

De vraag is gesteld op 29/10/2013 om 06:35
user
In andere talen...                            


1 antwoorden

stemmen
2

.prevretourneert alleen de direct voorafgaande element, is het niet blijven zoeken naar de dichtstbijzijnde element dat overeenkomt met de selector. Met .prevAllalle elementen die overeenkomen met een selector te zoeken en gebruiken .first()te beperken tot de eerste, dat is de dichtstbijzijnde. En als je wilt om te zoeken naar een specifieke data-menu-leveleigenschap, die u in de selector te zetten dat; bellen .data("menu-level", 1) sets het attribuut, is het niet zoeken.

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);    
}
antwoordde op 29/10/2013 om 06:40
bron van user

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