Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firefox中的主干导航触发两次_Firefox_Backbone.js_Url Routing - Fatal编程技术网

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
现在,我们进入有趣的部分

当您运行导航时,主干将缓存您导航到的片段。也将调用散列更改,checkUrl。然后,此函数将检查缓存的哈希值是否等于当前哈希值,以便在之前调用导航时不执行加载URL,因为这意味着它已被调用。为了进行比较,checkUrl使用函数getFragment获取当前哈希值,该函数使用getHash。下面是getHash的代码:

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),但似乎主干的这部分代码自那时以来没有太大变化:。祝你好运,如果你解决了问题,请发布你的发现;)