167

我正在编写一个 AJAX 应用程序,但是当用户在应用程序中移动时,我希望地址栏中的 URL 能够更新,尽管没有重新加载页面。基本上,我希望他们能够在任何时候添加书签,从而返回到当前状态。

人们是如何处理在 AJAX 应用程序中维护 RESTful 的?

4

8 回答 8

117

执行此操作的方法是location.hash在 AJAX 更新导致您希望拥有一个离散 URL 的状态更改时进行操作。例如,如果您的页面的 url 是:

http://example.com/

如果客户端函数执行此代码:

// AJAX code to display the "foo" state goes here.

location.hash = 'foo';

然后,浏览器中显示的 URL 将更新为:

http://example.com/#foo

这允许用户为页面的“foo”状态添加书签,并使用浏览器历史记录在状态之间导航。

有了这个机制,您需要在客户端使用 JavaScript 解析出 URL 的哈希部分,以创建和显示适当的初始状态,因为片段标识符(# 之后的部分)不会发送到服务器。

如果您使用 jQuery,Ben Alman 的 hashchange 插件使后者变得轻而易举。

于 2008-08-04T18:04:48.547 回答
18

查看诸如 book.cakephp.org 之类的网站。此站点更改 URL 而不使用哈希并使用 AJAX。我不确定它是如何做到的,但我一直在试图弄清楚。如果有人知道,请告诉我。

在查看某个项目中的导航时也是 github.com。

于 2011-02-13T19:47:18.803 回答
17

在使用 Ajax 时,作者不太可能想要重新加载或重定向他的访问者。但是为什么不使用 HTML5 的pushState/replaceState呢?

您可以随意修改地址栏。使用 AJAX 获得看起来自然的 url。

查看我最新项目的代码:http: //iesus.se/

于 2011-04-27T08:09:23.733 回答
11

这与凯文所说的相似。您可以将您的客户端状态作为一些 javascript 对象,当您想要保存状态时,您可以序列化该对象(使用 JSON 和 base64 编码)。然后,您可以将 href 的片段设置为此字符串。

var encodedState = base64(json(state));
var newLocation = oldLocationWithoutFragment + "#" + encodedState;

document.location = newLocation; // adds new entry in browser history
document.location.replace(newLocation); // replaces current entry in browser history

第一种方式会将新状态视为新位置(因此后退按钮会将它们带到上一个位置)。后者没有。

于 2008-08-04T18:02:03.933 回答
3

SWFAddress 在 Flash 和 Javascript 项目中工作,并允许您创建可收藏的 URL(使用上面提到的哈希方法)以及为您提供后退按钮支持。

http://www.asual.com/swfaddress/

于 2008-09-01T13:43:36.893 回答
3

window.location.hash 方法是首选的做事方式。有关如何执行此操作的说明,请 参阅 Ajax 模式 - 唯一 URL

YUI 将这种模式实现为一个模块,其中包括 IE 特定的解决方法,用于使后退按钮与使用哈希重写地址一起工作。YUI 浏览器历史管理器

其他框架也有类似的实现。重要的一点是,如果您希望历史记录与重写地址一起工作,不同的浏览器需要不同的处理方式。(这在第一篇链接文章中有详细说明。)

IE 需要一个基于 iframe 的 hack,Firefox 将使用相同的方法产生双重历史记录。

于 2009-03-31T05:54:01.487 回答
3

如果 OP 或其他人仍在寻找一种方法来修改浏览器历史记录以启用状态,那么按照 IESUS 的建议,使用 pushState 和 replaceState 是现在的“正确”方法。与 location.hash 相比,它的主要优势似乎在于它创建了实际的 URL,而不仅仅是哈希。如果保存了使用哈希的浏览器历史记录,然后在禁用 JavaScript 的情况下重新访问,则应用程序将无法运行,因为哈希不会发送到服务器。但是,如果已使用 pushState,则整个路由将被发送到服务器,然后您可以构建该服务器以适当地响应路由。我看到了一个例子,在服务器端和客户端都使用了相同的胡子模板。如果客户端启用了 JavaScript,他将通过避免往返服务器来获得快速响应,但如果没有 JavaScript,该应用程序将完全正常工作。因此,应用程序可以在没有 JavaScript 的情况下优雅地降级。

另外,我相信那里有一些框架,名称类似于 history.js。对于支持 HTML5 的浏览器,它使用 pushState,但如果浏览器不支持它,它会自动回退到使用散列。

于 2011-06-23T09:20:36.013 回答
2

检查用户是否在页面中,当您单击 URL 栏时,JavaScript 会说您不在页面中。如果您更改 URL 栏并在其中按带有符号“#”的“ENTER”,然后您再次进入该页面,而无需使用鼠标光标手动单击该页面,那么来自 JavaScript 的键盘事件命令 (document.onkeypress) 将能够检查它是否进入并激活 JavaScript 以进行重定向。您可以使用 window.onfocus 检查用户是否在页面中,并使用 window.onblur 检查他是否在页面外。

是的,有可能。

;)

于 2010-10-13T23:18:50.833 回答