2010-06-05 169 views

回答

270

您可以使用提供給事件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。

+53

作爲附加的註釋,如果你想跟蹤這些移動的項目來自(移動從位置0到位置2)那麼您需要訪問啓動事件中的ui.item.index()值並存儲該值。 – 2012-04-10 14:23:09

+0

有沒有辦法在#sortable div中找到可排序的portlet div-id? – Frank 2013-06-12 12:43:59

+2

i_a做了什麼@David Boike寫道:http://stackoverflow.com/a/12962399/114029 – 2013-12-21 19:02:21

115

我不太清楚我會在哪裏存儲起始位置,所以我想詳細說明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()); 
    } 
}); 
+4

你救了我的一天!先生的問題,我怎樣才能通過使用AJAX保存新的位置? – mrrsb 2013-03-12 00:43:23

+3

爲什麼他們在可排序的手冊頁上沒有這樣的簡單示例?我真的沒有意識到'start'中的項目能夠在'stop'範圍內,直到我看到這個。 – Sablefoste 2015-06-15 22:24:01

+0

我不明白爲什麼這樣的通用功能不是可排序的一部分... – burzum 2017-02-23 12:47:56

10

使用更新代替停止

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

更新(事件,UI)

類型:sortupdate

當用戶停止排序並且DOM 位置發生更改時,將觸發此事件。

停止(事件,UI)

類型:sortstop

此事件排序時已經停止被觸發。事件類型:事件

一段代碼:

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>