我有一个包含多个Widget类别的网站部分。每个类别名称都有一个菜单。对于启用了Javascript的任何人,单击类别会显示页面中类别的内容。他们可以随意点击类别,看到DOM根据需要更新。该网址也使用标准哈希/ hashbang进行更新(如果我们对谷歌友好)。因此,对于登陆example.com/widgets
的人,他们可以导航到example.com/widgets#one
,example.com/widgets#two
,example.com/widgets#three
等。
但是,要支持未启用Javascript的用户代理,请按照其中一个类别链接加载显示类别的新页面,因此对于未启用javascript的用户,他们会导航到example.com/widgets/one
,{{1} },example.com/widgets/two
等。
我的问题是:当某人启用Javascript 登陆其中一个网址时会发生什么?例如,登陆example.com/widgets/three
时,某人启用了Javascript 会出现什么情况?是否应将其重定向到example.com/widgets/one
?
请注意,对于启用了Javascript的任何人,我都需要单页网站体验,但我想要一个没有JavaScript的用户代理的多页网站。任何没有解决这个问题的答案都没有回答这个问题。我对hashbangs或单页面网站与多页面网站的优点或问题不感兴趣。
答案 0 :(得分:6)
这就是我如何构建它:
使用HistoryJS管理网址。 JS pushstate浏览器获得了完整正确的URL,JS非pushstate浏览器获得了散列网址。非JS用户通过页面重新加载正常访问完整的URL。
当用户点击链接时
如果他们有JS: 对其他页面的所有单击都由一个阻止默认操作的函数处理,获取HREF并将URL传递给ajax请求并同时更新URL。然后解析该ajax请求的http响应,然后将其加载到内容区域中。
非JS: 页面正常刷新并加载整个文档。
加载页面时
使用JS:将事件处理程序附加到所有链接以防止默认值,以便通过Ajax处理它们的href。
没有JS:没什么。让锚点正常工作。
我认为您绝对应该通过完整,正确的URL访问所有内容,然后通过ajax加载它,然后更新URL以反映您从中获取内容的地址。这样,当JS没有运行时,您不必更改任何内容。
这是你的意思吗?
答案 1 :(得分:2)
显然你的问题已经包含了答案。你说:
对于启用了Javascript的任何人,我都需要单页网站体验
然后问:
例如,登陆
example.com/widgets/one
时,应该向具有Javascript功能的用户展示什么?它们应该重定向到example.com/widgets#one
吗?
我会说是的,应该重定向。鉴于您的要求(以及有关JavaScript功能的信息和URL的哈希片段在服务器端不可用),我没有看到任何其他选项。
如果你能接受一点放宽要求,我会看到另一种选择。还记得当网络上挤满了框架集时,我们通过AltaVista登陆了一个特定的框架(Google还没有!)搜索?通常会看到一个标题,表示该页面应该显示为一个框架,以及一个将用户带到框架集版本的链接。
您可以执行类似的操作:当脚本可用时,检测您位于example.com/widgets/one
并添加指向单页版本的链接。我知道这不是理想的,但它总比没有好,也许比讨厌的客户端重定向要好。
答案 2 :(得分:0)
为什么需要将它们重定向到其他页面。用户到达页面寻找答案。即使他启用了javascript,他也会得到答案。没关系。用户的查询已经完成。
但是如果用户登陆example.com/widgets#one会发生什么?在这种情况下,您需要设置自动重定向到example.com/widgets/one。这可以通过检查onload
事件中是否启用了javascript并重定向到相应的页面来完成。
答案 3 :(得分:0)
设计此类页面的一种方法是首先设计没有javascript。
您可以在页面中使用锚点:
example.com/widgets#one
将是id为'one'
的元素的链接一旦您的页面无需javascript,您就可以添加javascript图层。您可以使用event.preventDefault阻止链接。
(https://developer.mozilla.org/fr/docs/DOM/event.preventDefault),然后添加所需的javascript功能。