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 确实总是在更改),然后它会在第三个 URL 更改时再次运行,并获胜不是第四个。也就是说,它每隔一段时间工作一次。这对我来说似乎是非常奇怪的行为,我不知道如何调试它。对于某些链接,我能够运行 hack,以便在单击时将窗口位置设置为 URL,并使用runRoute('get', url);. 必须为页面上的每个点击事件添加它是不切实际的,而且这并不能真正解释所有 URL 更改。我可以做些什么来调试为什么每次 URL 更改时我的路由都没有运行?

4

1 回答 1

0

对于那些遇到类似行为的人,在上述浏览器中的每一次点击this.params.splat都是未定义的。它应该设置为 URL 的匹配部分(例如/#page/param1:value1/)。

我想出的解决方法是将其添加到 get 路由的顶部:

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

这并没有解决问题的根源,它只是一个允许它重新运行路由的 hack,因此params.splat下次不会未定义。如果有人对正在发生的事情有更多信息,我会很感兴趣。

于 2013-05-04T06:50:43.817 回答