jQuery无法返回URL哈希。

4

我试图获取当前页面的哈希值,但没有成功。我以这样的链接来定位一个页面:

http://www.mydomain.com/test.html#hash

我用于测试的 jQuery 代码如下:

$(document).ready(function() {
  if (window.location.hash){
      console.log ("FOUND HASH");
  }else{ 
      console.log ("HASH NOT FOUND");
  }
});

无论我做什么,哈希值总是空的“”。然而当我在Firebug中断点代码并查看DOM时,我可以清楚地看到哈希值在window.location.hash下正确设置。 我错在哪里了? 提前感谢您的帮助。
答案摘要: 事实证明,伪装网址会在整个页面周围创建一个框架包装器,在这种情况下,使用不同的端口。哈希由父框架保留,但丢失给子框架,并且无法通过jQuery代码访问。使用直接的非加载地址将产生正确的行为。

如果您将其从文档准备好的函数中移除会怎样?如果您只是执行 alert(window.location.hash),我确信这应该可以工作... 您使用的是哪个浏览器?您能给我们提供其他上下文吗? - d-_-b
无论在或外 doc ready 中都不起作用。我在 FF 和 chrome 控制台中都看到了这个问题。已添加上面的演示页面。 - Rob
顺便提一下,HTML5规范已经将frameframeset标记定义为废弃元素。http://www.w3.org/TR/html5-diff/#obsolete-elements - Nirvana Tikku
如下在回答评论中提到的,该框架是由我的DNS提供商使用的网址伪装机制在我不知情的情况下添加的。 - Rob
3个回答

1
哈希值在您的顶层框架/窗口中。 您的JavaScript不在该顶层窗口中。 因此,当您引用window.location.hash时,您正在查看您框架的URL,而不是显示在浏览器栏中的顶层窗口。
由于您的顶层窗口和内部框架不是相同的域/端口,因此您可能无法在两者之间通信。 使它们成为相同的域,您可以从顶层窗口(在浏览器URL栏中显示)获取window.location.hash。
如果您的域相同,因此不会遇到same-origin security restrictions,则可以使用以下内容从顶级URL获取哈希:
window.top.location.hash

顺便提一下,最顶层的窗口中只有这个内容(这不是你的Javascript所在的地方):

<HTML><HEAD>
<META NAME="description" CONTENT="robtune.com">
<META NAME="keywords" CONTENT="">
</HEAD>
<FRAMESET border=0 rows="100%,*" frameborder="no" marginleft=0 margintop=0 marginright=0 marginbottom=0>
<frame src="http://www17.robtune.com:8017/test.html" scrolling=auto frameborder="no" border=0 noresize>
<frame topmargin="0" marginwidth=0 scrolling=no marginheight=0 frameborder="no" border=0 noresize>
</FRAMESET>
</HTML>

糟糕,这是从哪里来的?我想我可能做了一些愚蠢的事情,但我并不完全明白。我要回到学校去了... - Rob
AHA!我认为这是在Zonedit的DNS设置中使用“webforward”和/或“cloaking”的副产品。所有*.mydomain.com的请求都会重定向到www17.mydomain.com:myport,该网址指向我的Web服务器。 - Rob
@Rob - 是的,那听起来像是正确的分析。你可能需要设置一个 CNAME 到你的 Web 服务器 IP 地址,这样域名就可以直接访问你的 Web 服务器,而不是使用伪装。 - jfriend00

1
你可以尝试这个:

window.parent.location.hash

这不起作用,很可能是因为父框架具有与上述不同的端口。 - Rob

0

你是否在页面中使用了IFRAME并尝试获取哈希值?

请提供演示URL,以便我们能够快速回答您的问题。更新:

您可以使用:

window.parent.location.hash来获取哈希值。


哦,伙计,你正在使用FRAMESET和FRAMES,这就是你没有收到HASH的原因。你可以尝试window.parent.location.hash。 - Syed Abdul Qadeer
看起来我是,但我不明白为什么。 - Rob
@Rob:每个框架都有自己的文档,并且它将独立运行。例如,您在框架上单击任何链接时,它将重定向到其他页面,而不会对父体进行任何操作。它将表现为在单独的窗口中运行。提供给此窗口的URL没有哈希值"http://www.yourdomain.com/test.html",因此您会收到哈希未找到的错误消息。 - Syed Abdul Qadeer
但是当您使用Firebug时,它会显示父窗口的哈希值而不是框架的哈希值。但是当您使用window.parent.location.hash时,框架将理解您需要父URL的哈希值,并为您提供定义的哈希值。 - Syed Abdul Qadeer
谢谢您的解释,但我不理解的部分是,当我的HTML中肯定没有框架时,我是如何使用框架的。后来我发现,这个框架是作为掩盖我的网址的机制而被添加的。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接