Firefox автоматически декодирует закодированный параметр в URL, не происходит в IE - PullRequest
16 голосов
/ 29 января 2011

У меня проблемы с Firefox и IE, в основном с Firefox, так как он автоматически декодирует параметр в хэше, прежде чем я могу работать с ним в Javascript. IE не декодирует URL автоматически, поэтому я не получаю ошибок при чтении.

Моя проблема похожа на эту, за исключением того, что я не использую ASP.NET ASP.NET MVC, автоматически декодирующий JSON-кодированные параметры из AJAX

Так что, если я возьму URL, как 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 вообще не дает никаких ошибок.

Как я могу это исправить?

Ответы [ 5 ]

19 голосов
/ 29 января 2011

После поиска я обнаружил, что это кросс-браузерная проблема, и лучше использовать location.href.split("#")[1] вместо window.location.hash

1 голос
/ 05 мая 2017

Это действительно старый вопрос, но основная проблема все еще не решена. 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));

Что ты думаешь?

1 голос
/ 22 августа 2011

Это на самом деле то, что вы хотите использовать:

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

Действительно, window.location.href.split ("#!") [1] не декодируется FF автоматически (по крайней мере, сегодня),

0 голосов
/ 26 октября 2015

У меня была эта проблема. Я решил это с этим решением:

var currentLocation = document.location.hash;
var decodedLocation = decodeURI(currentLocation);
0 голосов
/ 01 мая 2015

Ответ выше работает, за исключением случаев, когда ваш URL содержит более одного #.Это должно обрабатывать все случаи:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...