1

任意の数のパラメーターを認識する単一の Sammy ルートがあります。ルートは次のようになります。

get(/^\/(?:\?[^#]*)?#page\/?((?:[^\:\/]+\:[^\:\/]+\/?)*)$/g, function() {
    var params = {};
    var splat = this.params.splat[0];
    var re = /([^\:\/]+)\:([^\:\/]+)/g;
    match = true
    while(match = re.exec(splat)) {
        params[match[1]] = match[2];
    }
    self.loadData(params);
});

このコードは機能します。それが行うことは#page/param1:value1/param2:value2/、任意の数のパラメーターのパターンのルートを認識することです。私のloadData関数には、これらのパラメーターの多くにデフォルト値があります。多くのブラウザーの多くのコンピューターで 100% 動作するため、ページの実際の読み込みに問題はないと確信しています。しかし、私の Android のブラウザと、友人の Mac の Safari と Chrome (私の PC の Chrome では動作します) では奇妙な動作をします。これらは Webkit ブラウザーであることに気付きました。

動作は、ルートが最初の URL 変更で正しく実行され、次の URL 変更では実行されず (ブラウザ バーの URL は実際には常に変更されますが)、3 回目の URL 変更で再び機能し、勝利するというものです。 4番目のことではありません。つまり、1 回おきに動作します。これは私には非常に奇妙な動作のように思えます。これをデバッグする方法がわかりません。特定のリンクについては、クリック時にウィンドウの場所を URL に設定し、runRoute('get', url);. ページ上のすべてのクリック イベントに対してこれを追加する必要があるのは現実的ではありません。また、すべての URL の変更を実際に考慮しているわけではありません。URL が変更されるたびにルートが実行されない理由をデバッグするためにできることはありますか?

4

1 に答える 1

0

上記のブラウザで 1 回おきのクリックで同様の動作が発生した場合this.params.splatは、未定義でした。URL の一致する部分 (例: /#page/param1:value1/) に設定する必要があります。

これに対処するために私が思いついたハックは、これを get ルートの先頭に追加することです。

if(this.params.splat === undefined) {
    app.unload().run();
    return;
}

これは問題の根本に到達するものではありません。ルートを再実行できるようにするための単なるハックであるためparams.splat、次回から未定義になることはありません。誰かが何が起こっているのかについてもっと情報を持っているなら、私は興味があります.

于 2013-05-04T06:50:43.817 に答える