在window.location.hash中使用斜杠

6
如果我这样更改哈希值:window.location.hash = "main/0/sub/1/na/false";。 浏览器中的地址将更改为http://mysite.com/#main/0/sub/1/na/false。 页面的onhashchange函数触发,一切都按预期工作。
但是,在Firebug中,我可以看到我还发送了一个请求:http://mysite.com/main/0/sub/1/na/false ... 没有哈希的URL,这会导致控制台中的静默404。
当我调试时,我发现它发生在window.location.hash点。
但是,如果我这样更改哈希值:window.location.hash = "main=0&sub=1&na=false";就不会发送其他请求。
为什么第一个示例会发送其他请求?
更新: 我注意到它会在window.location.hash之后,并在(期间?)$(window).bind('hashchange')之前发送请求。例如,如果我有...
window.location.hash = 'main/0/sub/1/na/false'; // Breakpoint 1 in Firebug

$(window).bind('hashchange', function(e) {
    e.preventDefault();   // Breakpoint 2 in Firebug
    e.stopPropagation();
});

当它停在断点1时,不会发送请求。当它停在断点2时,请求已经被发送。
我可以在Apache Tomcat中看到请求正在被发送。
我要补充的是,我已经插入了jQuery和jQuery Mobile。
更新2: 移除jQuery Mobile可以解决问题。但是,我需要它 :/
更新3
如果有人感兴趣: 使用jQuery Mobile:http://jsfiddle.net/pioSko/hz5PU/3/ 不使用jQuery Mobile:http://jsfiddle.net/pioSko/hz5PU/4/ 打开Firebug或其他调试应用程序并测试链接。

请求是否真正到达您的服务器?Firebug 和 Firefox 的哪个版本?我在这里没有看到它在一个非常老的版本上,也没有在一个新的 Chrome 上看到,所以我猜这可能是某个地方的 bug。 - Vasiliy Faronov
无法在FF 12.0和13.0.1中重现。在Firebug控制台上尝试了window.location.hash =“main/0/sub/1/na/false”,但在任意页面上没有观察到网络请求。 - lanzz
我创建了一个虚拟网站,但在其中无法重现这个错误。因此,问题肯定存在于代码更深的部分。 - pioSko
2个回答

3

在使用History.js时,我遇到了类似的问题。我认为这是该脚本的预期行为,因为它旨在使URL更加美观(非哈希)而又不重新加载页面。


1
看起来我遇到了相同的问题。这个问题在 History.js 项目中仍然没有解决,参见 https://github.com/browserstate/history.js/issues/301。你是如何解决它的?通过一些 History.js 的替代方案吗? - xmojmr
老实说,我有点想不起来我在2012年12月在干什么了,抱歉。最近在一些项目中使用Angular ui.router实现了类似的功能,效果非常好!虽然这显然是一个特定于Angular的解决方案。 - iameli
我通过不使用History.js或任何类似的东西来解决了这个问题。我只使用window.location.hash读/写和window.onhashchange事件,这对我的需求足够了。斜杠重写问题是由History.js(有168个未解决的问题)造成的,正如你的答案所指出的那样。我也考虑过devote/HTML5-history-API作为可用的替代方案(仍在更新且只有13个未解决的问题)。 - xmojmr

-4

我猜测一下。我相当肯定,在井号后使用斜杠是一个无效的 URL,而 Firefox 可能会试图通过删除井号来使其成为一个有效的 URL。


3
井号后面的斜杠是完全有效和正常的。 - Vasiliy Faronov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接