Heim > Web-Frontend > js-Tutorial > Hauptteil

Lazyload-Skripte wie Bilder

DDD
Freigeben: 2024-10-05 20:18:29
Original
741 Leute haben es durchsucht

Lazyload Scripts like Images

Eine der besten Verbesserungen an HTML in den letzten Jahren war das Attribut „loading="lazy", das Sie Bildern (auch Iframes) hinzufügen können, das den Browsern mitteilt, sie nicht zu laden Bild, bis es im Ansichtsfenster ist.


    <img src="/images/your-image.png" loading="lazy">


Nach dem Login kopieren

Sehr einfach, sehr nützlich. Aber wäre es nicht großartig, wenn Sie dies auch für Skripte tun könnten? Damit Sie Ihre Komponenten nur dann langsam laden können, wenn sie tatsächlich benötigt werden...

Nun, noch eine weitere Funktion: Das Element hat, ist die Fähigkeit, ein Skript auszuführen, nachdem das Bild mit den Attributen onload und onerror geladen (oder nicht geladen) wurde.


    <img 
        src="/images/your-image.png" 
        loading="lazy"
        onload="() => console.log('image loaded')"
    >


Nach dem Login kopieren

Dieser Onload-„Callback“ wird nur ausgelöst, wenn das Bild geladen wird, und wenn das Bild verzögert geladen wurde, wird er nur ausgelöst, wenn sich das Bild im Ansichtsfenster befindet. Et voilà! Ein träge geladenes Skript.

Leider nützt es so nicht viel. Erstens haben Sie ein unerwünschtes Bild auf Ihrer Seite, und zweitens müssen Sie das Javascript einbinden, das Sie ausführen möchten, was den Zweck des verzögerten Ladens irgendwie zunichte macht. Nehmen wir also einige Änderungen vor, um dies zu verbessern.

Das Bild selbst kann alles sein, oder, was noch wichtiger ist, nichts. Wie ich bereits erwähnt habe, gibt es den onerror-Rückruf, der – wie der Name schon sagt – ausgelöst wird, wenn das Bild nicht geladen wird.

Das bedeutet nicht, dass Sie den Quellcode auf ein nicht vorhandenes Bild verweisen müssen, da dies zu einer Konsole voller roter 404-Fehler bezüglich fehlender Bilder führen würde, und das möchte niemand.

Der onerror-Rückruf wird auch ausgelöst, wenn das Quellbild eigentlich kein Bild ist. Der einfachste Weg, dies zu tun, besteht darin, ein Bild mithilfe des data:-Formats „schlecht zu kodieren“. Dies hat auch den Vorteil, dass die Konsole nicht mit Warnungen vor fehlenden Bildern gefüllt wird ?


    <img 
        src="data:," 
        loading="lazy"
        onerror="() => console.log('image not loaded')"
    >


Nach dem Login kopieren

Dies führt immer noch dazu, dass auf der Seite die Miniaturansicht „kaputtes Bild“ angezeigt wird, aber dazu kommen wir noch.

Okay, aber wir müssen noch das Javascript einbinden, das wir ausführen möchten. Wie können wir das beheben?

Nun, da die ES-Modulunterstützung nahezu universell ist, können wir die sehr leistungsstarke Javascript-Ladetechnik Event-Import-then-Default verwenden, um ein Skript zu laden, nachdem ein Ereignis ausgelöst wurde, etwa so:


    <img 
        src="data:," 
        loading="lazy"
        onerror="import('/js/some-component.js').then(_ => _.default(this))"
    >


Nach dem Login kopieren

Hinweis: Dies funktioniert auch für Onclick-, Onchange- usw. Ereignisse
Hinweis: Die Unterstriche sind nur Abkürzungen für den Zugriff auf das Modul. Sie können auch .then(Module => Module.default(this)) schreiben

Okay, also was ist hier los!?

Lass uns zunächst einen Blick darauf werfen, wie eine Komponente aussehen könnte:


// some-component.js

export default element => {
    element.outerHTML = `
        <div class="whatever">
            <p>Hello world!</p>
        </div>
    `;
}


Nach dem Login kopieren

Vielleicht ist Ihnen also aufgefallen, dass ich dies im onerror-Rückruf als Argument an den Standardexport übergeben habe. Der Grund, warum ich das gemacht habe (entschuldigen Sie das Wortspiel?), war, dem Skript die das hat es genannt, denn in diesem (ich habe es wieder getan?) Kontext this = .

Jetzt können Sie einfach element.outerHTML verwenden, um das defekte Bild durch Ihr HTML-Markup zu ersetzen, und schon haben Sie es, verzögert geladene Skripte! ?

Caching und Übergabe von Argumenten

Wenn Sie diese Technik mehr als einmal auf einer Seite verwenden, müssen Sie einen „Cache-Busting“-Index oder eine Zufallszahl an die Daten übergeben:, z. B. so etwas wie:


    <img 
        src="data:,abc123" 
        loading="lazy"
        onerror="import('/js/some-component.js').then(_ => _.default(this))"
    >
    <img 
        src="data:,xyz789" 
        loading="lazy"
        onerror="import('/js/some-other-component.js').then(_ => _.default(this))"
    >


Nach dem Login kopieren

Die Zeichenfolge nach „:“, kann beliebig sein, solange sie unterschiedlich ist.

Eine sehr einfache Möglichkeit, Parameter an die Funktion zu übergeben, wäre die Verwendung des data-something-Attributs im HTML wie folgt:


    <img 
        src="data:," 
        loading="lazy"
        data-message="hello world"
        onerror="import('/js/some-component.js').then(_ => _.default(this))"
    >


Nach dem Login kopieren

Da wir dies an die Funktion übergeben, können Sie wie folgt auf die Datenattribute zugreifen:


export default element => {
    const { message } = element.dataset
    element.outerHTML = `
        <div class="whatever">
            <p>${message}</p>
        </div>
    `;
}


Nach dem Login kopieren

Bitte teilen Sie mir Ihre Meinung in den Kommentaren mit! ❤️

Das obige ist der detaillierte Inhalt vonLazyload-Skripte wie Bilder. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!