0

davis.jsで、chrome / safariでページをリロードまたはロードすると、ルートに対して2つのリクエストが生成されます。リンクをクリックすると、1つのリクエストしか生成されません。Firefoxの読み込みでは、リンクを再読み込みしてクリックすると、リクエストが1つだけ生成されます。リクエストを1つだけ実行したいので、コンテンツを再描画したり、アニメーションを2回実行したりすることはありません。

これを修正して、リクエストを1つだけ受け取る方法はありますか?ルートにタイムアウトを設定して、xミリ秒ごとに1つのリクエストしか送信できないようにする必要がありますか?しかし、それはハックのように聞こえます。

私が行っていることの説明:ルートを使用してさまざまなコンテンツをロードする単一のインデックスページがあります。APIからデータを取得し、アンダースコアテンプレートをロードして、コンテンツコンテナに配置します。

davis.js0.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 
4

1 に答える 1

1

これらの問題を修正する Davis (0.9.3) の修正をプッシュしました。

問題の根底にあるのは、Webkit ブラウザー (特に Chrome と Safari) と他のブラウザーの onpopstate イベントの処理方法の違いです。

Chrome と Safari の両方の現在のバージョンはonpopstate、最初のページの読み込みでイベントを発生させますが、Firefox と Opera の両方 (およびおそらく他のバージョン) はこれを行いません。この違いは、履歴 API の上にクロス ブラウザー ライブラリを実装するときにかなりの頭痛の種になります。

これにより、Chrome でルートが 2 回実行され、[戻る] ボタンを使用して移動している場合に最初のルートが Firefox で実行されないなど、Davis で奇妙なクロス ブラウザの問題が発生します。

解決策は、ブラウザーが popstate イベントを発行したかどうか、およびそれが最初のページ読み込み用であるかどうかを追跡することです。

于 2012-09-02T21:59:32.757 に答える