2016-08-09 53 views
0

Ich habe eine Liste von Diagrammen. Ich verwende Chart.js, um diese Diagramme zu erstellen. Da meine Liste 1 bis 100 oder mehr Einträge haben kann, wäre die Initialisierung aller Diagramme auf einmal nicht schlau, da dies das UI für eine lange Zeit einfrieren würde. Stattdessen dachte ich, es wäre viel besser, nur die Diagramme zu initialisieren, die innerhalb der Ansichtsgrenzen des Browsers sichtbar sind, so dass beispielsweise nur das erste Diagramm initialisiert wird und wenn der Benutzer nach unten scrollt und das zweite Zeichenfeld sichtbar wird Initialisierung und so weiter.Canvas: Erkennen, ob es im Browser sichtbar ist

Ich habe alles eingerichtet, aber das einzige Problem, das ich gerade habe, ist: Wie kann ich einen Eventlistener oder ähnliches erstellen, die ich jedem Canvas Element hinzufügen kann, das ausgelöst wird, wenn ein Canvas innerhalb der Ansichtsgrenzen des angezeigt wird browser, damit ich die Diagramminitialisierung für diese Leinwand durchführen kann?

+0

['IntersectionObserver'] (https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) könnte helfen. ([Polyfill] (https://www.npmjs.com/package/intersection-observer)) – gcampbell

+0

Sie könnten Sie nicht initialisierte Diagramme in einem Array speichern, fügen Sie dann ein Bildlaufereignis auf Ihrer Seite hinzu und prüfen Sie, ob einer dieser nicht initialisiert ist Diagramme ist sichtbar. Dies könnte helfen: http://StackOverflow.com/a/36012192/3702797 – Kaiido

Antwort

2

Ich bin der Autor der OnScreen, eine kleine Bibliothek, die eine Callback-Funktion aufrufen kann, wenn ein HTMLElement das Ansichtsfenster oder die Grenzen seines Behälters gelangt.

// Uses ES6 syntax 
import OnScreen from 'onscreen'; 

const os = new OnScreen(); 

os.on('enter', 'canvas', (element) => { 
    if (!element.chartInitialized) { 
     // Initialize the chart 

     // Update the `chartInitialized` property 
     // to avoid initializing it over and over 
     element.chartInitialized = true; 
    } 
}); 

Für weitere Informationen, nehmen Sie einen Blick auf die documentation. Vergessen Sie nicht, die demos repo für ein paar einfache Beispiele zu überprüfen.

1

Ich habe die onScreen jQuery Plugin verwendet.

Es ist sehr einfach. Sie müssen nur für jede Leinwand diese nennen:

$('elements').onScreen({ 
    container: window, 
    direction: 'vertical', 
    doIn: function() { 
    // initialize canvas 
    }, 
    doOut: function() { 
    // Do something to the matched elements as they get off scren 
    }, 
    tolerance: 0, 
    throttle: 50, 
    toggleClass: 'onScreen', 
    lazyAttr: null, 
    lazyPlaceholder: 'someImage.jpg', 
    debug: false 
}); 
+0

@Mulgard Siehe [Dist-Ordner fehlt] (https://github.com/silvestreh/onScreen/issues/33): "* der dist/Das Verzeichnis enthält kompilierten Code, der theoretisch keinen Platz im Repository hat. Dieser kompilierte Code ist über NPM verfügbar und Sie können npm install auf dem Bildschirm in einem Terminalfenster ausführen. * " –

+1

Ich bin der Autor von OnScreen. Ich bin von jQuery weggezogen und jetzt OnScreen hat keine Abhängigkeiten und die API hat sich geändert. Sie können für ein paar Beispiele zum [Demos Repo] (https://github.com/silvestreh/onScreen-demo) gehen. Sie können sich auch die [Dokumentation] (https://github.com/silvestreh/onScreen/blob/master/README.md#documentation) ansehen. –