【问题标题】:jQuery UI Sortable PositionjQuery UI 可排序位置
【发布时间】:2011-02-28 02:36:27
【问题描述】:

当一个元素在可排序列表中的位置发生变化时,如何跟踪它的位置?

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-sortable


    【解决方案1】:

    您可以使用提供给事件的ui 对象,特别是您想要stop eventui.item property.index(),如下所示:

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

    You can see a working demo here,请记住 .index() 的值是从零开始的,因此您可能需要 +1 以进行显示。

    【讨论】:

    • 作为附加说明,如果您想跟踪移动项目的来源(从位置 0 移动到位置 2),那么您需要在开始时访问 ui.item.index() 值事件并存储该值。
    • 有没有办法在#sortable div 中找到可排序的portlet div-id?
    • 另外,如果您需要使用sort 跟踪在拖动过程中 的位置,您可以使用ui.placeholder.index。索引从位置 1 开始。
    【解决方案2】:

    我不太确定将起始位置存储在哪里,所以我想详细说明 David Boikes 的评论。我发现我可以将该变量存储在 ui.item 对象本身中并在停止函数中检索它,如下所示:

    $( "#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());
        }
    });
    

    【讨论】:

    • 你拯救了我的一天!先生问题,如何使用ajax保存新位置?
    • 为什么他们在可排序的手册页上没有这样的简单示例?在我看到这个之前,我真的没有意识到 start 中的项目能够在 stop 范围内。
    • 我不明白为什么这么常见的功能不是可排序的一部分...
    【解决方案3】:

    使用 update 而不是 stop

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

    更新(事件,用户界面)

    类型:排序更新

    当用户停止排序和 DOM 时触发此事件 位置变了。

    .

    停止(事件,用户界面)

    类型:排序停止

    当排序停止时触发此事件。事件类型:事件

    一段代码:

    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>
    

    【讨论】:

      【解决方案4】:

      根据 jquery 可排序 UI 的官方文档: http://api.jqueryui.com/sortable/#method-toArray

      在更新事件中。使用:

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

      如果你警告或控制这个 var (sortedIDs)。你会得到你的序列。 如果正确,请选择“正确答案”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        • 2013-07-20
        • 1970-01-01
        • 2012-06-23
        相关资源
        最近更新 更多