尤其是
$(document).ready ->
alert "page has loaded!"
要变成
$(document).on "page:change", ->
alert "page has loaded!"
什么时候?什么情况?
$(document).ready 每次新进的页面(地址栏回车,跳转)或者 刷新都会执行。
$(document).on "page:change 每次 Turbolinks 工作时执行。
简单的说,一般情况下 ready 函数一般只执行一次,而 page:change 在每次页面切换时都会执行。
$(document).ready ->
alert "我在 Turbolinks 下只执行一次。"
$(document).on "page:change", ->
alert "我在 Turbolinks 下每次都执行。"
只要将每次执行的代码和只执行一次的代码分开就可以了。
比如事件委托是发生在 document 上,这个对象只要不刷新就一直存在,所以只执行一遍就可以了
$(document).on 'click', 'body', ->
然后,比如像每次刷新都要改变 body 颜色的话,就要使用 page:load
$(document).on "page:change", ->
document.body.style.backgroundColor = '#xxxxx'
另外,page:change 在第一次加载进页面是不会执行的,可以配合 ready 一起使用:
$ ->
$(document).on "page:change", do ->
document.body.style.backgroundColor = '#xxxxx'
arguments.callee
弱弱地说我一般都
$ ->
if $.turbo.isReady == true
App.Init()
你翻翻 Rei 的博客,里面有篇关于 Turbolink 的写的很易懂
Turbolinks 是 pjax 的加强版
pjax 这样理解不知道可不可以:
当你点击“下一页”的时候,网址会变化,比如 page/2,但页面的刷新却是 ajax 风格的:只变化其中一部分,那么点击“下一页”不会触发$(document).ready,而是 page:change
再扰乱一下楼主,其实我现在用 page:change
很少,换成这样写:
$(document).on 'click', 'body', ->
console.log('hit')
现在 Ruby China 就是开着 turbolinks 的,你觉得分享链接有困难吗?
知道为啥 page 事件在加载页面时不触发了,原来 我用的不是 page:change
而是 page:load
。
page:load
事件对应的是 xhr.onload,也就是每次完成 AJAX 请求时触发。
而 page:change
是页面切换调用 changePage
时触发,然后 Turbolinks 在 installDocumentReadyPageEventTriggers
函数做了处理,所以可以替代 domready 函数!
我去把之前的代码改一下,THK