我有一条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确实总是更改),然后它将再次为第三次更改,并不会为第四个。也就是说,每隔一段时间都有效。对我来说,这似乎是一种非常奇怪的行为,我对如何调试它感到茫然。对于某些链接,我能够运行一个hack,以便在单击时将窗口位置设置为URL并使用runRoute('get', url);
强制运行sammy代码。必须为页面上的每个点击事件添加此内容是不切实际的,并且无论如何这并不能真正解决所有URL更改。我可以做些什么来调试为什么每次URL更改时都没有运行我的路由?
答案 0 :(得分:0)
对于那些遇到类似行为的人,在上述浏览器中的每次点击时,this.params.splat
都未定义。它应该设置为URL的匹配部分(例如/#page/param1:value1/
)。
我想出来解决这个问题的方法是将其添加到获取路径的顶部:
if(this.params.splat === undefined) {
app.unload().run();
return;
}
这不是问题的根源,它只是一个允许它重新运行路由的黑客,以便下次通过时params.splat
未定义。如果有人有关于发生了什么的更多信息,我会感兴趣。