0

在 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']);
    });
});

火狐控制台:

[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

铬控制台:

[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 
4

1 回答 1

1

我已经为 Davis (0.9.3) 推送了一个修复程序,应该可以解决这些问题。

问题的根源在于 webkit 浏览器(特别是 Chrome 和 Safari)和其他浏览器处理 onpopstate 事件的方式不同。

当前版本的 Chrome 和 Safari 都会触发onpopstate初始页面加载事件,Firefox 和 Opera(可能还有其他版本)都不会这样做。在历史 API 之上实现跨浏览器库时,这种差异会导致相当头疼。

这会导致 Davis 出现奇怪的跨浏览器问题,包括在 Chrome 中触发的路由两次运行,如果您使用后退按钮导航,则第一个路由没有在 Firefox 中运行。

解决方案是跟踪浏览器是否发出了 popstate 事件,以及它是否是用于初始页面加载的事件。

于 2012-09-02T21:59:32.757 回答