多页与单页和不显眼的 Javascript

Multipage vs Single Page and Unobtrusive Javascript

提问人:Undistraction 提问时间:2/24/2013 最后编辑:Ivan ButtinoniUndistraction 更新时间:1/11/2014 访问量:679

问:

我有一个网站的一部分,其中包含多个类别的 Widget。每个类别都有一个菜单名称。对于启用了 Javascript 的任何人,单击某个类别都会显示页面中该类别的内容。他们可以随意在类别之间单击,并根据需要查看更新的 DOM。该网址也使用标准哈希/哈希邦进行更新(如果我们对 Google 友好)。因此,对于登陆的人来说,他们可以导航到 、 等。example.com/widgetsexample.com/widgets#oneexample.com/widgets#twoexample.com/widgets#three

但是,为了支持未启用 Javascript 的用户代理,遵循这些类别链接之一必须加载一个显示类别的新页面,因此对于未启用 javascript 的人,他们将导航到 、 等。example.com/widgets/oneexample.com/widgets/twoexample.com/widgets/three

我的问题是:启用了 Javascript 的人登陆这些 URL 之一时会发生什么?例如,启用了 Javascript 的人在登陆 example.com/widgets/one 时应该看到什么?它们是否应该被重定向到 example.com/widgets#one

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

javascript html 导航 unobtrusive-javascript ujs

评论

2赞 Jukka K. Korpela 2/24/2013
somesite.com 是现有域;除非您真的是认真的,否则不要使用此类域;example.com 保留用作虚拟示例域。
0赞 Undistraction 2/24/2013
我已替换为 example.com
2赞 newtriks 2/24/2013
这篇博文提供了一些见解,可以为解决方案提供一些进一步的思考 jenitennison.com/blog/node/154
0赞 Undistraction 2/25/2013
@newtriks谢谢。那是一个很棒的帖子。
0赞 Bergi 2/27/2013
我认为主要问题应该是“如果 JS 残疾人登陆 example.com/widgets#two 会发生什么”?

答:

0赞 Varun Achar 2/27/2013 #1

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

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

评论

0赞 Undistraction 2/27/2013
我有点不清楚你的答案。你是在建议他得到未增强的单页吗?如果是这样,你就没有理解这个问题。
0赞 Varun Achar 2/28/2013
您稍后添加了有关多页与单页体验的部分。在不提供全部细节的情况下,如何理解您的要求?显然,如果这是您想要的,则应将用户重定向到启用javascript的页面。那么问题是什么呢?
0赞 Undistraction 2/28/2013
不。这从一开始就存在。最后增加了澄清。
2赞 bfavaretto 2/28/2013 #2

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

我需要为启用了 Javascript 的任何人提供单页网站体验

然后问:

例如,启用了 Javascript 的人在登陆时应该看到什么?它们是否应该被重定向到?example.com/widgets/oneexample.com/widgets#one

我会说是的,它们应该被重定向。鉴于您的要求,我没有看到任何其他选择(以及有关 JavaScript 功能和 URL 的哈希片段的信息在服务器端不可用)。


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

您可以执行类似操作:当脚本可用时,检测到您处于并添加指向单页版本的链接。我知道这并不理想,但总比没有好,也许比讨厌的客户端重定向要好。example.com/widgets/one

评论

0赞 Undistraction 2/28/2013
这对我来说感觉是一个糟糕的解决方案,因为它涉及加载两个单独的页面。如果可以在服务器端检测到用户代理的 JavaScript 功能,那就没问题了,但考虑到重定向必须是客户端的,这很讨厌。不要误会我的意思。你很可能是对的。我问这个问题是因为我认为这是一个有趣的问题,而不是因为一定有一个完美的答案。这很可能就是现实情况。
0赞 bfavaretto 2/28/2013
我明白了,并用另一个建议更新了我的答案。我希望存在其他替代方案,让我们看看是否有人想出其他方法。
0赞 bfavaretto 2/28/2013
@Pedr 您的锚点 href 是否实际上包含哈希片段?我正在考虑另一种选择(实际上,我目前正在我正在开发的网站上使用)。如果您的链接指向类似的东西,则可以在可用时使用 js 手动将哈希值添加到浏览器中。然后,页面的两个版本看起来都一样,尽管一个版本将使用 js/ajax 来加载内容,而另一个版本通常会请求新的 URL。实际上,这可能是最好的选择。/widgets/one
1赞 Undistraction 3/1/2013
我计划使用一个使用历史 API 的库,并且仅在浏览器无法支持时回退到使用哈希(IE8 和 IE9)。因此,至少这些浏览器需要客户端重定向回 example.com/widgets。对于支持 History API 的浏览器,登陆 example.com/widgets/one 在 URL 方面看起来与登陆 example.com/widgets 并导航到 example.com/widgets/one 没有什么不同。
0赞 Bertrand 3/3/2013 #3

设计此类页面的一种方法是首先在没有 javascript 的情况下进行设计。

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

example.com/widgets#one

将是指向 id 为“one”的元素的链接

一旦您的页面在没有 javascript 的情况下工作,您就会添加 javascript 层。您可以使用 event.preventDefault 阻止跟踪链接。

(https://developer.mozilla.org/fr/docs/DOM/event.preventDefault),然后添加所需的 javascript 功能。

6赞 Gary Stevens 3/4/2013 #4

我是这样构建的:

使用 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 没有运行时,您不必更改任何内容。

你是这个意思吗?

评论

0赞 Undistraction 3/9/2013
那么,当一个启用了 Javascript 但不支持历史 API 的浏览器登陆时,你会怎么做?example.com/widgets/three
0赞 Gary Stevens 3/12/2013
如果有 JS 但没有历史记录状态访问的人 example.com/widgets/three 他们应该得到一个完整的页面。就您网站的结构而言,所有 yoru 内容都应该可以通过完整的 URL 访问,您只需选择通过 ajax 加载它们即可。这有意义吗?
0赞 Undistraction 3/13/2013
你能澄清一下你所说的“整页”是什么意思吗?你的意思是他们得到一个页面,就像有人在禁用 JavaScript 的情况下登陆页面一样吗?
0赞 Gary Stevens 3/14/2013
是的,他们会得到和没有 JavaScript 一样的东西
0赞 Undistraction 3/14/2013
看,这对我来说就像是一种逃避。这正是我发布这个问题的原因。谷歌将索引的所有链接都将指向这些完整的页面,因此所有在启用了 JavaScript 的情况下关注这些链接的人都会获得没有 JavaScript 的人会得到的糟糕体验。不要误会我的意思。这似乎是很多人做事的方式,但这意味着唯一获得现代的、单页丰富的 JavaScript 体验的人是那些偶然看到索引页的人。