2011-12-14 7 views
16

Ho un'interfaccia utente jQuery trascinabile, e ho provato a creare un helper personalizzato che conterrebbe alcune ma non tutte le informazioni dell'elemento originale.Helper personalizzato per UI jQuery Draggable

Ecco i miei elementi trascinabili;

<ul> 
    <li><div>Name</div> <span>12-12-2011</span></li> 
    <li><div>Another name</div> <span>12-12-2011</span></li> 
</ul> 

E jQuery;

$("ul li").draggable(function(){ 
    helper: function(){ 
    return $("<div></div>"); 
    } 
}); 

L'idea sarebbe che durante il trascinamento, l'utente avrebbe un supporto che contiene solo il nome, ma non l'elemento tempo.

Il mio codice effettivo è leggermente più complesso di questo anche, quindi quello che sto davvero cercando è un selettore che mi permetta di selezionare l'elemento originale, o una copia di esso, e quindi fare tutti i tipi di magia jQuery su di esso (elementi filtranti, aggiunta di nuovi elementi, classi, ecc.)

Tuttavia, per la mia vita non riesco a trovarlo, la documentazione di trascinamenti trascinabili e nessuno a #jquery mi aiuterebbe. Qualche idea?

Grazie in anticipo!

+0

È necessario che anche l'elemento scenda? Il mio primo tentativo di risposta fornisce gli stessi risultati degli altri in quanto è personalizzato trascinato, ma non consentirebbe il rilascio. Quindi ho trovato un modo per aggirare anche il calo. Non è necessario spostare effettivamente l'elemento originale? – musefan

+0

Non ho bisogno di spostare l'elemento originale, quello che sto cercando è una specie di clone personalizzato. –

+0

Ehi, vorrei sapere come si riposiziona il clone personalizzato dopo quello? Per esempio, ho un elemento, 500x200 e ho bisogno che sia 175x50 mentre lo trascino, quindi uso helper con una funzione che restituisce una sorta di "clone personalizzato" in 175x50 ma quando inizio a trascinare, il mio elemento clonato inizia da l'angolo in alto a sinistra dell'elemento completo, indipendentemente da dove si trova il cursore ... Qualche soluzione? – KeizerBridge

risposta

31

In primo luogo il modo di chiamare draggable è difettoso. Il parametro previsto è un oggetto letterale, non una funzione.

this è l'elemento attualmente trascinato nella funzione helper.

Avere il seguente codice HTML

<ul> 
    <li><div class="name">Name</div> <span>12-12-2011</span></li> 
    <li><div class="name">Another name</div> <span>12-12-2011</span></li> 
</ul> 

Si può fare questo:

$('ul li').draggable({ 
    helper: function() { 
     //debugger; 
     return $("<div></div>").append($(this).find('.name').clone()); 
    } 
}); 

Nota: ho aggiunto classe al <div> che rappresenta il nome per il gusto di selezione, ma è possibile trovare qualsiasi altro modo per farlo.

Ecco uno jsfiddle da controllare.

+0

Grazie, questo ha fatto il trucco! Tuttavia, mi piacerebbe sapere di più sul bizzarro modo in cui questo sembra funzionare. Ad esempio, salvare $ (this) .find ('. Name') in una variabile come in qualsiasi altra parte di jQuery, al fine di richiamare funzioni aggiuntive su di esso non sembra funzionare qui. Perché? –

+0

Non sono sicuro di capire. Nell'ambito della funzione di supporto intendi? Potresti forgiare il mio violino e modificare il javascript per illustrare? –

9

OK, con un test rapido di seguito funzionerà ....

$("ul li").draggable({ 
    helper: function() { 
     return $("<div>hello</div>"); 
    } }); 

preavviso non si passa una funzione come parametro trascinabile. Inoltre, ho aggiunto "ciao" all'esempio in modo che il DIV helper contenga effettivamente qualcosa.

EDIT: Questo sembra per evitare che l'elemento che è caduto, hmmm ...

A FIX: Non abbastanza, ma questo funziona, forse può dare alcune idee per il miglioramento ...

var remember; 
$("ul li").draggable({ 
    helper: 'original', 
    start: function(e, ui) { 
     remember = $(this).html(); 
     $(this).html("<div>hello</div>"); 
    }, 
    stop: function(e, ui) { 
     $(this).html(remember); 
    } 
}); 

Example Here

Se non ti piace l'idea di "ricordare" variabile sembra essere ok per aggiungere un'opzione personalizzata per l'oggetto trascinabile che ca n tenere l'HTML originale ...

$("ul li").draggable({ 
    helper: 'original', 
    start: function(e, ui) { 
     $(this).draggable("option", "olddata", $(this).html()); 
     $(this).html("<div>hello</div>"); 
    }, 
    stop: function(e, ui) { 
     $(this).html($(this).draggable("option", "olddata")); 
    } 
}); 
3

Una possibile soluzione è

Fiddle: http://jsfiddle.net/SWbse/

$(document).ready(function() { 
     $("ul li").draggable({ 
     helper: 'clone', 
     start: function(event, ui){ 
      ui.helper.children('span').remove(); 
     }  
    }); 
    });