2012-06-12 6 views
18

Gibt es eine JavaScript-Bibliothek, die eine riesige Liste effizient lädt, indem sie nur den sichtbaren Teil der Liste lädt und die Bildlaufleiste vortäuscht?Effizient große Liste in HTML anzeigen

<div id='container'> 
    <!-- Empty but height is set to take up space to fake scrollbar --> 
    <div id='hidden-before'></div>  

    <!-- Preloaded in case the user scrolls up --> 
    <div id='preload-before'></div> 

    <!-- User can see this. Height == #container's height --> 
    <div id='viewable-section'></div> 

    <!-- Preloaded in case the user scrolls down --> 
    <div id='preload-after'></div> 

    <!-- Empty but height is set to take up space to fake scrollbar --> 
    <div id='hidden-after'></div>  
</div> 

Google Text & Tabellen zum Beispiel tut dies für große Textdokumente.

Hinweis: Was ich suche, ist komplexer als unendlich scroll. Unendlich scroll wartet nur darauf, dass du den Boden erreichst und es wird mehr Daten laden, wodurch die Bildlaufleiste vergrößert wird. Nach was ich suche, lässt Sie denken, dass alle Daten geladen worden sind, weil die Scrollbalken gefälscht sind. Wenn Sie unten angekommen sind, haben Sie tatsächlich das Ende der Liste erreicht, die ich zeigen möchte.

+0

Sie sollten sich überlegen, Ihre Liste der Herstellung kleiner, gibt es Kategorien kann es in gruppiert werden? Das teilweise Laden der Liste bedeutet, dass die In-Page-Suche wahrscheinlich nicht funktioniert, sodass Sie den Benutzer durch die Liste scrollen lassen und ihn manuell durchsuchen, anstatt eine Suche einzugeben. – RobG

+0

Ich glaube Google Docs basiert auf * pages *, die eine feste Höhe haben. In einer HTML-Liste gibt es keine Möglichkeit, die Höhe jedes Listenelements zu kennen, es sei denn, Sie laden sie in das DOM. – bfavaretto

+0

@bfavaretto Sicher, aber ich kann auch eine feste Höhe für jeden Listeneintrag haben, den ich zeigen möchte. – jhchen

Antwort

9

Clusterize.js

Dieses Plugin Betrachten Sie tut genau das, was Sie fragen .

+0

Wie kombiniere ich dieses Plugin mit dem dynamischen Laden von Zeilen? –

+1

@SouhaiebBesbes verwenden Methoden .append, .prepend oder .update. Siehe Dokumentation – Denis

+0

[Clusterize.js] (https://www.uplabs.com/posts/clusterize-js-commercial-license) unter GNU GPL-Lizenz v3, 25 US-Dollar für die kommerzielle Einzellizenz und 110 US-Dollar für die erweiterte kommerzielle Lizenz . –

4

Es ist eine Technik namens "Infinite Scroll", und mehrere Bibliotheken unterstützen es. Wenn Sie jQuery verwenden, werfen Sie einen Blick auf:

http://www.infinite-scroll.com/

Wie Sie wissen, ist die Idee, um zu bestimmen, „wie viel“ des Datensatzes kann der Anwender aktuell und dann einen Antrag auf ausführen nur so viel, aber legen Sie die Rolle in Bezug auf die Größe des gesamten Satzes. Auf diese Weise können Sie, sobald der Benutzer an einem bestimmten Punkt vorbei scrollt, den nächsten Teil des Datensatzes anfordern.

ExtJS hat dies auch als Teil ihres komponentenbasierten Frameworks. Hier ist a grid example.

+1

Wie @LarryK auf seiner jetzt gelöschten Antwort sagte: "Beachten Sie, dass Sie Änderungen an Ihrer serverseitigen Anwendung vornehmen müssen, um die Paginierungsanfragen vom Client zu unterstützen". – bfavaretto

+0

@bfavaretto: Ja, das ist gut zu erwähnen. Abhängig von der Komplexität Ihrer Seite (z. B. ob eine dynamische Sortierung oder Gruppierung erforderlich ist), kann dies ein paar Änderungen der serverseitigen Modifikation erfordern. – voithos

+0

Entschuldigung, ich hätte klarer sein sollen. Ich habe die Frage aktualisiert, um hoffentlich den Unterschied zwischen dem, was ich suche, und dem unendlichen Scroll zu vermitteln. Auch Google Docs macht das, wonach ich suche, und das würde man nicht als unendliches Scrollen bezeichnen. – jhchen

2

Haben Sie das Überlauf-Attribut in CSS versucht? Geben Sie Ihrem Container einfach eine Standardbreite und -höhe:

#container {Höhe: 500px; Breite: 500px; Überlauf: auto;}

+1

Der Punkt ist, ich möchte nicht alle HTML-Elemente laden, weil ich viel haben werde und es langsam sein wird. Ich möchte nur diejenigen laden, die der Benutzer sehen wird, und die anderen laden, während er scrollt. – jhchen

3

ich in ein ähnliches Problem lief. Das Szenario war, dass ich bereits eine große (~ 400 + Elemente) in einer Liste angezeigt haben, wo jedes Element seine eigene Ansicht haben kann. Die Erstellung, das Layout und das Zeichnen des DOM für diese Elemente war langsamer als ich benötigte, wenn ich versuchte, die gesamte Liste in einem scrollenden DIV zu rendern.

Ich sah mehrere Lösungen.

InfinityJS [1] war ziemlich nah an dem, was ich wollte, außer dass das Element mit den Listenelementen bereits zum DOM hinzugefügt werden musste.

infinite-scroll [2] von Paul Irish war auch interessant, aber löste ein spezifisches Problem, das anders als das war, was ich lösen musste.

MegaList [3] kam dem am nächsten, was ich wollte. Andrew (Autor) hat einen tollen Job gemacht, es zuerst für Mobilgeräte zu entwickeln, mit Touch-Unterstützung usw.Eine Einschränkung für mich war, dass es scheint, ein strenges Auswahllistenmodell anzunehmen und tut ein bisschen mehr, als ich eine Listenkomponente tun möchte (z. B. eine Bindung, um Ereignisse zu skalieren und zu versuchen, dies automatisch zu handhaben).

Also fing ich an, eine Barebones-Listenkomponente zu schreiben, die locker nach dem iOS UITableView modelliert wurde - und hieß js-virtual-list-view (vlv :-). Es ist ein work in progress und ich würde es nicht weiter empfehlen, es sei denn, Sie haben ähnliche Bedürfnisse, die nicht ganz mit denen übereinstimmen.

Quellen sind hier https://github.com/shyam-habarakada/js-virtual-list-view.

benötigt Mitwirkende :-)

[1] http://airbnb.github.io/infinity/

[2] http://www.infinite-scroll.com/

[3] https://github.com/triceam/MegaList

1

Sie können die Verwendung von Polymers <iron-list> betrachten, die tatsächlich alle Daten verbraucht, aber nur eine Handvoll Knoten an das DOM anfügt und die Datenbindung verarbeitet, um den richtigen Inhalt anzuzeigen, während der Benutzer scrollt.

Ich habe es zuvor verwendet und sehr gute Ergebnisse mit benutzerdefinierten Listen von 2000 + Elemente (die Elemente sind komplexe benutzerdefinierte Elemente zu) scrollen nahtlos.

Obwohl ich es selbst nicht versucht habe, behauptet das Polymer-Team, dass es leicht mit anderen Gerüsten gemischt werden kann.

https://www.webcomponents.org/element/PolymerElements/iron-list

Verwandte Themen