2012-11-08 27 views
7

ein Div Scrolling, die innerhalb eines .sortable() Container startet die div ziehen, wenn Sie die Scrollbar loslassenjquery ui sortierbar - klicken Scrollbar bricht es

In der Geige, gibt es 3 verschiedene sortables, 1 davon ist ein Scrollen

ein

http://jsfiddle.net/wnHWH/1/

Bug: auf der Bildlaufleiste klicken und ziehen Sie ihn nach oben oder unten durch den Inhalt zu blättern, wenn Sie die Maustaste loslassen, beginnt die div zu ziehen, die es der Maus folgen macht um, und es gibt keine Möglichkeit, es zu entfernen, ohne die Seite zu aktualisieren.

+1

Eine mögliche Antwort könnte sein, ein Titelelement zu setzen, das als Teil dient, auf den Sie klicken, während Sie den scrollbaren Inhalt getrennt halten – Funkodebat

+0

Ich versuche, das gleiche Problem herauszufinden. Ich habe festgestellt, dass dieses Verhalten in Chrome besteht. Sie können das div von der Maus loslassen, ohne es zu aktualisieren, indem Sie mit der rechten Maustaste klicken und dann woanders klicken. Wenn man in Firefox versucht, nur das div zu scrollen, passiert kein Scrollen, aber es bleibt nicht bei der Maus hängen, wenn man es loslässt. Ich habe IE noch nicht überprüft. – jonhopkins

+0

Ich kann nicht in Chrome oder Safari unter OS X 10.7 repo. Mit welchen Browser/Betriebssystem-Kombinationen geschieht dies? – evanmcdonnal

Antwort

5

Sie können .mousemove Ereignis von jquery wie folgt verwenden:

$('#sortable div').mousemove(function(e) { 
    width = $(this).width(); 
    limit = width - 20; 
    if(e.offsetX < width && e.offsetX > limit) 
     $('#sortable').sortable("disable"); 
    else 
     $('#sortable').sortable("enable"); 
}); 

Ich habe Geige erstellen, die hier http://jsfiddle.net/aanred/FNzEF/ funktioniert. Hoffe es erfüllt Ihre Bedürfnisse.

+0

Das sieht aus wie es nah ist. Wenn ich jedoch der gesamten Menge ein äußeres DIV hinzufüge, mit einer Auffüllung von beispielsweise 50px, werden die Berechnungen versetzt. Kann das behoben werden? –

+0

@LeeTaylor Siehe meine aktualisierte Fiddle Sie müssen die 'pageX' mit' offsetX' ändern. – SubRed

+0

Vielen Dank. Ich werde es später mit meinem Projekt testen. Vielen Dank für Ihre Zeit. –

4

sortable() kann einen Selektor für einen Griff ähnlich wie draggable() angeben. Dann erhalten nur die übereinstimmenden Elemente die Klickereignisse. Sie geben den Griffwähler wie folgt an:

$('#sortable').sortable({handle : '.handle'}); 

Sie haben bereits das meiste, was Sie für den Rest benötigen. Der innere div auf dem überquellenden Element macht einen geeigneten Griff, wie folgt aus:

<div style="height: 200px;overflow:auto"> 
    <div class="handle" style="height: 300;"> 
     blah 
     blah 
     blah 

Dann müssen Sie den sortability alles andere wiederherzustellen. Man könnte meinen, Sie könnten nur diejenigen divs die handle Klasse geben, aber es ist für Kinder suchen, so müssen Sie wie so alle von ihnen wickeln:

<div><div class="handle">asadf</div></div> 

Modified fiddle

+0

Diese Antwort funktioniert perfekt. es bricht nicht, wenn wir auf den Scroller klicken – Rafee

+0

Dies ist die beste Antwort. Die ausgewählte Antwort ist ein Hack und schlägt fehl, wenn Sie beim Scrollen die Maus aus der Scrollleiste ziehen. Sicher, der Hack verhindert das Problem, wenn Sie die Maus innerhalb des Breitenbereichs der von Ihnen angegebenen Bildlaufleiste halten, aber Benutzer tun dies nicht, wenn sie scrollen. Sie bewegen die Maus ziemlich oft weit nach links/rechts von der Bildlaufleiste. –

3

Ergänzung zur SubRed Antwort:


Dies funktionierte perfekt für meine Bedürfnisse. Anstatt jedoch auf die Breite der Scrollbar verlassen 20 Pixel sein (wie oben), habe ich den Code aus:

How can I get the browser's scrollbar sizes?

Dieser den Code ermöglicht verschiedene Scrollbar Breiten auf verschiedene Setups zu handhaben. Der Code wird hier eingefügt für Bequemlichkeit:

function getScrollBarWidth() 
{ 
    var inner = document.createElement('p'); 
    inner.style.width = "100%"; 
    inner.style.height = "200px"; 

    var outer = document.createElement('div'); 
    outer.style.position = "absolute"; 
    outer.style.top = "0px"; 
    outer.style.left = "0px"; 
    outer.style.visibility = "hidden"; 
    outer.style.width = "200px"; 
    outer.style.height = "150px"; 
    outer.style.overflow = "hidden"; 
    outer.appendChild (inner); 

    document.body.appendChild (outer); 
    var w1 = inner.offsetWidth; 
    outer.style.overflow = 'scroll'; 
    var w2 = inner.offsetWidth; 
    if (w1 == w2) w2 = outer.clientWidth; 

    document.body.removeChild (outer); 

    return (w1 - w2); 
} 

Ich habe auch die Breite Wert für die Höhe des Rollbalkens und modifizierten SubRed den Code anzupassen. Dies funktioniert jetzt mit einer oder beiden Bildlaufleisten.

I verwendet auch Code aus:

Detecting presence of a scroll bar in a DIV using jQuery?

Um die Anwesenheit von entweder Bildlaufleiste zu bestimmen, und geeignet ist, das Ein-/Ausschalten entsprechend des sortierbaren Code.

Vielen Dank.

Verwandte Themen