2

我在这里查看了所有最流行的问题,包括那些引用最流行的插件的问题,如 BBQ 和 jQuery Address。

但是,我缺少一些东西。我需要从我在这些项目中看到的任何事情中退后一步。他们假设了一些我显然没有的基本知识,并且我无法推断示例中的每一行代码实际上在做什么。

我想做四件事:

1) 使前进按钮像在非 AJAX 应用程序中一样工作。
2) 使后退按钮像在非 AJAX 应用程序中一样工作。
3)在地址栏中反映url,以便可以添加书签。
4) 生成深层链接,以便可以抓取 AJAX 内容。

仅此而已。其他任何事情都是多余的。这是一个 Rails 3.0.4 应用程序,我的链接都带有“#”的 href。单击其中一个链接会激活 application.js 中的一个函数,该函数将当前页面上 div 中的 html 替换为从 .js.erb 文件呈现的部分创建的更多链接。

我有一个运行良好的面包屑路径,但是在查看应用程序之前,使用后退按钮会将您带到您正在查看的任何网站。

所以我的一些问题是:

1) 我的每个链接都需要唯一的 href 值而不是简单的“#”吗?
2)我应该每次都替换那个div,还是简单地隐藏它并创建一个新的。如果是这样,每个新的 div 是否应该有一个新的 id?
3) 由于当前地址栏中的 url 没有改变,并且这些 AJAX 请求都是 POST,我是否必须在 Rails 中做任何事情来使其响应这些新 URL 之一,这些新 URL 在访问时总是会触发 GET 请求通过浏览器历史记录或后退按钮?

这些是使我无法解决现有问题的障碍。非常感谢您提供的任何帮助!

编辑:

我的应用程序不是基于标签的。页面加载时并非所有锚点都可用。以下是用户单击链接时发生的情况:

1) 隐藏表单中的字段被点击的链接的文本值填充。

2) 隐藏表单被序列化并通过 POST 传递给控制器​​动作。

3) 控制器动作确定谁提出了请求,确定他们可以访问哪些数据,并使用表单值(现在是参数)来检索对象列表。

4) 这些对象被传递给一个 .js.erb 视图模板,该模板又用传递的值渲染一个部分。

5)新链接通过.js.erb模板中的js反弹。

基本上,由于我的数据不是静态的,我需要弄清楚如何使用表单状态重新生成该 POST 请求,以便真正“返回”。还是可以以某种方式缓存表单状态和屏幕?

4

2 回答 2

1

基本上在 ajax 应用程序中启用后退按钮技巧它使用 url 中的 hash 方法,例如,如果您在www.myurl.com发出 ajax 请求并且想要显示不同的页面或不同区域时,您将执行操作并将 url 更改为www.myurl.com#myaction

有关更多信息,remy sharp 有一个截屏视频,您应该查看它启用后退按钮

于 2011-02-24T16:03:35.040 回答
1

1) 我的每个链接都需要唯一的 href 值而不是简单的“#”吗?

是的,浏览器只检测 URL 的变化。如果当前 url 是 foo.com/#,并且用户点击了一个链接,将他带到 foo.com/#,那么历史应该如何知道他去了任何地方?

因此,您在 # 之后放置了唯一的文本。foo.com/#home 和 foo.com/#about 将生成唯一的历史条目。然后,当用户为其中一个添加书签时,您可以解析 URL 的后半部分以找出他在哪里。

2)隐藏和交换div,还是替换?

如果您不每次都获取每个 div 的内容,您将节省流量开销。如果内容足够小,请将其全部放在页面中,然后隐藏/显示 div。如果内容很大,请仅在他们第一次点击时获取。即我在A上并单击B,您应该隐藏A并发出ajax请求以获取B的内容,然后显示B。然后如果我单击返回A,则显示已经存在的A并隐藏B。不需要在您已经拥有 A 时发出另一个服务器请求以获取它。

3) 由于目前地址栏中的 url 没有改变,而且这些 AJAX 请求都是 POST,我是否必须在 Rails 中做任何事情来使其响应这些新 URL 之一,这些新 URL 在访问时总是会触发 GET 请求通过浏览器历史记录或后退按钮?

新 URL 不会在每次使用后退按钮时触发 GET 请求。# 样式的方便之处在于 # 之后的任何内容都不会发送到服务器。即,如果您访问 foo.com/bar.html#home,客户端会向 foo.com/bar.html 发出 GET 请求。然后,如果用户转换到 foo.com/bar.html#about,浏览器不会自行发出另一个请求。# 最初用于表示指向同一页面中内容的链接(即,一个大文档,您可能希望在其中有一个链接到每章顶部的索引)。

于 2011-02-24T16:21:33.470 回答