2010-02-15 20 views
15

Non riesco a trovare come ottenere l'elemento di destinazione con l'interfaccia utente jQuery ordinabile.jQuery ordinabile ottenere 2 elementi da scambiare

$("#pages").sortable({ 
     opacity: 0.6, 
     update: function(event, ui) { 
      var first = ui.item; // First element to swap 
      var second = ???? // Second element to swap 
      swapOnServer(first, second); 
     } 
    }); 

Tutte le opzioni che ho punto all'elemento provato trascinati, ma non quello che viene scambiato con: ui.item[0], event.srcElement, event.toElement.

Inoltre, this punti all'elemento LISTA (OL).

Dire secondo voglio dire seguendo:

ordine originale è:

| 0 | | 2 | |

trasciniamo elemento 1 e rilasciarlo in posizione 3. che finirà con:

| 0 | | 2 | |

Quindi il primo elemento è 1 e il secondo è 3 (ERRATO! Vedere di seguito).

AGGIORNAMENTO: Mi sono reso conto di aver sbagliato. Il nuovo ordine in questo caso sarà.

| 0 | 2 | 3 | |

Di conseguenza la mia domanda non ha davvero senso. Grazie a tutti per l'aiuto. Contrassegnerò il voto e segnerò una risposta.

Quindi la domanda è come ottenere il secondo elemento qui?


La soluzione CORRENTE (in quanto non v'è alcun termine come scambiando in ordinabile) è al di sotto. Usa array temporaneo con ordini.

var prevPagesOrder = []; 
    $("#pages").sortable({ 
     start: function(event, ui) { 
      prevPagesOrder = $(this).sortable('toArray'); 
     }, 
     update: function(event, ui) { 
      var currentOrder = $(this).sortable('toArray'); 
      var first = ui.item[0].id; 
      var second = currentOrder[prevPagesOrder.indexOf(first)]; 
      swapOnServer(first, second); 
     } 
    }); 

Grazie,
Dmitriy.

+3

@Dimitriy, non esiste un "secondo elemento", quindi la tua domanda non è chiara. Se si consente a un utente di prelevare e rilasciare un oggetto in qualsiasi punto dell'elenco, è sufficiente spostare gli indici per fare spazio. Solo se si sposta di un posto verso l'alto o verso il basso, sono interessate solo due voci. Ma se lo prende dalla cima della lista, e lo fa cadere dopo i prossimi tre oggetti, i primi tre elementi della posizione sono tutti influenzati dalla mossa. Nessun "interruttore" si è verificato. Descrivi in ​​modo più dettagliato ciò che devi realizzare. –

+0

Com'è il metodo 'swapOnServer'? –

+0

ha provato la soluzione, sembra questa riga: 'var secondo = currentOrder [prevPagesOrder.indexOf (first)];' dovrebbe essere 'var second = prevPagesOrder [currentOrder.indexOf (first)];' –

risposta

5

Non c'è davvero un "secondo" articolo di per sé. Hai un oggetto e lo stai semplicemente posizionando in un'altra posizione.Gli oggetti attorno ad esso regolano di conseguenza le loro posizioni. Se si desidera ottenere una matrice di tutti gli elementi, è possibile utilizzare il metodo toArray.

6

Provare a utilizzare la funzione serialize che fornisce un hash dell'elenco di elementi nell'ordine.

Se avete solo bisogno la voce che il nuovo elemento go caduto prima di poter fare questo:

$("#pages").sortable({ 
    opacity: 0.6, 
    update: function(event, ui) { 
     var first = ui.item; // First element to swap 
     var second = ui.item.prev(); 
     swapOnServer(first, second); 
    } 
}); 

secondo sarà nullo se la sua all'inizio della lista.

+0

Non c'è molto che posso fare con il tutta la lista Ho solo bisogno di 2 elementi che sono stati scambiati in modo da poter inviare la modifica al server. Non ho bisogno di inviare al server l'intera lista scambiando solo 2 elementi. –

+0

Penso che Dmitriy si riferisca a jQuery UI Sortable, ti riferisci agli ordinabili dell'elemento Interface. – Ben

+0

Aggiornato la mia risposta per mostrarvi come afferrare l'oggetto prima dell'oggetto lasciato cadere. – PetersenDidIt

6

un'occhiata al "scambiabile" plugin jQuery:

http://plugins.jquery.com/project/Swapable

E 'simile a "ordinabili", ma solo due elementi del gruppo selezionato sono colpiti: elemento trascinati uno che vengono scambiati . Tutti gli altri elementi rimangono nelle loro posizioni attuali. Questo plugin è basato sul plugin jQuery esistente "Sortable" ed eredita tutte le opzioni ordinabili.

+0

è il migliore! Vorrei far notare a tutti coloro che cercano di aggiornare il loro codice da ordinabile a scambiabile che è MOLTO IMPORTANTE definire entrambi gli elementi che si desidera trascinare esplicitamente E che la posizione del cursore è al di fuori dei limiti dell'elemento trascinato, in questo modo: '$ ('# my-list'). swappable ({items: 'li', cursorAt: {top: -10}});' altrimenti non funzionerà –

+0

Ma fa schifo che devi installare un altro plugin – Donato

6

È possibile utilizzare draggable e droppable invece di sortable per raggiungere swappable effetto. In pratica, questo sarà simile a questa:

(function() { 
    var droppableParent; 

    $('ul .element').draggable({ 
     revert: 'invalid', 
     revertDuration: 200, 
     start: function() { 
      droppableParent = $(this).parent(); 

      $(this).addClass('being-dragged'); 
     }, 
     stop: function() { 
      $(this).removeClass('being-dragged'); 
     } 
    }); 

    $('ul li').droppable({ 
     hoverClass: 'drop-hover', 
     drop: function (event, ui) { 
      var draggable = $(ui.draggable[0]), 
       draggableOffset = draggable.offset(), 
       container = $(event.target), 
       containerOffset = container.offset(); 

      $('.element', event.target).appendTo(droppableParent).css({opacity: 0}).animate({opacity: 1}, 200); 

      draggable.appendTo(container).css({left: draggableOffset.left - containerOffset.left, top: draggableOffset.top - containerOffset.top}).animate({left: 0, top: 0}, 200); 
     } 
    }); 
}()); 

Demo, http://jsfiddle.net/FZ42C/1/.

Problemi correlati