【问题标题】:preload="true" hyperlinkspreload="true" 超链接
【发布时间】:2010-07-19 22:00:30
【问题描述】:

是否有方法、javascript 脚本或任何可以允许在页面中预加载超链接的方法?例如,我希望当用户来到http://ahostel.lt/ 并且页面完全加载时,脚本将开始预加载导航中的其他页面(预订、地图、设施、环顾四周,[...])。因此,当用户单击任何这些超链接时,页面将立即加载。如何做到这一点?

【问题讨论】:

标签: jquery apache optimization


【解决方案1】:

你可以这样做:

$(function() {
  $('a').each(function() {
    new Image().src = $(this).attr('href'); // or just this.href
  });
});

它们不是图像,但浏览器不知道这一点。您可能需要放慢速度,以免过度阻塞连接:

$(function() {
  var urls = $('a').map(function(_, a) { return a.href; }).get(0);
  var i = 0;
  function fetchOne() {
    if (i === urls.length) return;
    var img = new Image();
    img.load = fetchOne;
    img.src = urls[i++];
  };
  fetchOne();
});

edit — @Adam 对要获取的“危险”链接提出了非常好的观点。将某些链接标记为“noPrefetch”(作为类或其他东西)可能会更好,或者仅使用“prefetch”类显式标记的预取链接。

【讨论】:

  • 咳嗽 this.href 咳嗽 :)
  • 好吧,尼克 - 我感觉到你正在参加一场小型十字军东征 :-)
  • 确保使用var urls = $('a').map(function(i, a) { return a.href; }).get(0);var urls = $('a').map(function() { return this.href; }).get(0);,第一个参数是索引:)
  • 谢谢尼克——它总是让我发疯,“.map()”和“.each()”是不同的,通常我每次输入时都必须检查 api.jquery.com! !
【解决方案2】:

HTML5 规范中实际上对此做了规定,尽管目前只有 Firefox 支持。

<link rel="next" href="page2.html">

只是把它作为非 javascript 的替代品扔给你。

【讨论】:

【解决方案3】:

没试过,但是根据this blog post,你可以这样做:

$("a").each(function(){
  $.ajax({ url:$(this).attr("href"), cache:true, dataType:"text" });
});

你应该小心,但如果你有像注销这样的链接,用户可能会被注销。 See Wikipedia for more problems with prefetching.

【讨论】:

  • 好吧,我想让客户端选择要预取的页面,例如使用选择器 $('a[prefetch="true"]')。然而,问题在于,每次用户转到导航中的其他页面时,它都会尝试预取所有页面。
  • 这些预取问题都是真实存在的,但如果您谈论的是从您自己的网站预取您自己的页面,那么大多数问题都没有实际意义。如果链接不是指向自己的网站,那么我完全同意这是一种非常粗鲁的做法。
  • @Guy 除非我们在这里谈论数以万计的链接,否则冗余预取可能会非常便宜,因为浏览器会看到它被缓存了。但是,同样,如果链接太多,它可能会成为问题。
  • @Guy 假设浏览器有一些缓存,那些从下一页预取的请求将非常快或根本不发出。这也取决于您的 Web 服务器输出的缓存标头。
  • @Pointy。我同意,如果您在自己的网站上小心预取是可以的。我在看到你之前发表了我的最后一条评论,对于冗余感到抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多