鼠标悬停预渲染?

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适合您旅程各个阶段的云产品。 立即开始使用 200 美元的免费信用额度!

InstantClick 是一个非常流行的 JavaScript 库(截至我写作本文时,已有 4,344 颗星)。 以下是要点

在访问者点击链接之前,他们会将鼠标悬停在该链接上。 这两个事件之间通常会经过 200 毫秒到 300 毫秒(在这里测试自己)。 InstantClick 利用这段时间预加载页面,以便在您点击时页面已经存在。

您将鼠标悬停在链接上,它会使用 Ajax 获取该页面并进行预渲染。 点击时,它会替换 <body><title>,并更改 URL。

我刚听说它。 听起来很聪明。 渐进式增强。 提高了感知性能。 我可以想象有人会反对带宽问题。 下载我鼠标悬停的每个页面似乎有点带宽贪婪。

不过,这让我思考... 难道没有新式的预渲染技术? 有的

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

实际上,它并不那么新式。 Steve Souders 在 2013 年就写过关于它的文章

这就像在隐藏的选项卡中打开 URL 一样——所有资源都会下载,DOM 会创建,页面会布局,CSS 会应用,JavaScript 会执行,等等。 如果用户导航到指定的 href,那么隐藏页面就会被替换到视图中,使其看起来是立即加载的。

Can I Use 显示了良好的支持

这些浏览器支持数据来自 Caniuse,其中包含更多详细信息。 数字表示浏览器在该版本及更高版本上支持该功能。

桌面

ChromeFirefoxIEEdgeSafari
131179

移动设备/平板电脑

Android ChromeAndroid FirefoxAndroidiOS Safari
127

这是否意味着我们可以做这样的事情?

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);
    
  })
  
});

问题是,像这样动态插入的链接元素是否真的会触发预渲染。 我在 Chrome 中进行了一个相当原始的测试,它似乎不起作用。 哦,好吧。

如果您想比悬停更具预测性,可以尝试使用 Premonish,“一个用于预测用户接下来将与哪个元素交互的库”。

如果您对这类事情感兴趣,预渲染并不是唯一的方案。 Robin 去年写了关于所有这些内容的文章