Javascript Chrome不返回哈希值

Javascript Chrome不返回哈希值,javascript,jquery,google-chrome,hash,Javascript,Jquery,Google Chrome,Hash,如果jQueryJavaScript在URL末尾返回哈希值,我将使用以下代码段。它在FF中工作良好,但第4行的警报在Chrome中返回空 似乎window.location.hash.substring(1)行不起作用。我还尝试了window.location.hash.replace(“#“,”) 在Chrome中从URL检索哈希值的技巧是什么 URL的构建方式如下: http://www.ourdomain.com/thispage.html#IL 其中,IL是一个州的两个字母缩写。我想得

如果jQueryJavaScript在URL末尾返回哈希值,我将使用以下代码段。它在FF中工作良好,但第4行的警报在Chrome中返回空

似乎
window.location.hash.substring(1)
行不起作用。我还尝试了
window.location.hash.replace(“#“,”)

在Chrome中从URL检索哈希值的技巧是什么

URL的构建方式如下:

http://www.ourdomain.com/thispage.html#IL
其中,IL是一个州的两个字母缩写。我想得到“IL”

我这里有一个工作演示:

单击Chrome中的“按状态搜索”选项卡,然后单击某个状态,您将看到该问题。浏览器显示它要转到的url已正确构建


谢谢。

在Chrome中,只能设置哈希将锚定,例如:

<a href="#exemplo" />

您可以尝试以下方法:

$(window).on('hashchange', function() {
    console.log(window.location.hash.substring(1));
});
click事件在hashchange事件之前触发,因此您不能依赖map click实现(即使您延迟了它)

hashchange支持的浏览器列表:

如果您不必使用哈希,这里有一个更简单的解决方案:

$("#tab2.tab_content #map a").click(function() {
    console.log($(this).attr('href').substring(1));
});

总之,你不应该使用任何延迟的方法。

问题不是很明显,还是我太傻了?在下面的函数中,您处理地图上的单击,收听
单击
,将它们延迟
500ms
,然后运行您的函数

$("#tab2.tab_content #map").delayed('click', 500, function() {
  state = window.location.hash.substring(1);
  alert(state);
  jsonLink = 'http://ml.uscm.org/ministries.json?state=' + state + '&active=true&callback=?';
  getMapResults();
  return false;
});
但是在您的
警报
状态
时,它是空的,因为您尚未设置它。您的
返回false还将阻止浏览器更改哈希

试试这个功能,我打赌你会得到一些东西:

$("#tab2.tab_content #map").delayed('click', 500, function() {
  setTimeout(function(){
    var state = window.location.hash.substring(1);
    alert(state);
    jsonLink = 'http://ml.uscm.org/ministries.json?state=' + state + '&active=true&callback=?';
    getMapResults();
  }, 500);
});
使其工作的快速方法是执行以下操作:

$("#tab2.tab_content #map a").delayed('click', 500, function(e) {
  state = $(this).attr('href').replace('#', '');
  alert(state);
});
然后,还可以通过将以下内容添加到回调中,轻松地手动更改哈希:

window.location.hash = state;

但是你真正的问题是你的
a
(锚定)没有改变散列本身,这使得你的代码中似乎有某个地方在阻止它。

你如何修改一下你的代码

$("#tab2.tab_content #map a").click(function(){
 console.log($(this).attr("href"));//this outputs the value to the console
});
这将为加利福尼亚州输出#CA

i、 e


在您的代码中,如果在触发事件时放置断点(ln36
state=window.location.hash.substring(1);
),则窗口尚未更改位置,因此哈希在该点不存在。

当我签入Chrome的inspector时,您的锚点似乎使用了来自不同命名空间的
href
,它没有在
svg
标记中声明

<a xlink:href="#SD">
从这里开始,我就不知道了:浏览器是否可以将标记的某个名称空间存储在其他地方?我已经搜索了它的DOM属性,找不到它

另一个线索:您也声明了
xmlns:svg

引自前一链接:

绑定时,请注意不要键入xmlns:svg,而不仅仅是xmlns SVG名称空间。这是一个容易犯的错误,但却是可以犯的错误 打破一切。它不是使SVG成为默认名称空间,而是 将其绑定到名称空间前缀“svg”,这几乎是肯定的 而不是您想要在SVG文件中执行的操作。符合标准的浏览器 然后将无法识别任何没有标记的标记和属性 显式名称空间前缀(如果不是全部的话,可能是大部分)并失败 将文档呈现为SVG


我感谢所有的帮助和建议

问题的答案是,我需要将URL的路径设置为绝对路径,而不是相对路径

例如,JavaScript中的一行是:

"AL": {tooltip: 'Alabama', attr: {fill: '#F9B625', href: '#AL'}},
致:


一旦我对所有50个州都做了更改,点击地图就能正确地从jasonp提要中提取数据,并在Chrome和Firefox中显示出来。

你有没有一个例子,或者我们可以在哪里查看这个问题?我已经更新了这个问题,以包含更多信息。)。另外--what is
delayed
?delayed是一个jquery插件,它会稍微减慢点击的处理速度,以便FF有时间更新URL,否则它会在URL更改为新哈希之前得到处理。这就是为什么我没有JSFIDLE,没有那么多依赖文件的部分原因。我已经将问题缩小到这个片段,并希望这足以找到答案。我可能是错的,但当您从锚点的单击事件返回false时,它不应该更改哈希…这会创建一个错误:Uncaught ReferenceError:state notdefined@RichCoy,请参阅我的编辑。这只是为了测试这是一个问题,你应该阅读和理解我提出的问题,并开始玩它。试试这个,看看发生了什么,我想理解,对jQuery来说还是很陌生的。我花了几个星期才走到这一步。您更新的代码仍然表示状态未定义,尽管它似乎位于警报上方的行上。我已经更新了演示以使用您的代码。@RichCoy您确定吗?我看到
xmlns=”http://www.w3.org/2000/svg“
,但不是
xlink
一个。好吧,叫我疯子吧,但在我写这篇文章的时候,我没有在你的示例页面中看到它。另外,即使我是盲人,它也必须是
svg
标记的属性,而不是在另一行。下面是我看到的屏幕截图:@RichCoy好的。。。但Chrome并没有保留所有这些属性。见我编辑的帖子
var myURL = document.URL; //example http://www.ourdomain.com/thispage.html#IL
var getTheMagicWord = myURL.split("#");
console.log(getTheMagicWord[1]); //logs IL
<svg height="100%" version="1.1" width="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 165 96" preserveAspectRatio="meet" style="overflow: hidden; position: relative;">
"AL": {tooltip: 'Alabama', attr: {fill: '#F9B625', href: '#AL'}},
"AL": {tooltip: 'Alabama', attr: {fill: '#F9B625', href: 'http://richcoy.com/locator/index2.html#AL'}},
var myURL = document.URL; //example http://www.ourdomain.com/thispage.html#IL
var getTheMagicWord = myURL.split("#");
console.log(getTheMagicWord[1]); //logs IL