jQuery UI-Schieberegler - Wählen Sie überlappende Schieberegler basierend auf der Ziehrichtung aus

8

Ich habe dieses einfache jQuery UI Slider-Setup mit einem Bereich und zwei Standardwerten, die sich überlappen. Die ganze Sache (mit ein paar Schnickschnack) kann in diesem Spiel gefunden werden: Ссылка

%Vor%

Das Problem dabei ist, dass beim Versuch, den einzelnen sichtbaren Anfasser nach rechts zu ziehen, dies fehlschlägt, weil jQuery UI immer den minimalen Anfasser oben platziert. Dies ist offensichtlich aus einer Reihe von Gründen schlecht.

Gibt es eine Möglichkeit, jQuery UI zu erlauben, auszuwählen, welcher Ziehpunkt in welche Richtung gezogen werden soll?

    
Yi Jiang 21.11.2010, 18:23
quelle

7 Antworten

6

Ah, ich mag es, durch 11k libs zu essen, nicht wahr? :)

Hinweis: Folgendes ist für jQuery UI 1.8.5

Wie auch immer, hier ist eine ziemlich saubere Lösung:

%Vor%

Und das ist alles, oh, wie es funktioniert, natürlich:

  1. Speichern Sie den Anfangsmausoffset sowie den Wert des anfänglich ausgewählten Handles
  2. Beim Ziehen vergleichen Sie den alten Wert mit dem aktuellen Wert des aktiven Handles und prüfen Sie, ob die Startposition gültig ist
  3. Falls es keinen Unterschied gibt, prüfen wir, ob es einen Unterschied geben würde, wenn das aktive Handle weiter gezogen werden könnte
  4. Wenn das der Fall ist, prüfen wir, ob beide Handles den gleichen Wert haben, das heißt, sie liegen übereinander
  5. Jetzt prüfen wir, ob das aktuell ausgewählte Handle noch nicht gezogen wurde
  6. Und schließlich, wenn alles stimmt, wechseln wir die Handles
  7. Falls der Benutzer nun den Wert ändert, wird unsere Startposition ungültig, so dass kein Wechsel mehr zwischen den Handles
  8. stattfindet

Und zu Ihrem Vergnügen hier ist ein diff :

%Vor%

Speichere es in ui.diff und tue patch -i ui.diff jquery-ui.js .

    
Ivo Wetzel 22.11.2010 19:36
quelle
4

Ich entschuldige mich bei Ivo, dessen ausgezeichnete Antwort da bin ich mir sicher sehr anstrengen müssen. Das Problem ist, dass ich diese Lösung nicht anwenden konnte, weil ich bereits auf 1.8.6 bin, ich kann die 1.8.5-Quellen nirgendwo finden, wo ich sie anwenden könnte, und irgendwie konnte ich den Patch nicht zum Laufen bringen für 1.8.6, auch wenn ich versuchte, die Zeilen manuell hinzuzufügen.

Das Folgende ist meine Lösung für das Problem. Es ist einfacher als das von Ivo, aber das könnte an den Unterschieden zwischen den beiden Point-Releases liegen. Die Lösung ist wie folgt:

  1. Splice in einer zusätzlichen Variable, um die ursprünglichen Werte zu verfolgen
  2. Wenn die Bedingungen erfüllt sind (zwei Handles, gleicher Wert, neuer Wert größer als der aktuelle Wert), wird eine interne Variable ( _handleIndex ) umgedreht, wodurch das maximale Handle als Referenz für das interne _slide verwendet wird. Funktion anstelle der ersten.

Das diff ist wie folgt:

%Vor%

Der erste Teil sollte in den Initialisierungsbereich eingefügt werden, wo die Variablen deklariert werden, der zweite in die _mouseCapture -Funktion direkt vor dem Aufruf von _slide und der letzte Teil in die _mouseDrag -Funktion, auch rechts vor dem Aufruf von _slide .

Hier ist ein funktionierendes Beispiel mit dem Patch: Ссылка

Eine Kopie der gepatchten jQuery UI 1.8.6 Slider-Datei finden Sie hier: Ссылка

Wie immer wurde dieser Patch nicht ausführlich getestet und es ist nicht garantiert, dass er für alle Szenarien funktioniert.

    
Yi Jiang 23.11.2010 10:14
quelle
2

Ich würde sagen, das ist ein Fehler, doppelt, weil es bereits Logik gibt, die verhindert, dass ein "Deadlock" eintritt, wenn sich beide Schieberegler an der minimalen / weit linken Position befinden:

%Vor%

Es sieht so aus, als ob Ticket # 3736 noch offen ist, und erwähnt das spezifische Problem, das Sie sehen.

    
Stéphan Kochen 22.11.2010 18:25
quelle
2

Ich habe Yi Jiangs Lösung versucht mit 1.8.12 und es brach auf einem Slider mit einem einzigen Griff, aber funktionierte perfekt, nachdem ich

geändert habe %Vor%

bis

%Vor%     
user740367 05.05.2011 16:37
quelle
2

Setzen Sie dies in den Initialisierungsbereich, in dem die Variablen deklariert sind:

%Vor%

Setzen Sie dies direkt vor dem Aufruf von _mouseCapture :

in die Funktion _slide %Vor%

Und das in die Funktion _mouseDrag , auch direkt vor dem Aufruf von _slide

%Vor%

Ich habe gerade einen else if zum obigen Code hinzugefügt; es funktioniert gut in jQuery 1.8.14 für beide linken und rechten Button-Handler.

    
senthil sugumar 01.07.2013 13:30
quelle
1

Eine andere Lösung: Testen Sie beide Werte, und wenn sie identisch sind, kehren Sie zum letzten Schritt zurück.

%Vor%     
Krijn Swinnen 09.10.2011 21:32
quelle
1

Hier ist eine neue Version für jQuery UI 1.10.2

Patch-Datei: Ссылка

Komplette Datei: Ссылка

    
Greg 17.04.2013 09:39
quelle