多页与单页、不引人注目的Javascript

多页与单页、不引人注目的Javascript,javascript,html,navigation,unobtrusive-javascript,ujs,Javascript,Html,Navigation,Unobtrusive Javascript,Ujs,我有一个网站的一部分,有多个小部件类别。每个类别名称都有一个菜单。对于启用Javascript的任何人,单击一个类别将显示页面中该类别的内容。他们可以随意在类别之间单击,并根据需要更新DOM。url也会使用标准哈希/hashbang进行更新(如果我们对谷歌友好的话)。因此,对于登陆example.com/widgets的人,他们可以导航到example.com/widgets#one,example.com/widgets#two,example.com/widgets#three等 但是,要支

我有一个网站的一部分,有多个小部件类别。每个类别名称都有一个菜单。对于启用Javascript的任何人,单击一个类别将显示页面中该类别的内容。他们可以随意在类别之间单击,并根据需要更新DOM。url也会使用标准哈希/hashbang进行更新(如果我们对谷歌友好的话)。因此,对于登陆
example.com/widgets
的人,他们可以导航到
example.com/widgets#one
example.com/widgets#two
example.com/widgets#three

但是,要支持未启用Javascript的用户代理,在这些类别链接之一之后必须加载显示类别的新页面,因此对于未启用Javascript的用户,他们将导航到
example.com/widgets/one
example.com/widgets/two
example.com/widgets/three

我的问题是:当启用了Javascript的人登录到其中一个URL时会发生什么?例如,当登录
example.com/widgets/one
时,启用了Javascript的人应该展示什么?是否应该将它们重定向到
example.com/widgets\one


请注意,对于启用Javascript的任何人,我都需要一个单页站点体验,但我希望为没有Javascript的用户代理提供一个多页站点。任何不解决这个事实的答案都不能回答这个问题。我对hashbang或单页站点与多页站点的优点或问题不感兴趣。

为什么需要将它们重定向到其他页面。用户到达页面寻找答案。即使启用了javascript,他也会得到答案。没关系。用户的查询已完成


但是如果用户登陆example.com/widgets#one会发生什么呢?在这种情况下,您需要设置到example.com/widgets/one的自动重定向。这可以通过检查
onload
事件中是否启用了javascript并重定向到相应页面来实现。

显然,您的问题已经包含了答案。你说:

我需要一个单页的网站经验与Javascript启用的任何人

然后问:

例如,当登录
example.com/widgets/one
时,启用了Javascript的人应该展示什么?是否应该将它们重定向到
example.com/widgets#one

我想说是的,它们应该被重定向。考虑到您的需求(以及关于JavaScript功能和URL哈希片段的信息在服务器端不可用的事实),我看不到任何其他选项


如果你能接受放宽一点要求,我会看到另一个选择。还记得当时网络上充斥着框架集,我们通过AltaVista(谷歌还没出现!)搜索到一个特定的框架吗?通常会看到一个标题说页面应该显示为一个框架,以及一个将用户带到框架集版本的链接


您可以做类似的事情:当脚本可用时,检测您位于
example.com/widgets/one
,并添加到单页版本的链接。我知道这并不理想,但总比没有好,也许比糟糕的客户端重定向要好。

设计这样的页面的一种方法是先不使用javascript进行设计

您可以在页面中使用锚定,以便:

example.com/widgets#one
将是指向id为“one”的元素的链接

一旦页面在没有javascript的情况下工作,那么就添加javascript层。您可以通过使用event.preventDefault来防止链接被跟随


(),然后添加所需的javascript功能。

我将这样构造它:

用于管理URL。JS pushstate浏览器获得完全正确的URL,JS非pushstate浏览器获得哈希URL。非JS用户通过页面重新加载正常访问完整URL

当用户单击链接时:

如果他们有JS: 对其他页面的所有单击都由一个函数处理,该函数阻止默认操作,获取HREF并将URL传递给ajax请求,同时更新URL。然后解析该ajax请求的http响应,然后将其加载到内容区域

非JS: 页面按正常方式刷新并加载整个文档

页面加载时:

使用JS:将事件处理程序附加到您的所有链接,以防止出现默认链接,从而通过Ajax处理它们的href

没有JS:什么都没有。允许锚正常工作

我认为你应该通过一个完整的、正确的URL访问你的所有内容,并通过ajax加载它,然后更新URL以反映你从哪里获得内容的地址。这样,当JS不运行时,您就不必更改任何内容


这就是你的意思吗?

somesite.com是一个现有的域名;不要使用这些域名,除非你真的想使用它们;example.com保留用作虚拟示例域。我已将其替换为example.com此博客文章提供了一些见解,可以为@newtriks解决方案提供一些进一步的思考,谢谢。这是一篇很棒的帖子。我认为主要的问题应该是“如果一个JS禁用的人登陆
example.com/widgets#two
”?我不太清楚你的答案。你是在暗示他会被送达未增强的一页吗?如果是这样,您就无法理解这个问题。您在后面添加了关于多页体验与单页体验的部分。。在你没有给出全部细节的情况下,如何理解你的需求?显然,如果这是您想要的,那么应该将用户重定向到启用javascript的页面。。那问题是什么?不,从一开始就是这样。会议上的澄清