Wie setze ich scrollLeft mit defineSetter korrekt in zwei Objekte?

8

In meiner Seite habe ich zwei Tabellen gleicher Breite, und beide tun horizontale Scroll. Ich muss beide Tabellen auf die gleiche Position setzen, wenn jeder scrollt.

Eigentlich ist mein Code:

%Vor%

Es funktioniert. Das Problem ist, dass es Situationen gibt, in denen die geladenen Daten groß genug sind, um den Browser und das Scroll-Ereignis zu verlangsamen.

Dann versuche ich, die Benutzererfahrung in diesen Situationen zu verbessern.

Ich habe dieses Snippet gemacht, wo ich versuche, die Funktion __defineSetter__ von Object :

zu verwenden

%Vor%

Wie Sie jedoch sehen können, wird das Snippet ausgeführt. Es setzt undefined auf elementA.scrollLeft und NaN auf elementB.scrollLeft .

Ich hätte gerne eine Anleitung hier, danke für Ihre Zeit.

    
Washington Guedes 14.07.2016, 21:13
quelle

3 Antworten

2

Scroll-Ereignisse können mit hoher Geschwindigkeit ausgelöst werden, so dass Sie durch das Drosseln des Scroll-Ereignishandlers glatter scrollen können, wie trincot in seiner Antwort sagte. Sie können eine Funktion mit setTimeout drosseln. Wenn ich Dinge auf dem Bildschirm verschiebe oder andere sichtbare Effekte behandle, bevorzuge ich requestAnimationFrame .

requestAnimationFrame führt den Callback vor dem nächsten Repaint aus, so dass der Browser einige Optimierungen vornehmen kann.

Dieser Code bringt Sie näher an die Lösung heran, sie basiert auf diesem Beispiel aus MDN :

%Vor%

Sie können den Zeitstempel verwenden, der an den Callback übergeben wird, um die Synchronisation weiter zu entprellen, aber Sie können mit einem etwas trägen Scroll in der zweiten Tabelle enden, wenn Sie zu viel Verzögerung setzen.

    
jbmartinez 23.07.2016, 17:07
quelle
2

Ihr Aufruf an __defineSetter__ ersetzt die Eigenschaft scrollLeft durch eine mit demselben Namen, was bedeutet, dass Sie nicht mehr zur ursprünglichen Eigenschaft gelangen. Sobald Sie __defineSetter__ aufgerufen haben, wird jedes Lesen der Eigenschaft in undefined :

angezeigt %Vor%

Der Browser ändert auch nicht den Wert scrollLeft über eine Zuweisung, wie dies bei JavaScript der Fall ist. Daher wird die Setter-Funktion während eines Bildlaufereignisses nicht aufgerufen. Sie können dies überprüfen, indem Sie ein console.log in die Setter-Funktion einfügen: Beim Scrollen wird nichts angezeigt:

%Vor%

Aus den beiden oben genannten Gründen besteht keine Hoffnung, dass Sie Scrollen mit __defineSetter__ erfassen können. Sie müssen das scroll -Ereignis wie zuvor hören.

Sie können bessere Ergebnisse erzielen, wenn Sie die Synchronisierung asynchron durchführen und einige der Aktualisierungen überspringen, wenn viele Scroll-Ereignisse auftreten:

%Vor%

Wenn der Browser jetzt mehr als ein Bildlaufereignis sofort generiert, löscht das zweite die geplante Aktualisierung von scrollB[0].scrollLeft : Das clearTimeout verhindert, dass dieses Update ausgeführt wird, und das nächste wird stattdessen geplant.

Sie könnten mit dem Verzögerungsargument von setTimeout spielen, um die richtige Balance zu finden:

Wenn Sie die Verzögerung erhöhen, wird verhindert, dass Ereignisse sich stapeln, und scrollB synchronisiert sich dann reaktionsschneller, aber es werden weniger Aktualisierungen an den scrollB vorgenommen scrollLeft Eigenschaft, die es weniger fließend scrollen lässt.

    
trincot 16.07.2016 22:38
quelle
0

Tu es nicht. Mach es zu einem Tisch. Halte es einfach. Siehe Beispiel.

%Vor%
    
Ron Royston 23.07.2016 17:15
quelle

Tags und Links