Prerender on hover?

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

InstantClick ist eine ziemlich beliebte JavaScript-Bibliothek (4.344 Sterne, während ich tippe). Dies ist die Essenz

Bevor Besucher auf einen Link klicken, fahren sie mit der Maus über diesen Link. Zwischen diesen beiden Ereignissen vergehen normalerweise 200 ms bis 300 ms (testen Sie es selbst hier). InstantClick nutzt diese Zeit, um die Seite vorab zu laden, sodass die Seite bereits vorhanden ist, wenn Sie klicken.

Sie fahren mit der Maus über einen Link, dieser Ajax-ruft die Seite ab und rendert sie vorab. Beim Klicken ersetzt er den `<body>`- und `<title>`-Tag und ändert die URL.

Ich habe gerade davon gehört. Klingt ziemlich clever. Progressive Enhancement. Erhöhte wahrgenommene Leistung. Ich kann mir Bandbreitenbedenken als Einwand vorstellen. Das Herunterladen jeder Seite, über die ich mit der Maus fahre, scheint etwas bandbreitenhungrig zu sein.

Das hat mich aber zum Nachdenken gebracht... gibt es nicht ein neumodisches Prerendering-Ding? Ja, das gibt es

<link rel="prerender" href="(url)">

Es ist eigentlich nicht *so* neumodisch. Steve Souders schrieb 2013 darüber

Das ist so, als würde man die URL in einem versteckten Tab öffnen – alle Ressourcen werden heruntergeladen, das DOM wird erstellt, die Seite wird gesetzt, die CSS wird angewendet, das JavaScript wird ausgeführt usw. Wenn der Benutzer zur angegebenen href navigiert, wird die versteckte Seite eingeblendet, sodass sie sofort zu laden scheint.

Can I Use zeigt anständige Unterstützung

Diese Browser-Supportdaten stammen von Caniuse, das mehr Details enthält. Eine Zahl gibt an, dass der Browser das Feature ab dieser Version und aufwärts unterstützt.

Desktop

ChromeFirefoxIEEdgeSafari
13Nein1179Nein

Mobil / Tablet

Android ChromeAndroid FirefoxAndroidiOS Safari
127NeinNeinNein

Bedeutet das nicht, dass wir etwas wie das hier tun könnten?

var links = document.querySelectorAll('a');

[].forEach.call(links, function(link) {
    
  link.addEventListener("mouseenter", function() {
    
    var newPreLoadLink = document.createElement("link");
    newPreLoadLink.rel = "prerender";
    newPreLoadLink.href = link.href;
    
    document.head.appendChild(newPreLoadLink);
    
  })
  
});

Die Frage ist, ob dynamisch eingefügte Link-Elemente wie diese tatsächlich das Prerendering auslösen. Ich habe einen recht primitiven Test in Chrome durchgeführt und es schien nicht zu funktionieren. Na ja.

Wenn Sie noch prädiktiver als per Hover sein möchten, könnten Sie Premonish ausprobieren, „Eine Bibliothek zur Vorhersage, mit welchem Element ein Benutzer als Nächstes interagieren wird.“

Wenn Sie sich für solche Dinge interessieren, ist Prerendering nicht der einzige auf dem Markt. Robin hat letztes Jahr alles darüber geschrieben.