例如,如果我输入网址:
http://www.foo.com/page.php?parameter=kickme#MOREURL
然后在服务器上没有任何部分:#MOREURL
可以在没有jQuery AJAX的情况下将这些部分发送到服务器吗?
答案 0 :(得分:41)
不,它仅适用于浏览器,因此您必须使用Javascript处理它。服务器无法读取它。
<强>解释强>
基本上,页面URL的哈希组件(#符号后面的部分)仅由浏览器处理 - 浏览器从不将其传递给服务器。遗憾的是,这是HTML标准的一部分,无论您是使用IE还是任何其他浏览器(以及PHP或任何其他服务器端技术)都是相同的。
以下是 Wikipedia 所说的内容:
片段标识符的功能与URI的其余部分不同:即,它的处理完全是客户端,没有服务器的参与。当代理(例如Web浏览器)从Web服务器请求资源时,代理会将URI发送到服务器,但不会发送该片段。相反,代理等待服务器发送资源,然后代理根据片段值处理资源。在最常见的情况下,代理将Web页面向下滚动到锚元素,该锚元素具有等于片段值的属性字符串。其他客户行为也是可能的
答案 1 :(得分:8)
http://tools.ietf.org/html/rfc2396#section-4
使用URI引用时 执行检索操作 识别资源,可选 片段标识符,分隔 由交叉阴影线(“#”)的URI 角色,包括额外的 参考信息 由用户代理解释 检索行动已经 成功完成。因此,它是 不是URI的一部分,但经常使用 与URI结合使用。
答案 2 :(得分:4)
由于浏览器默认情况下不向服务器发送哈希值,唯一的方法是使用一些Javascript:
当表单提交时,抓取哈希值(window.location.hash)并将其存储在服务器端隐藏的输入字段中将其放入ID为“urlhash”的DIV中,以便我们可以轻松找到它后面。
在服务器上,如果您需要对其执行某些操作,可以使用此值。如果需要,您甚至可以更改它。
在页面上加载客户端上的时,请检查此隐藏字段的值。您将希望通过其包含的DIV找到它,因为将不知道自动生成的ID。 是的,你可以使用.ClientID做一些技巧但我们发现使用包装器DIV更简单,因为它允许所有这些Javascript存在于外部文件中并以通用方式使用。 < / p>
如果隐藏的输入字段具有有效值,请将其设置为URL哈希(再次使用window.locaion.hash)和/或执行其他操作。
我们使用jQuery来简化字段的选择等等...总而言之,它最终只是一些jQuery调用,一个用于保存值,另一个用于恢复它。
提交前:
$("form").submit(function() {
$("input", "#urlhash").val(window.location.hash);
});
页面加载:
var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
window.location.hash = hashVal;
}
IsHashValid()可以检查“未定义”或其他您不想处理的事情。
另外,当然要确保适当地使用$(document).ready()。
答案 3 :(得分:4)
我想对 WHY 片段未发送到服务器的原因进行扩展。因为这是有意和理想的行为。我们来看整个URL字符串。
/path/to/element?query=string&for=server#?optional=fragment&for=browser
<----- URI ----> <---- QUERY STRING ---> <----- FRAGMENT STRING ------>
URI 唯一地指定从服务器获取的资源
QUERY 定义服务器在资源上执行的操作
FRAGMENT 控制浏览器(应用程序)行为。片段应该用于 存储应该对用户可见的应用程序状态,以便用户可以发送链接到另一个用户以获得相同的应用程序状态。
片段是URL的唯一部分,您可以透明地实现单页Web应用程序(例如,可以在您的移动电话上脱机运行)。 因此不得将其发送到服务器。
答案 4 :(得分:0)
哈希组件未传递到服务器,但在客户端广泛使用。具体来说,在单页应用程序中,哈希后面的文本用于将应用程序状态表示为不同的路由。因此,发生的情况是:只要用户通过单击定位标记导航到页面上的任何位置,便会向服务器发出初始请求,并向服务器提供“主页”页面以及包含客户端路由逻辑(例如路由器)的其他js文件的服务,仅更改了哈希组件后面的URL部分。这样可以防止对服务器的GET请求,并且响应此“ onhashchange”事件,可以根据确切的路由来更新单页应用程序的内容。