用于管理应用程序状态的JQuery Address的简单示例

时间:2011-12-09 15:39:30

标签: java jquery playframework url-routing fragment-identifier

我正在使用jQuery地址库重新编写我的URL,具体取决于用户在页面中执行的操作。目的是允许用户为页面添加书签并稍后返回。页面永远不会刷新,因为所有服务器交互都是通过ajax完成的。

jQuery Address正在写这样的URL:

http://localhost:9000/#/u/scott_tiger

我需要在Play中设置一条路线,以便能够将该请求路由到相应的控制器。所以我设置了这个:

GET     /#/u/{username}                Controller.showUser

但这不起作用,路由定义被忽略。我尝试过很多东西,例如试图逃避“#”并用一个我用Character.toString(35)填充的变量替换它。这些都不起作用。

有没有人知道我怎么能正确定义路线或让jQuery地址不要写“#”。

编辑:“#”没有被发送到服务器。卫生署!好的,问题已修改。

2 个答案:

答案 0 :(得分:9)

没有。 #以及之后的网址发送到服务器。因此,服务器上的播放应用程序永远不会看到这样的URL。

HTML5解决方案

您需要使用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库

您可以使用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
});