Turbolinks 总是像往常一样加载页面
Turbolinks always loading the page as usual
我正在测试 Turbolinks 是否可以帮助我们的 Web 应用程序看起来更快一点,表现得像 "almost like" 单页应用程序。
由于我们已经对所有链接的所有点击设置了一种 "master hook",我在 <body>
上设置了 data-turbolinks="false"
,然后将我们的点击处理程序更改为调用 Turbolinks:
function goToUrl(url) {
// some controls here, and then ...
Turbolinks.visit(url);
}
我还禁用了缓存并将根设置为 /
:
<meta name=\"turbolinks-cache-control\" content=\"no-cache\">
<meta name=\"turbolinks-root\" content=\"/\">
但是,我注意到它总是执行标准的页面更改,而不是 "magic"。
如果我从控制台调用该方法,也会发生同样的情况,没有显示错误或警告,但页面加载正常,而不是使用 Turbolinks "magic"。
它唯一有效的时间是访问根地址 ("/"
)。
除了简单地使用 visit()
方法之外,是否涉及更多配置?
编辑:
进一步测试后,我注意到,当对 Turbolinks.visit(url)
的调用似乎 "fail" 时,通过发布正常的页面导航,它 returns 一个像记录时那样的对象是这样的:
Object {
absoluteURL: "URL WHERE I TRIED TO NAVIGATE",
requestURL: "SAME AS ABOVE"
}
当我测试正确加载的唯一地址时,我得到了一个不同的对象:
turbolinks:visit {
target: HTMLDocument → /,
isTrusted: false,
eventPhase: 0,
bubbles: true,
cancelable: false,
defaultPrevented: false,
composed: false,
timeStamp: 1492781909168000,
cancelBubble: false,
originalTarget: HTMLDocument → /,
explicitOriginalTarget: HTMLDocument → /
}
在第一种情况下,它看起来像是一个普通的对象,而第二种情况看起来更像是一个事件;但是,这无助于确定导致其无法正常工作的问题。
最后我发现原因是我们所有的 links 都是 PHP 文件,例如 /folder/index.php?p=1&x=2
,而 Turbolinks 有检查,如果 link 有扩展名,它必须是 htm
、html
或 xhtml
.
之一
所以我尝试用另一个函数覆盖该函数,如下所示:
Turbolinks.Location.prototype.isHTML = function() {
return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml|php))$/);
};
这样做之后,它开始按预期工作。
我正在测试 Turbolinks 是否可以帮助我们的 Web 应用程序看起来更快一点,表现得像 "almost like" 单页应用程序。
由于我们已经对所有链接的所有点击设置了一种 "master hook",我在 <body>
上设置了 data-turbolinks="false"
,然后将我们的点击处理程序更改为调用 Turbolinks:
function goToUrl(url) {
// some controls here, and then ...
Turbolinks.visit(url);
}
我还禁用了缓存并将根设置为 /
:
<meta name=\"turbolinks-cache-control\" content=\"no-cache\">
<meta name=\"turbolinks-root\" content=\"/\">
但是,我注意到它总是执行标准的页面更改,而不是 "magic"。
如果我从控制台调用该方法,也会发生同样的情况,没有显示错误或警告,但页面加载正常,而不是使用 Turbolinks "magic"。
它唯一有效的时间是访问根地址 ("/"
)。
除了简单地使用 visit()
方法之外,是否涉及更多配置?
编辑:
进一步测试后,我注意到,当对 Turbolinks.visit(url)
的调用似乎 "fail" 时,通过发布正常的页面导航,它 returns 一个像记录时那样的对象是这样的:
Object {
absoluteURL: "URL WHERE I TRIED TO NAVIGATE",
requestURL: "SAME AS ABOVE"
}
当我测试正确加载的唯一地址时,我得到了一个不同的对象:
turbolinks:visit {
target: HTMLDocument → /,
isTrusted: false,
eventPhase: 0,
bubbles: true,
cancelable: false,
defaultPrevented: false,
composed: false,
timeStamp: 1492781909168000,
cancelBubble: false,
originalTarget: HTMLDocument → /,
explicitOriginalTarget: HTMLDocument → /
}
在第一种情况下,它看起来像是一个普通的对象,而第二种情况看起来更像是一个事件;但是,这无助于确定导致其无法正常工作的问题。
最后我发现原因是我们所有的 links 都是 PHP 文件,例如 /folder/index.php?p=1&x=2
,而 Turbolinks 有检查,如果 link 有扩展名,它必须是 htm
、html
或 xhtml
.
所以我尝试用另一个函数覆盖该函数,如下所示:
Turbolinks.Location.prototype.isHTML = function() {
return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml|php))$/);
};
这样做之后,它开始按预期工作。