同步更新官网文档:v3.1 2017/8/17
instantclick 中文文档
简介
instantclick.js 是一种ajax无刷新和预加载页面的技术,对于普通博客程序,有着明显的加速作用。(instantclick.js ≈ pjax + 预加载页面)而且,使用方法也十分的简单。在github截止目前,已经由4447个star了,非常可观。
目录
初级阶段
- 开始使用
- instantclick 工作原理
- 预加载页面
- 黑名单规则
- 事件和脚本的重新加载
进阶阶段
- 跟踪页面内容的变化
- 自定义加载条
初级阶段
开始使用
下载instantclick.js
其他的下载方式
- github上面的最新开发版本
- 通过
bower
(一种前端开发工具) :bower install instantclick
初始化instantclick
</body>
标签结束之前)...
<script src="instantclick.min.js" data-no-instant></script>
<script data-no-instant>InstantClick.init();</script>
</body>
</html>
现在instantclick 已经成功在你的网页上面生效。阅读下面的文章以便更熟练的使用instantclick。
- instantclick 工作原理:将会让你建立正确的模型以便更好的理解instantclick的机制
- 预加载页面:将会向你展示不同的预加载页面的方法
- 黑名单规则:因为有些链接你不想预加载
- 事件和脚本的重新加载:将会帮助你使instantclick更好的配合你的网页中的JavaScript。
instantclick不总是“即插即用”(不是通过两行代码就可以在你的网页上运行),你可能需要自定义一些设置来适应你的网站,这也是为什么阅读上述文章是强制性的。
instantclick 工作原理
InstantClick与传统的web应用区别不大,但是很有必要去了解这些不同的地方!
instantclick使浏览器不再刷新整个页面(即无刷新页面效果)
- 你不能依赖
DOMContentLoaded
和jQuery.ready()
这两个函数来触发相关事件(这两个事件在刷新整个页面的时候才会触发,但是你可以使用[InstantClick’s events]()来替代) - 依赖上面两个函数的第三方脚本(比如js代码)需要调整(参阅[事件和脚本的重新加载]())
- 在加载页面的时候,浏览器不会在显示原本加载进度条了,instantclick有它自己的加载进度条。
<body>
和title
,所以你的脚本只会被加载一次(带来的好处是速度的明显提升)。下面还有一些内容你需要了解:
- 通过instantclick加载的每个页面的
<head>
标签里面的样式和脚本应该是相同的(因为instantclick只会加载一次<head>
标签里的内容) - 如果
<head>
标签里面的某些内容依赖于网页的内容(比如在页面加载时运行的脚本或css动画),它需要调整以便正常运行。
InstantClick是渐进式增强功能:如果访问者的浏览器不支持InstantClick,您的网站链接将照常工作,只是不会提升速度了。
预加载页面
InstantClick 关于预加载方式有多种选择。你可以根据你的服务器配置来选择合适的方式。
但是不管怎样,当每个页面改变时,不会重新加载脚本和样式表,这样会使你的页面加载速度提升一倍!(与Turbolinks、pjax等等技术是类似的)
默认: 在鼠标悬停预加载(on mouseover)
当用户鼠标悬停在链接上开始预加载页面。如果用户网络链接不错的话,你的页面会很快的打开。
初始化方法就是[开始使用]()设置的方式。
不会给服务器带来额外负担:在鼠标点击的瞬间预加载(mousedown)
当用户按下你的链接按钮的瞬间,页面开始预加载。这为你的服务器带来了接近零的开销,但仍然能够带来一个很“神奇”的速度提升!
'mousedown'
作为参数传递给InstantClick.init
InstantClick.init('mousedown');
折中的方式:鼠标悬停延迟一定时间才会预加载
如果用户在您选择的延迟过后仍悬停在链接上,则该网页将开始预加载。
推荐的延迟时间为:100ms和50ms。超过100ms效果比mousedown效果更差。低于50ms,则会与mouseover效果相似。
要使InstantClick延迟一定时间后预加载,请将延迟(毫秒)作为参数传递给InstantClick.init。
InstantClick.init(50);
手机端效果
上面的任何预加载方式,在手机端的时候,当用户手指接触链接时候都会开始预加载。
如果您的网站针对移动设备(在安卓和iOS界面上使用了[FashClick]()技术)进行了优化,则当访问者从链接中释放手指时,会发生“点击”,导致预加载大约100 ms的延迟。
如果您的网站没有针对手机进行优化,延迟时间则取决于操作系统。 Android给出300 ms,iOS给出450 ms。
在同一站点上的3G请求的延迟时间通常需要大约200ms。
如何选择?
黑名单规则
有一些链接是不需要通过instantclick来预加载。黑名单规则可以实现这个效果。
哪些需要进入黑名单
哪些需要进入黑名单,而不能进入白名单的:
- 链接指向操作,例如注销和切换语言。
- 链接指向需要一段时间加载的非HTML内容
- 链接指向的页面与当前页面
<head>
标签内的css样式和脚本不同 - 链接触发JavaScript的操作
部分链接已在内部列入黑名单,且无法列入白名单:
- 链接有
target
或者download
属性 - 链接与当前的域名或者协议不同
- 链接指向当前页面的锚点链接(#anchor)
把一个链接列入黑名单
data-no-instant
属性<a href="/blog/" data-no-instant>Blog</a>
把一组链接列入黑名单
data-no-intant
要方便的多。data-no-instant
属性。把一个链接或者一组链接列入白名单
data-instant
属性。</html>
的位置,遍历所有的父元素,如果找到data-no-instant
属性,它就会认为该链接已经被列入黑名单,并停止循环遍历父元素。如果它找到data-instant
属性,它会认为该链接已经被列入白名单。(此处翻译可能需要修改)<body>
添加一个data-no-instant
属性,然后向该链接或者容器中添加data-instant
属性。白名单模式
下面的方法已经弃用,可能会在4.0版本中删除。只有当你的网站正确激活参数(真正的参数传递给InstantClick.init),这种方法才会有用。(此处翻译可能需要修改)
正确的方式™:如果要实现与白名单模式相同的效果,只需添加data-no-instant
到你的<body>
标签中,参见上一条目“把一个链接或者一组链接列入白名单”。
InstantClick.init
传递true
参数来启用白名单模式。InstantClick.init(true);
/* or */
InstantClick.init(50, true);
/* or */
InstantClick.init('mousedown', true);
事件和脚本的重新加载
DOMContentLoaded
函数。因此,一些脚本可能需要调整才能与InstantClick正常工作。InstantClick会触发4个事件以便于挂钩到页面的整个生命周期:
change
:当前的页面一旦改变会触发该事件,即使浏览器不支持instantclick,页面初始加载的时候也会触发该事件,这个事件可以用来替换DOMContentLoaded
.
isInitialLoad
参数,它是一个布尔值,当它是初始页面更改或当InstantClick不被支持时为true
,而当InstantClick更改页面时为false
。(此处翻译需要修改)fetch
:页面开始预加载的时候receive
:页面已经预加载完成,你可以使用该事件[修改页面的内容]().wait
:用户已经点击了链接,但是页面还没有开始预加载。仅在页面不是立即显示(可能由于网络原因)的时候触发。
change
,你可以使用InstantClick.on
:InstantClick.on('change', yourCallback);
InstantClick.init
之前调用InstantClick.on
,因为change
事件在网页初始加载时就会被触发,包括浏览器不支持pushState的时候。(此处翻译可能需要修改)<body>
标签内部有一个脚本,当instantclick切换到另一个页面的时候,你并不希望重新加载它 ,你可以添加一个data-no-instant
属性。<script data-no-instant>alert("I’m only run once.");</script>
data-no-instant
属性,然后逐个删除每个属性,直到找到罪魁祸首。您可以通过查看Turbolinks兼容性站点上的示例(在CoffeeScript中)了解如何解决兼容性问题。例如,以下是如何使Google Analytics(网站统计与分析)(2013年末的代码)正常工作:
<script src="instantclick.min.js" data-no-instant></script>
<script data-no-instant>
/* Google Analytics code here, without ga('send', 'pageview') */
InstantClick.on('change', function() {
ga('send', 'pageview', location.pathname + location.search);
});
InstantClick.init();
</script>
在receive
事件里改变页面内容
receive
事件里改变页面内容receive
事件。url
, ,body
和title
。url
接收的页面的地址,它包括哈希值。它是只读的。body是body对象,title是标题文本。如果你想在页面显示之前改变页面内容,你可以修改这两个参数并返回一个对象(或者只修改其中的一个参数)。
下面是一个例子:
InstantClick.on('receive', function(url, body, title) {
var dont_display = body.querySelector('#dont_display_me_when_loaded_with_instantclick')
if (dont_display) {
dont_display.setAttribute('hidden', '');
}
title += ' (loaded with InstantClick)';
return {
body: body,
title: title
};
});
body
而不是document.body
!receive
函数时,每个后续回调将获得最后更改的内容。false
。进阶阶段
跟踪页面内容的变化
当前跟踪页面内容的变化的方式目前有点笨拙。它可能稍后在InstantClick 4.0中更改。
data-instant-track
属性:<link rel="stylesheet" href="style.css" data-instant-track>
<script src="script.js" data-instant-track></script>
<style data-instant-track>body { background: aliceblue; }</style>
<script data-instant-track>window.timingStart = performance.now();</script>
href
或src
属性(如果存在)中的更改。要指示文件已更新,请修改其属性:<link rel="stylesheet" href="style.css?20140308" data-instant-track>
<script src="script.js?20140308" data-instant-track></script>
如果它是内联脚本或样式,InstantClick将检查元素内容中的更改。
<style data-instant-track>body { background: midnightblue; font: 13px Helvetica; }</style>
<script data-instant-track>var timingStart = performance && performance.now();</script>
当检测到任何更改时,InstantClick将重新加载页面,从而使浏览器重新评估所有脚本和样式。
自定义加载条
进度条是一个假的进度条,只是在那里给你的用户的感觉页面的加载进度。
在未来,应该可以使进度条显示真正的进度(通过查看服务器的Content-Length头)。
即使页面已经立即加载,也会显示进度条,在将来这将更改。你可以在github讨论。
当访问者缩放页面或旋转其设备时,该栏的大小和位置会自动调整,因此即使您的网站未针对移动设备进行优化,也会正常工作。
#29d
, 你可以改变CSS:#instantclick-bar {
background: white;
}
你也可以让进度条消失:
#instantclick {
display: none;
}
使进度条消失的方式不是最佳的。在稍后的InstantClick版本中,可能可以通过向InstantClick.init传递参数来实现这个效果。
38 条评论
博主可以出一期教程怎么让instantclick兼容typecho评论区吗,typecho用了这个评论区无法回复了
[...]原文链接:https://www.ihewro.com/archives/515/[...]
请问一下
`jQuery(document).ready(function() {
jQuery("time.timeago").timeago();
});`这段代码怎么用[InstantClick’s events]()替换呢?|´・ω・)ノ
哈哈,自己解决了,把jquery里的那段代码放到on里面就可以了~
顺当问下这个怎么能让他在评论区data-no-instant
什么意思呢?是说无刷新评论呢?这么直接用instantclick没办法实现的吧
就是让instantclick不在评论区生效QwQ 来问问有没有什么比较好的方法(现在的情况是评论无法回复,bootstrap的模态框唤不起来,模态框在评论区)
你可以看下模板的comments.php 最后有一段很长的js,就是为了解决这个问题的
加到了我的主题里之后仍不行qwq
关闭后台设置的“反垃圾保护”开关再试试?
解决了QwQ 谢谢dalao
我要转走233
当然可以辣,你还可以修改下翻译(´இ皿இ`)
我英文也不好,官方文档我都没看,遇到啥问题都是各种奇葩方式解决,今天看到你写了这个我觉得有必要转下,方便查看233⌇●﹏●⌇
咦,我好像很久之前试过这个插件,但是当时出了很多问题所以去掉了,预加载部分只能是body么?
对√,不能改的
那我就继续使用pjax咯!哈哈
用pjax后typecho的aplayer插件没有封装函数,不会回调。。考虑之后还是用这个了。
咦,为什么我没有出现这个问题
选的pJax的容器不同吧,还有你是wordpress的呀
我是在加载的时候aplayer源码不会被刷新,然后函数也就没有变咯!
完整地看了一边,涨姿势了,记得当时搞这东西遇到不少坑。。
这个项目自身还有不少bug(ó﹏ò。)
求大佬给我站加个p/ajax....
加这个不难,但是可能与一些JS冲突哦。
instantclick看上面写的开始使用就可以使用,也是一种Ajax方式。
还有一个pJax项目,http://www.ihewro.xyz/archives/354/
如果有问题可以再找我|´・ω・)ノ
啊哈,无意中看到以前的评论了,有点羞耻 Σ(っ °Д °;)っ
翻译的痕迹好重
感觉效果还不错?
效果不错哦。(☆ω☆)