Posição Classificável da UI do jQuery

146

Como rastreio a posição de um elemento quando sua posição em uma lista classificável é alterada?

Jiew Meng
fonte

Respostas:

296

Você pode usar o uiobjeto fornecido para os eventos, especificamente deseja o stopevento , a ui.itempropriedade e .index(), assim:

$("#sortable").sortable({
    stop: function(event, ui) {
        alert("New position: " + ui.item.index());
    }
});

Você pode ver uma demonstração funcional aqui , lembre-se de que o .index()valor é baseado em zero; portanto, você pode marcar com +1 para fins de exibição.

Nick Craver
fonte
60
Como observação adicional, se você deseja rastrear a origem do item movido (mover da posição 0 para a posição 2), acesse o valor ui.item.index () no evento inicial e armazene esse valor.
David Boike
Existe uma maneira de encontrar portlets classificáveis ​​div-id dentro de #sortable div?
24413 Frank
Além disso, se você precisar rastrear a posição durante o arrasto com sort, poderá usar ui.placeholder.index. O índice começa na posição 1. #
Loïc Pennamen
127

Eu não tinha certeza de onde armazenaria a posição inicial, então quero elaborar um comentário sobre David Boikes. Eu descobri que podia armazenar essa variável no próprio objeto ui.item e recuperá-la na função stop da seguinte forma:

$( "#sortable" ).sortable({
    start: function(event, ui) {
        ui.item.startPos = ui.item.index();
    },
    stop: function(event, ui) {
        console.log("Start position: " + ui.item.startPos);
        console.log("New position: " + ui.item.index());
    }
});
I a
fonte
5
Você salva meu dia! Senhor pergunta, como posso salvar a nova posição usando ajax?
mrrsb
5
Por que eles não têm um exemplo simples como este nas páginas de manual classificáveis? Eu realmente não sabia que os itens starteram capazes de estar no stopescopo até que vi isso.
Sablefoste
1
Eu não entendo por que uma funcionalidade tão comum não faz parte do classificáveis ...
burzum
14

Use atualização em vez de parar

http://api.jqueryui.com/sortable/

update (evento, interface do usuário)

Tipo: sortupdate

Este evento é acionado quando o usuário parou de classificar e a posição do DOM mudou.

.

stop (evento, interface do usuário)

Tipo: sortstop

Este evento é acionado quando a classificação é interrompida. Tipo de evento: Evento

Parte do código:

http://jsfiddle.net/7a1836ce/

<script type="text/javascript">

var sortable    = new Object();
sortable.s1     = new Array(1, 2, 3, 4, 5);
sortable.s2     = new Array(1, 2, 3, 4, 5);
sortable.s3     = new Array(1, 2, 3, 4, 5);
sortable.s4     = new Array(1, 2, 3, 4, 5);
sortable.s5     = new Array(1, 2, 3, 4, 5);

sortingExample();

function sortingExample()
{
    // Init vars

    var tDiv    = $('<div></div>');
    var tSel    = '';

    // ul
    for (var tName in sortable)
    {

        // Creating ul list
        tDiv.append(createUl(sortable[tName], tName));
        // Add selector id
        tSel += '#' + tName + ',';

    }

    $('body').append('<div id="divArrayInfo"></div>');
    $('body').append(tDiv);

    // ul sortable params

    $(tSel).sortable({connectWith:tSel,
       start: function(event, ui) 
       {
            ui.item.startPos = ui.item.index();
       },
        update: function(event, ui)
        {
            var a   = ui.item.startPos;
            var b   = ui.item.index();
            var id = this.id;

            // If element moved to another Ul then 'update' will be called twice
            // 1st from sender list
            // 2nd from receiver list
            // Skip call from sender. Just check is element removed or not

            if($('#' + id + ' li').length < sortable[id].length)
            {
                return;
            }

            if(ui.sender === null)
            {
                sortArray(a, b, this.id, this.id);
            }
            else
            {
                sortArray(a, b, $(ui.sender).attr('id'), this.id);
            }

            printArrayInfo();

        }
    }).disableSelection();;

// Add styles

    $('<style>')
    .attr('type', 'text/css')
    .html(' body {background:black; color:white; padding:50px;} .sortableClass { clear:both; display: block; overflow: hidden; list-style-type: none; } .sortableClass li { border: 1px solid grey; float:left; clear:none; padding:20px; }')
    .appendTo('head');


    printArrayInfo();

}

function printArrayInfo()
{

    var tStr = '';

    for ( tName in sortable)
    {

        tStr += tName + ': ';

        for(var i=0; i < sortable[tName].length; i++)
        {

            // console.log(sortable[tName][i]);
            tStr += sortable[tName][i] + ', ';

        }

        tStr += '<br>';

    }

    $('#divArrayInfo').html(tStr);

}


function createUl(tArray, tId)
{

    var tUl = $('<ul>', {id:tId, class:'sortableClass'})

    for(var i=0; i < tArray.length; i++)
    {

        // Create Li element
        var tLi = $('<li>' + tArray[i] + '</li>');
        tUl.append(tLi);

    }

    return tUl;
}

function sortArray(a, b, idA, idB)
{
    var c;

    c = sortable[idA].splice(a, 1);
    sortable[idB].splice(b, 0, c);      

}
</script>
user3439968
fonte
4

De acordo com a documentação oficial da interface do usuário classificável do jquery: http://api.jqueryui.com/sortable/#method-toArray

No evento de atualização. usar:

var sortedIDs = $( ".selector" ).sortable( "toArray" );

e se você alertar ou consolar esse var (IDs classificados). Você receberá sua sequência. Por favor, escolha como a "Resposta certa" se for a correta.

rahim.nagori
fonte