在Firefox中触发两次 Backbone.js 导航

5q4ezhmt  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(155)

正在尝试使用Backbone的导航属性。

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中只记录了一次。
这里有什么问题吗?我最初甚至没有将trigger设置为true,Firefox忽略了这一点,仍然触发了URL。

z4bn682m

z4bn682m1#

我最近遇到了一个类似的问题,Firefox在一个Backbone.navigate之后调用了两个服务器。在我的例子中,这是因为我们没有对字符串进行编码。您的公司名称中有任何需要编码的字符吗?
您可以尝试:

this.navigate("week/" + escape(companyName) + "/" + employeeNo + "/" + weekEnd, { trigger: true, replace: false });
new9mtju

new9mtju2#

我也遇到了同样的问题,现在我来谈谈这个问题的根本原因。
正如大家之前提到的,问题来自URL编码,现在至于为什么这个问题只出现在Firefox中...
首先,我们来快速总结一下当哈希值发生变化时,路由是如何调用的。这里有3个关键函数:

*加载URL:该函数将调用路由处理程序。
*导航:这是一个用于手动更改路由的函数。2如果 trigger 标志被设置为 true,则该函数将调用 loadUrl
*检查URL:这个函数被设置为 window 对象上的 onhashchange 事件的回调函数(当然是在它可用的时候)。它还在某些条件下运行 loadUrl

现在,我们进入了有趣的部分。
当您执行navigate时,Backbone会快取您浏览的片段。杂凑变更时,也会呼叫checkUrl。这个函式会检查快取的杂凑是否相等目前的杂凑,如果您之前呼叫过navigate,就不会执行loadUrl,因为这表示它已经被呼叫过了。若要进行比较,checkUrl使用函数getFragment获取当前哈希值,该函数使用getHash。下面是getHash的代码:

getHash: function(window) {
  var match = (window || this).location.href.match(/#(.*)$/);
  return match ? match[1] : '';
},

你就有问题了。location.href 是在firefox中用URI编码的,但在chrome中不是。(有或没有the trigger flag),在firefox中,Backbone会缓存你的哈希值的未编码版本,然后将其与编码版本进行比较。如果你的哈希值包含一个应该被编码的字符,比较的结果将是否定的。并且 Backbone 网将执行它不应该执行的路由处理程序。
按照解决方案,嗯,人们以前说过,你的URI应该被编码。

6kkfgxo0

6kkfgxo03#

这个问题可能有点老了,但对我来说还是很重要的。对我来说,对url进行编码是不够的。我用以下代码替换了Backbone中的GetHash()函数:

getHash: function (t) { 
    var e = (t || this).location.href.match(/#(.*)$/);
    return match ? this.decodeFragment(match[1]) : '';
}

相关问题