在davis.js中,当我在chrome / safari中重新加载或加载页面时,它将为我的路由生成两个请求。当我点击链接时,它只生成一个请求。在firefox加载中,重新加载和单击链接将只生成一个请求。我只想要一个请求来解雇,所以我不会重绘我的内容并做两次动画。
有没有办法解决这个问题,所以我只收到一个请求?我应该在我的路由上设置超时,这样它每x毫秒只能发送一个请求吗?这听起来像是一个黑客。
我在做什么的解释: 我有一个索引页面,它使用该路径加载不同的内容。它从API中获取数据并加载下划线模板,然后将其放在内容容器中。
我使用的是最新版本的davis.js 0.9.2。
.htaccess设置:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /catalog/index.php [QSA,L]
戴维斯设置:
var app = Davis(function(){
this.configure(function(){
this.generateRequestOnPageLoad = true;
});
this.get(directory, function(){
RenderPage('index');
});
this.get(directory+':id', function(req){
RenderPage(req.params['id']);
});
this.get(directory+':id/:page', function(req){
RenderPage(req.params['id'], req.params['page']);
});
});
Firefox控制台:
[Tue Aug 21 2012 16:02:01 GMT-0400 (EDT)] application started
[Tue Aug 21 2012 16:02:01 GMT-0400 (EDT)] runRoute: GET /catalog/users
Chrome控制台:
[Tue Aug 21 2012 16:01:59 GMT-0400 (EDT)] application started
[Tue Aug 21 2012 16:01:59 GMT-0400 (EDT)] runRoute: GET /catalog/users
[Tue Aug 21 2012 16:01:59 GMT-0400 (EDT)] runRoute: GET /catalog/users
答案 0 :(得分:1)
我已经推出了解决这些问题的戴维斯(0.9.3)修正案。
问题的根源在于webkit浏览器(特别是Chrome和Safari)和其他浏览器处理onpopstate事件的方式不同。
当前版本的Chrome和Safari都会针对初始页面加载触发onpopstate
事件,Firefox和Opera(可能还有其他人)都不会这样做。在历史API之上实现跨浏览器库时,这种差异会引起很大的麻烦。
这会导致戴维斯出现奇怪的跨浏览器问题,包括在Chrome中启动两次的路由,以及如果您使用后退按钮导航,则第一条路线不会在Firefox中运行。
解决方案是跟踪浏览器是否已发出popstate事件以及是否是初始页面加载的事件。