我正在使用jQuery地址库重新编写我的URL,具体取决于用户在页面中执行的操作。目的是允许用户为页面添加书签并稍后返回。页面永远不会刷新,因为所有服务器交互都是通过ajax完成的。
jQuery Address正在写这样的URL:
http://localhost:9000/#/u/scott_tiger
我需要在Play中设置一条路线,以便能够将该请求路由到相应的控制器。所以我设置了这个:
GET /#/u/{username} Controller.showUser
但这不起作用,路由定义被忽略。我尝试过很多东西,例如试图逃避“#”并用一个我用Character.toString(35)填充的变量替换它。这些都不起作用。
有没有人知道我怎么能正确定义路线或让jQuery地址不要写“#”。
编辑:“#”没有被发送到服务器。卫生署!好的,问题已修改。
答案 0 :(得分:9)
没有。 #
以及之后的网址不发送到服务器。因此,服务器上的播放应用程序永远不会看到这样的URL。
您需要使用JavaScript在客户端处理这些URL。在具有良好HTML5支持的现代浏览器中,您可以修改地址而无需重新加载页面。有关如何为这些浏览器执行此操作,请参阅Manipulating the browser history。有关浏览器支持,请参阅When can I use...。
在Internet Explorer和其他浏览器的旧版本上,您需要使用#
网址并使用JavaScript加载状态(例如,在您的示例中获取用户页面/u/scott_tiger
)。有关如何在JavaScript中执行此操作,请参阅How to run a JavaScript function when the user is visiting an hash link (#something) using JQuery?。此外,如果用户为具有#
- URL的页面添加书签,则需要重新加载状态。
另请参阅:What's the shebang/hashbang (#!) in Facebook and new Twitter URLs for?
您可以使用JavaScript库为您处理此问题history.js就是一个例子。像Backbone.js这样更大的框架也可以解决这个问题。
有谁知道如何让jQuery Address不要写“#”。
如果您没有写入#
- 部分网址,则无法关联该州。所以你不能回到例如Scott Tigers个人资料页面,如果您为该页面添加书签,因为该URL仅为http://localhost:9000/
,您将到达首页,而用户虽然会到达个人资料页面。
答案 1 :(得分:2)
凭借我对URL的新理解(感谢@Jonas),我意识到我错过了一半的故事。
我正在使用JQuery Address来更改网址,具体取决于您在应用程序中点击的内容。这适用于很多浏览器。我缺少的是使用JQuery Address来监视外部地址更改(书签,历史记录,后退/前进)并做出相应的响应。即通过触发适当的Ajax调用并正确呈现该数据来正确设置页面。
$.address.title("new title describing application state");
$.address.parameter("q", "val1");
$.address.parameter("g", "val2");
$.address.update();
$.address.externalChange(function(event) {
var val1 = event.parameters["q"];
var val2 = event.parameters["g"];
// do something with those values
});