昨天早上我注意到谷歌搜索正在使用哈希参数:
这似乎与更常见的搜索相同(搜索?q =客户端+ URL +参数)。 (在使用他们的表单进行搜索时,似乎他们不再默认使用它。)
为什么他们这样做?
更一般地说,我看到很多网站都出现了哈希参数。这是好事吗?这是一个黑客?它是否与REST原则背道而驰?我想知道我是否应该在Web应用程序中使用这种技术,以及何时使用。
有一个discussion by the W3C of different use cases,但我看不出哪一个适用于上面的例子。他们似乎还没有就建议做出决定。
答案 0 :(得分:5)
Google有许多实时实验功能,可根据您的偏好,位置和其他因素打开/关闭(也可能是随机选择。)我很确定您提到的那个也是其中之一。
当使用散列而不是查询字符串参数时,在后台发生的事情是它使用JavaScript查询“真实”URL(http://www.google.com/search?q=hello),然后使用内容修改现有页面。这将对用户显得更加敏感,因为页面不必完全重新加载。哈希的原因是维护浏览器历史和状态。如果你转到http://www.google.com/#q=hello,你会发现你实际上得到了“hello”的搜索结果(即使你的浏览器真的只是请求http://www.google.com/)关闭JavaScript,它也行不通,您只需获得Google首页。
随着动态网站成为常态,哈希出现的越来越多。哈希值完全在客户端上维护,因此在更改时不会产生服务器请求。这使得它们成为维护Web应用程序不同状态的唯一地址的绝佳选择,同时仍然位于完全相同的页面上。
我最近一直在使用它们,你可以在这里找到一个例子:http://blixt.org/js - 如果你看一下该页面上的“Hash”库,你会看到我的实现支持跨浏览器的哈希值。
这里有一个使用哈希来存储状态的指南:
在哈希中维护状态意味着您的应用程序(我将其称为应用程序,因为您通常仅在更高级的Web解决方案中使用哈希值)依赖于JavaScript。没有JavaScript,哈希的唯一功能就是告诉浏览器在页面的某个地方找到内容。
一旦您实现了一些JavaScript来检测哈希的更改,下一步就是将哈希解析为有意义的数据(就像查询字符串参数一样。)
在哈希中获得状态后,您的代码(或您的用户)可以修改它以表示应用程序中的当前状态。你想要这么做的原因有很多。
一个常见的情况是,当页面的一小部分基于变量而发生变化时,重新加载整个页面以反映该更改将是低效的(例如:您有一个带有标签的框。活动标签可以在哈希中识别。)
其他情况是您在JavaScript中动态加载内容,并且想要告诉客户端要加载哪些内容(例如:http://beta.multifarce.com/#?state=7001,将带您到文本冒险中的特定点。)
如果您查看我的“JavaScript领域”,您会看到边界线过度杀伤案例。我这样做只是因为我想尽可能多地将JavaScript动态加入到该页面中。在一个正常的项目中,我会对何时这样做保守,只有当你看到以下一个或多个方面的积极变化时才会这样做:
这是一个很大的威慑力量。虽然您可以安全地依赖99%的用户使浏览器能够使用具有状态哈希值的页面,但仍有许多情况下您根本无法依赖此状态。例如,搜索引擎抓取工具。虽然谷歌一直在努力让他们的抓取工具使用最新的网络技术(你知道他们将Flash应用程序编入索引吗?),但它仍然不是一个人,也无法理解某些东西。
基本上,您处于兼容性和用户体验之间的十字路口。
但你可以随时在中间建立一条道路,这当然需要更多的工作。用更少的隐喻术语:实现两个解决方案,以便为输出相关内容的每个客户端URL都有一个服务器端URL。对于兼容的客户端,它会将它们重定向到哈希URL。通过这种方式,Google可以将“硬”URL编入索引,当用户点击它们时,它们就会获得动态状态!
答案 1 :(得分:2)
最近谷歌也停止在搜索结果中提供直接链接,而不是重定向。
我认为两者都与收集使用统计信息,同一用户执行的搜索,按什么顺序,用户遵循的搜索结果等等有关。
P.S。现在,这很有趣,直接链接又回来了。我绝对记得在过去的几周内只看到重定向。他们肯定在试验一些东西。