2012-05-06 112 views
17

我正在使用jQuery的可排序標記插件, 該插件維護與li相關的對象數組,其順序與實際項目相同。jQuery排序得到.index()排序前後?

我需要在排序完成時更新數組中項目的順序。

我以爲我只是能夠在開始事件時致電$(ui).index()並在更新事件中調用相同的哪個會給我起始位置和最終位置,但是這兩個調用都返回-1

我該怎麼做?


結構:

<ul> 
<li>here<a class="close">x</a></li> 
<li>are<a class="close">x</a></li> 
<li>some<a class="close">x</a></li> 
<li>tags<a class="close">x</a></li> 
</ul> 

陣列結構:

[{ 
    label: 'here', 
    value: 36, 
    element: '$(the li that this info is about)', 
    index: 0 
}, 
{ 
    label: 'are', 
    value: 42, 
    element: '$(the li that this info is about)', 
    index: 1 
}, 
{ 
    label: 'some', 
    value: 21, 
    element: '$(the li that this info is about)', 
    index: 2 
}, 
{ 
    label: 'tags', 
    value: 26, 
    element: '$(the li that this info is about)', 
    index: 3 
}] 

的JavaScript:

$('ul').sortable({ 
    start: function(event, ui){...}, 
    update: function(event, ui){...} 
}); 
+1

能否請您發佈一些代碼,所以我們有什麼地方開始呢?如果不知道你是什麼用戶,很難引導你,等等。謝謝。 – jmort253

回答

11

如果.index()正在恢復 - 1,這表明你在元素可用於DOM之前發出了這個請求。 你貼錯標籤的選擇,並再次它不存在@通話時間或爲空相對於的.index()函數

+7

你是對的,問題是我需要調用'$(ui.item).index()'而不是'$(ui).index()'! – Hailwood

+5

注意:$(ui.item)是沒有必要的; ui.item.index()會正常工作。 –

2

你可以用每個列表項的一些數據關聯起來,以跟蹤它們,這樣:

<ul id="sortable"> 
<li data-id="1" class="ui-state-default">1</li> 
<li data-id="2" class="ui-state-default">2</li> 
<li data-id="3" class="ui-state-default">3</li> 
</ul> 

然後你可以通過jQuery訪問這個數據是這樣的:

$('ul li:nth-child(0)').data('id'); 
$('ul li:nth-child(1)').data('id'); 
$('ul li:nth-child(2)').data('id'); 
27
 
$(function() { 
    $("#sortable").sortable({ 
     update: function(event, ui) { 
      console.log('update: '+ui.item.index()) 
     }, 
     start: function(event, ui) { 
      console.log('start: ' + ui.item.index()) 
     } 
    }); 
    $("#sortable").disableSelection(); 
});