18

我在 Firefox 和 IE 之间感到沮丧,主要是 Firefox,因为它会自动解码散列中的参数,然后我才能在 Javascript 中使用它。IE 不会自动解码 url,因此不会给我阅读错误。

我的问题类似于这个问题,除了我没有使用 ASP.NET ASP.NET MVC 自动解码来自 AJAX 的 JSON 编码参数

因此,如果我采用类似的网址example.com/#question=!%40%23%24%25^%26*(

而“!%40%23%24%25^%26*(”是使用encodeURIComponent编码的,在IE中,当我访问哈希时,它将保留为“!%40%23%24%25^%26*( ",但是在 Firefox 中,当我访问哈希时,它会自动解码为 "!@#$%^&*("

这样做的问题是,在我的脚本中,我使用 decodeURIComponent 来解码编码值,如果字符串确实被编码,这很好。由于它已经在 Firefox 中解码,它给我一个格式错误的 URI 序列错误,而 IE 根本没有给我任何错误。

我怎样才能解决这个问题?

4

5 回答 5

19

搜索后发现这是一个跨浏览器的问题,最好使用location.href.split("#")[1]而不是window.location.hash

于 2011-01-29T08:39:27.300 回答
1

这实际上是您想要使用的:

decodeURI(window.location.hash.substr(1))

实际上 window.location.href.split("#!")[1] 不会被FF自动解码(至少今天是这样)。

于 2011-08-22T04:19:11.987 回答
1

这是一个非常古老的问题,但根本问题仍未解决。Firefox 编码了其他浏览器不编码的东西。

出于沮丧,我不得不创建一种完全不同的方法,并且实际上使算法与字符串是否被编码无关。

我希望这个解决方案能找到需要它的人:

function encodeOnce(text) {
  var doubleEncoded = encodeURIComponent(text);
  // only dive into it if there are any encoded strings...
  if (doubleEncoded.indexOf('%') != -1) {
    // reverse replace all % signs
    doubleEncoded = doubleEncoded.replace(/%25/g, '%');
    // if this is not equal to the original string, ...
    if (doubleEncoded != text) {
      // ... that means there was something to encode
      text = doubleEncoded;
    }
  }
  return text;
}

那么你可以这样做:

solution = encodeOnce(window.location.hash.slice(1));

你怎么看?

于 2017-05-05T14:25:51.703 回答
0

上面的答案有效,但您的网址包含多个 # 的情况除外。这应该处理所有情况:

var hash = "";
var indexOfHash = location.href.indexOf("#");
if (indexOfHash > -1) {
    hash = location.href.substring(indexOfHash);
}

此外,这似乎应该很快在 Firefox 中得到修复。只是打夜床:

https://bugzilla.mozilla.org/show_bug.cgi?id=378962

于 2015-05-01T18:46:42.207 回答
0

我有这个问题。我用这个解决方案解决了它:

var currentLocation = document.location.hash;
var decodedLocation = decodeURI(currentLocation);
于 2015-10-26T08:53:08.147 回答