2012-05-14 5 views
5

Ich versuche mit jQuery ein Element von einem Ort zu einem anderen im DOM zu verschieben. Es gibt Elemente, die mit dem Ursprungscontainer daneben identisch sind. Wie kann ich den genauen vorherigen Speicherort speichern, damit er dorthin zurückkehrt? Hier ist ein Beispiel ...jQuery - Element verschieben und an die genaue vorherige Position zurückkehren?

<div class="container"></div> 
<ul> 
    <li></li> 
    <li><div class="move">Content</div></li> 
    <li></li> 
    <li><div class="move">Content</div></li> 
    <li></li> 
</ul> 

... die „move“ divs individuell auf den „Container“ div bewegen, dann wieder in ihre vorherige Position auf einer Veranstaltung über jQuery .appendTo(). Wie stelle ich sicher, dass jedes "move" -Div an seinen exakten vorherigen Speicherort zurückkehrt, indem erkannt wird, von wo es verschoben wurde (die genaue Position im DOM relativ zum Dokument oder ein anders angegebener übergeordneter Container)?

BEARBEITEN: Ich habe die Klassen auf den Divs korrigiert, da der spezifische Fall, mit dem ich arbeite, die Listenelemente exakte Duplikate von einander (strukturell) mit einzigartigem Inhalt innerhalb ihrer jeweiligen Elemente hat. Das Ereignis, um ein "move" -Div an seinen ursprünglichen Ort zurück zu bewegen, ist ein Knopf, der darin geklickt wird. Wie weiß das bewegte Element, wohin es zurück bewegt werden soll (genauer, wie weiß es, welches Listenelement in der Liste ist)?

+0

Wenn Sie bessere Antworten als die, die Sie bereits haben, möchten, sollten Sie Ihren HTML-Code aktualisieren, um zu repräsentieren, was Sie fragen. Erstens, wenn Sie "Elemente, die mit dem ursprünglichen Container identisch sind" haben, können Sie dann 2 Container anzeigen.Wenn in Ihrem Dokument "die Listenelemente exakt identische Duplikate sind", entfernen Sie ihre eindeutigen Klassen. –

+0

@ FabrícioMatté Fertig, danke für den Vorschlag. – Charles

+0

Ich würde auch eine Antwort auf Ihre Frage geben, aber mit diesem HTML ist es schwer zu sagen, was Sie genau erwarten. –

Antwort

1

Bevor Sie das Element verschieben, speichern Sie es .parent() in einer Variablen, dann verwenden Sie .append() oder , um es zurückzugeben, wenn Sie bereit sind.

+0

Richtige Antwort, ich wusste nicht, dass '.parent()' den relativen Index des verschachtelten Elements speichern würde, von dem Sie es aufrufen. Wirklich nützliche Infos, ich werde es auch bald +1 geben. –

+0

Ich habe einen [fiddle] (http://jsfiddle.net/ult_combo/BTKex/) erstellt, um die Funktionalität Ihres Codes zu überprüfen. Ich bin sicher, dass Ihr Code in Zukunft nützlich sein wird. –

+0

Dies funktioniert nicht, da die Frage des Operators "Es gibt Elemente, die mit dem ursprünglichen Container identisch sind" ist. Wenn Sie einfach das übergeordnete Element speichern, wird die Position des Elements * in * dem übergeordneten Element nicht beibehalten. – Madbreaks

3

Sie können sie clone, append sie, und schließlich hide das Original div, und im Gegenzug remove das geklonte div und show das Original.

+0

Genau die gleiche Antwort wie ich tippte. Denke, das ist die beste Methode. – Anonymous

+1

Sieht gut aus, wenn OP jedoch alle Elemente durchlaufen muss, z. Um die Daten zu erfassen und an eine andere Seite zu senden, müsste er einen Haken mit '.is (': visible') hinzufügen. –

+0

@ Fabrício Matté Ich denke nicht, dass der Inhalt eines Div ist nützlich, um auf db gespeichert werden. – undefined

2

Unten ist was ich getan habe. Dein Beitrag lässt einige wichtige Details aus, damit ich rate und hoffe, dass sie auf deine Situation angewendet werden.

Ich rate mal, Sie haben einen Klick-Handler auf die div.move Elemente, die sie in die container div bewegt.

CSS:

.placeholder { display:none; } 

JS:

var id, 
    gid = 0; 

$('.move').click(function(e){ 
    if(!$(this).parents('.container')){ 
     // Move to container 
     id = 'placeholder-' + gid++; 
     $(this) 
      .before('<div class="placeholder ' + id + '"></div>') // Save a DOM "bookmark" 
      .appendTo('.container')        // Move the element to container 
      .data('placeholder', id);        // Store it's placeholder's info 
    } 
    else{ 
     // Move back out of container 
     $(this) 
      .appendTo('.placeholder.' + $(this).data('placeholder')) // Move it back to it's proper location 
      .unwrap()        // Remove the placeholder 
      .data('placeholder', undefined);  // Unset placeholder data 
    } 
}); 

Ihre HTML wie dies nach dem Klicken auf den ersten div.move aussehen:

<div class="container"> 
    <div class="move>Content</div> 
</div> 
<ul> 
    <li></li> 
    <li><div class="placeholder placeholder-0"></div></li> 
    <li></li> 
    <li><div class="move">Content</div></li> 
    <li></li> 
</ul> 

Ich habe diese Arbeit, obwohl die oben

Code ist nicht getestet. Hoffentlich vermittelt es die Idee. Ich mag an diesem Ansatz:

  1. Vervielfältigung von Elementen (die Anforderungen eindeutige ID brechen kann, zum Beispiel)
  2. Minimal DOM Auswirkungen
  3. Events und Handler auf bewegte Gegenstände bleiben intakt, sind aber nicht
  4. dupliziert

Ist es perfekt? Nein, aber es funktioniert gut und ist ziemlich sauber. YMMV.

Prost

+1

Downvoter, um zu erklären? – Madbreaks