首页>Program>source

我在Firefox和IE之间感到沮丧,大多数情况下是Firefox,因为在我可以在Javascript中使用它之前,它会自动解码哈希中的参数. IE不会自动解码网址,因此不会给我带来阅读错误。

我的问题类似于此问题,除了我没有使用ASP.NETASP.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中,当我访问哈希时,它会自动解码为"!@#$%^&*("

这个问题是在我的脚本中,我使用的是encodeURIComponent来解码编码后的值,如果确实对字符串进行了编码,这很好.由于已在Firefox中解码,因此给我一个格式错误的URI序列错误,而IE根本没有给我任何错误。

我该如何解决?

最新回答
  • 14天前
    1 #

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

  • 14天前
    2 #

    这实际上是您要使用的:

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

    事实上,window.location.href.split("#!")[1]不会自动被FF解码(至少在今天).

  • 14天前
    3 #

    这是一个非常老的问题,但根本的问题仍未解决. 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));
    

    您怎么看?

  • 14天前
    4 #

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

    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

  • 14天前
    5 #

    我遇到了这个问题.我通过以下解决方案解决了该问题:

    var currentLocation = document.location.hash;
    var decodedLocation = decodeURI(currentLocation);
    

  • Java:使用XML创建GUI?
  • 为python包创建setuppy文件时如何指定依赖项