Trouver le plus proche, élément précédent avec jquery attribut de données spécifiques

voix
46

Cela me trouble pour les quelques heures passées maintenant.

J'ai une table. Au sein de ce tableau que je cherche le plus proche, ligne de tableau précédent avec un attribut de données spécifique. Je fais cette recherche juste après une utilisation réussie de jquery sortable. J'ai essayé presque tout et il vient toujours avec la mauvaise chose.

Voici ce que j'utilise

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

Pour l'essentiel, la variable « newIndex » est censé saisir la nouvelle position de la ligne après avoir été triés, menuLevel est censé saisir l'attribut « niveau de menu » de cette ligne de table et menuId est saisissant un autre attribut de données de cette ligne de table .

Il cherche spécifiquement pour le plus proche, attribut précédent niveau de menu dans les lignes de la table. Donc, si une ligne de tableau avec un attribut niveau de menu 2 est déplacé, il est à la recherche de la ligne de table la plus proche avec un attribut de niveau de menu 1.

Le script triables jquery complet j'utilise si nécessaire

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

Créé 29/10/2013 à 06:35
utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

.prevne retourne l'élément immédiatement précédent, il ne tient pas à la recherche de l'élément le plus proche qui correspond au sélecteur. Utilisez .prevAllpour trouver tous les éléments correspondant à un sélecteur, et ensuite utiliser .first()pour réduire à la première, qui est le plus proche. Et si vous voulez rechercher un spécifique data-menu-levelattribut, il faut le mettre dans le sélecteur; appelant .data("menu-level", 1) ensembles l'attribut, il ne recherche pas pour elle.

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);    
}
Créé 29/10/2013 à 06:40
source utilisateur

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