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

时间:2013-02-24 11:58:13

标签: javascript html navigation unobtrusive-javascript ujs

我有一个包含多个Widget类别的网站部分。每个类别名称都有一个菜单。对于启用了Javascript的任何人,单击类别会显示页面中类别的内容。他们可以随意点击类别,看到DOM根据需要更新。该网址也使用标准哈希/ hashbang进行更新(如果我们对谷歌友好)。因此,对于登陆example.com/widgets的人,他们可以导航到example.com/widgets#oneexample.com/widgets#twoexample.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或单页面网站与多页面网站的优点或问题不感兴趣。

4 个答案:

答案 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功能。