tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
2150
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    NM78 NM78 ist offline Mitglied
    Registriert seit
    Jul 2008
    Beiträge
    24
    Hallo,

    ich suche eine Möglichkeit Einträge aus einer ul-Liste in eine andere ul-Liste zu ziehen.

    Mit jquery klappt das prinzipiell schon mal super:

    http://jqueryui.com/demos/sortable/#connect-lists

    Allerdings möchte ich, dass man einfach nur den gewünschten Eintrag von einer in die andere Box ziehen braucht (und nicht zwingend auf die entsprechende ul Liste).

    Ich habe mir die Seite so aufgebaut:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <table>
    <tr>
    <td id="linkeSeite">
    <ul id="sortable1" class="connectedSortable">Liste 1....</ul>
    </td>
    <td id="rechteSeite">
    <ul id="sortable1" class="connectedSortable">Liste 2....</ul>
    </td>
    </tr>
    </table>

    Das Beispiel bei jquery zeigt leider nur wie man die Elemente von einer ul-Liste in eine andere ziehen kann indem man diese mit der Maus auf die andere Liste zieht:
    Code :
    1
    2
    3
    
            $("#sortable1, #sortable2").sortable({
                connectWith: '.connectedSortable'
            }).disableSelection();

    Was aber wenn eine Liste erstmal leer ist? Die meisten Nutzer würden das Listenelement einfach in die bis dahin noch leere Box ziehen.

    Wisst Ihr wie das geht?
    Geändert von NM78 (29.06.09 um 16:40 Uhr)
     

  2. #2
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    das Einfachste wäre es, wenn du dann garkeine Listen nimmst...du kannst auch gleich die <td> sortierbar machen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    <table id="sortable" width="300" border="1">
    <colgroup width="50%" span="2"></colgroup>
      <tr>
        <td>
          <div>item#1</div>
          <div>item#2</div>
          <div>item#3</div>
        </td>
        <td></td>
      </tr>
    </table>
    <script type="text/javascript">
    <!--
    $("#sortable td").sortable({
      connectWith: '#sortable td'
      }).disableSelection();
    //-->
    </script>

    Insofern du nicht die Option benötigen solltest, mit den Listen mehrdimensionale Strukturen zusammensortieren zu Lassen, würde das die selbe Funktionalität liefern.
    Da sich aber immer irgendwo in der <tr> ein nicht-leere Zelle befinden würde, bestände nicht das Problem, dass man bei einer leeren Zelle nicht das "Ziel" findet...denn alle Zellen der <tr> haben ja die gleiche Höhe.

    Solltest du jedoch unbedingt die Listen brauchen, müsstest du im Falle, dass eine der Listen leer ist, diese per CSS "strecken", damit der User etwas zum Droppen hat.
     

  3. #3
    NM78 NM78 ist offline Mitglied
    Registriert seit
    Jul 2008
    Beiträge
    24
    Hat das bei Dir funktioniert? Bei mir hats nicht geklappt.

    Hier mal meine neue Version:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
    <head xml:lang="de" lang="de">
    <title>Sortable Test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
     
    <style type="text/css">
    table   {border:1px solid #666;}
    td      {background: #FDB;}
    td div  {background: #FEC;border:solid 1px #AAA;padding: 1px 1px 1px 5px;margin:1px;}
     
    </style>
    <script type="text/javascript">
    $(document).ready(function() {
        
        $("#sortable1, #sortable2").sortable({
            connectWith: '.connectedSortable'
        }).disableSelection();
        
    });
    </script>
    </head>
    <body>
     
    <table width="300px">
    <colgroup width="50%" span="2"></colgroup>
      <tr>
        <td id="sortable1" class="connectedSortable">
          <div>Item#1</div>
          <div>Item#2</div>
          <div>Item#3</div>
          <div>Item#4</div>
          <div>Item#5</div>
        </td>
        <td id="sortable2" class="connectedSortable"></td>
      </tr>
    </table>
     
    </body>
    </html>

    Leider funktioniert das auch nicht. Es scheint, als würde jQuery die einzelnen Elemente noch nicht einmal erkennen.
     

  4. #4
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Jo, klar funktioniert das, sonst hätt ichs nicht gepostet

    Sortable ist Bestandteil von jquery.userinterface

    Du musst da noch 2 weitere Skripte einbinden, da UI nicht Basis-Bestandteil von jQuery ist:
    Code :
    1
    2
    
    <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.core.js"></script>
    <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.sortable.js"></script>
     

  5. #5
    NM78 NM78 ist offline Mitglied
    Registriert seit
    Jul 2008
    Beiträge
    24
    Oh Mann, Sorry! Darauf hätte ich auch allein kommen müssen. Vielen Dank! Funktioniert alles super!
     

  6. #6
    NM78 NM78 ist offline Mitglied
    Registriert seit
    Jul 2008
    Beiträge
    24
    Ich suche eine Möglichkeit Elemente von einer Liste in eine andere Liste zu schieben und diese dabei automatisch alphabetisch zu sortieren.

    Das verschieben zwischen 2 Listen klappt mit jQuery:

    http://jqueryui.com/demos/sortable/#connect-lists


    Aber wie bekommt man es hin alle Elemente automatisch neu (alphabetisch) zu sortieren wenn ein neues hinzu kommt?

    Also eigentlich brauche ich nicht die sortable Funktion bei der man alle Elemente selber sortieren kann. Ich habe sie nur genutzt um auf einfach Weise die Elemente von einer Box in eine andere zu verschieben (ist ja auch eine Art "sortieren").
     

  7. #7
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    du könntest das Sortieren überwachen(sortupdate).
    Wurde etwas sortiert, rufst du eine Callback-Funktion auf, welche den Inhalt der Liste bspw. in einen Array liest, diesen Array sortiert anhand des jeweiligen Kriteriums und daraus eine neue Liste erstellt, womit die bisherige ersetzt wird.
     

  8. #8
    NM78 NM78 ist offline Mitglied
    Registriert seit
    Jul 2008
    Beiträge
    24
    Danke. Das Problem ist, dass ich die sortable Geschichte mit "revert" laufen lasse. Dadurch "fliegt" der Eintrag sozusagen super schick animiert in die andere Liste. Der Event wird aber wahrscheinlich erst danach ausgelöst (bei den CSS Klassen ist es zumindest so). Das würde für den Benutzer wahrscheinlich sehr seltsam aussehen wenn der Eintrag z.B. nach oben fliegt und dann aber plötzlich in der Mitte wieder auftaucht.
     

  9. #9
    Quaese Quaese ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Feb 2004
    Beiträge
    3.451
    Hi,

    das Phänomen, dass das Element nach dem Sortieren plötzlich an einer anderen Stelle auftaucht, hättest du aber auch ohne die revert-Option.

    Du könntest höchstens im update-Event eine weitere Animation anstossen, die die Listenelemente nacheinander ausblendet, die sortierten Elemente einfügt und anschliessend die erneuerte Liste wieder einfadet.

    Ein Beispiel, wie ich mir das vorstelle, habe ich dir hier hochgeladen.

    Ciao
    Quaese
     
    Vielleicht muss man manchmal vom Weg abkommen, um nicht auf der Strecke zu bleiben!
    ----
    Der "Fortsetzungsroman" auf www.leuteforum.de

    New kind to realize large scalable projects with jQuery: jQuery SDK

  10. #10
    NM78 NM78 ist offline Mitglied
    Registriert seit
    Jul 2008
    Beiträge
    24
    Vielen Dank Quaese für die Hilfe! Das funktioniert prima.

    So richtig löst es mein Problem aber nicht. Ich habs wahrscheinlich nicht richtig beschrieben. Der Benutzer soll in der Linken Box ein Element anklicken. In der Rechten Box müsste sofort Platz für das Element geschaffen werden. Wenn er das Element los lässt soll es direkt an die richtige Position gesetzt werden bzw. "fliegen".

    Also ohne, dass die Liste erst ausgeblendet wird. Ich habe in den Listen manchmal über 50 Einträge, wenn das jedes Mal erst ein- und ausgeblendet wird dauert es zu lange, außerdem wird es dann zu unruhig.

    Vielleicht kommt dieses Feature ja mit einem der nächsten Updates. Ebenfalls interessant wäre schon weiter sortieren zu können während ein anderes Element noch an die korrekte Position "fliegt". Im Moment muss man nämlich erst abwarten bis es dort angekommen ist.
     

Ähnliche Themen

  1. jQuery: sortable
    Von Maik20 im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 25.05.11, 22:26
  2. [jQuery] sortable
    Von grünes-huhn im Forum Javascript & Ajax
    Antworten: 7
    Letzter Beitrag: 14.06.10, 18:18
  3. [jQuery] sortable - serialize
    Von mgraf im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 18.05.10, 15:36
  4. jQuery und Sortable = Probleme
    Von MrWong im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 17.03.09, 10:52
  5. Sortable mit jquery
    Von paulee im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 01.01.08, 21:53