提问人:Undistraction 提问时间:2/24/2013 最后编辑:Ivan ButtinoniUndistraction 更新时间:1/11/2014 访问量:679
多页与单页和不显眼的 Javascript
Multipage vs Single Page and Unobtrusive Javascript
问:
我有一个网站的一部分,其中包含多个类别的 Widget。每个类别都有一个菜单名称。对于启用了 Javascript 的任何人,单击某个类别都会显示页面中该类别的内容。他们可以随意在类别之间单击,并根据需要查看更新的 DOM。该网址也使用标准哈希/哈希邦进行更新(如果我们对 Google 友好)。因此,对于登陆的人来说,他们可以导航到 、 等。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 之一时会发生什么?例如,启用了 Javascript 的人在登陆 example.com/widgets/one
时应该看到什么?它们是否应该被重定向到 example.com/widgets#one
?
请注意,我需要为启用了 Javascript 的任何人提供单页网站体验,但我希望为没有 JavaScript 的用户代理提供多页面网站。任何没有解决这一事实的答案都不能回答这个问题。我对哈希bangs或单页网站与多页网站的优点或问题不感兴趣。
答:
为什么您需要将它们重定向到其他页面。用户到达页面以寻找答案。即使他启用了 javascript,他也会得到答案。这不重要。用户的查询已完成。
但是,如果用户登陆 example.com/widgets#one 会发生什么?在这种情况下,您需要设置自动重定向到 example.com/widgets/one。这可以通过检查事件中是否启用了 javascript 并重定向到相应的页面来完成。onload
评论
显然,您的问题已经包含答案。你说:
我需要为启用了 Javascript 的任何人提供单页网站体验
然后问:
例如,启用了 Javascript 的人在登陆时应该看到什么?它们是否应该被重定向到?
example.com/widgets/one
example.com/widgets#one
我会说是的,它们应该被重定向。鉴于您的要求,我没有看到任何其他选择(以及有关 JavaScript 功能和 URL 的哈希片段的信息在服务器端不可用)。
如果你能接受放宽一点要求,我看到了另一种选择。还记得当网络上充斥着框架集时,我们通过AltaVista(Google还没有出现!)搜索登陆特定的框架吗?通常会看到一个标题,说页面应该显示为一个框架,以及一个将用户带到框架集版本的链接。
您可以执行类似操作:当脚本可用时,检测到您处于并添加指向单页版本的链接。我知道这并不理想,但总比没有好,也许比讨厌的客户端重定向要好。example.com/widgets/one
评论
/widgets/one
设计此类页面的一种方法是首先在没有 javascript 的情况下进行设计。
您可以在页面中使用锚点,以便:
example.com/widgets#one
将是指向 id 为“one”的元素的链接
一旦您的页面在没有 javascript 的情况下工作,您就会添加 javascript 层。您可以使用 event.preventDefault 阻止跟踪链接。
(https://developer.mozilla.org/fr/docs/DOM/event.preventDefault),然后添加所需的 javascript 功能。
我是这样构建的:
使用 HistoryJS 管理 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 没有运行时,您不必更改任何内容。
你是这个意思吗?
评论
example.com/widgets/three
评论
example.com/widgets#two
会发生什么”?