Firefox中的主干导航触发两次
正在尝试使用主干的导航属性Firefox中的主干导航触发两次,firefox,backbone.js,url-routing,Firefox,Backbone.js,Url Routing,正在尝试使用主干的导航属性 this.navigate("week/" + companyName + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false }); 上面的代码执行一次 它击中了这一点: routes: { "week/:companyName/:employeeNo/:weekEnd": "getWeek" }, 然后这个函数被命中两次: getWeek: function (compa
this.navigate("week/" + companyName + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false });
上面的代码执行一次
它击中了这一点:
routes: {
"week/:companyName/:employeeNo/:weekEnd": "getWeek"
},
然后这个函数被命中两次:
getWeek: function (companyName, employeeNo, weekEnd) {
console.log('getWeek:', companyName, employeeNo, weekEnd);
}
它在Firefox中登录了两次,在IE和Chrome中只登录了一次
这里有什么问题?我最初甚至没有将触发器设置为true,Firefox忽略了这一点,仍然触发了URL 最近我遇到了一个类似的问题,Firefox在一个Backbone.navigate之后进行了两次服务器调用。在我的例子中,这是因为我们没有对字符串进行编码。您的公司名称是否有需要编码的字符 你可以试试:
this.navigate("week/" + escape(companyName) + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false });
当我遇到同样的问题并触及根本问题时,请介入 正如前面提到的,问题来自URL编码。至于为什么这个问题只出现在Firefox中 让我们从快速总结哈希更改时如何调用路由开始。这里有3个关键功能:
- 加载URL:此函数将调用路由处理程序
- 导航:此功能用于手动更改路线。如果触发器标志设置为true,则函数将调用loadUrl
- 检查URL:此函数设置为对窗口对象上的onhashchange事件的回调(当然,当它可用时)。它还可以在某些条件下运行loadUrl
getHash: function(window) {
var match = (window || this).location.href.match(/#(.*)$/);
return match ? match[1] : '';
},
你有你的问题。location.href是firefox中的URI编码,但不在chrome中。因此,如果您在firefox中导航到另一个哈希(,带或不带触发器标志),主干将缓存哈希的未编码版本,然后将其与编码版本进行比较。如果您的散列包含一个应编码字符,则比较结果将为负数,主干将执行不应执行的路由处理程序
根据解决方案,人们以前说过,应该对URI进行编码。这个问题可能很老,但对我来说,这仍然是相关的。在我的例子中,编码url是不够的。我将主干中的GetHash()函数替换为:
getHash: function (t) {
var e = (t || this).location.href.match(/#(.*)$/);
return match ? this.decodeFragment(match[1]) : '';
}
您应该逐步使用未统一的主干源代码,特别是查找何时调用
loadUrl
,以及调用什么,因为这是运行回调的原因。我还发现,Mac上Firefox和Chrome+Safari中的backbone.js导航触发方式不同,我以前也遇到过这个问题,解决方法和编码有关。同样的事情也发生在发音符号上:你怎么看@AdamLockhart?嘿@Loamhoof,我也有类似的问题,但这次是在Mac上的Safari。在这里你可以找到问题:--基本上,我认为这是因为变音符号编码与否。如果单击第二个链接,url将由route函数解码。谢谢,托尼,它也在旅行中。你好,阿德里安弗雷斯库。我鼓励您修改主干代码,看看哪里出了问题,更具体地说,前面提到的checkUrl
函数可能是解决问题的关键。这个响应已经写了一段时间了(我想是主干1.0),但似乎主干的这部分代码自那时以来没有太大变化:。祝你好运,如果你解决了问题,请发布你的发现;)