Firefox автоматически декодирует закодированный параметр в URL-адресе, не происходит в IE

У меня расстройство между 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, когда я получаю доступ к хешу, он автоматически декодируется в "! @# $% ^ & * ("

Проблема заключается в том, что в моем script я использую decodeURIComponent для декодирования закодированного значения, что прекрасно, если строка действительно закодирована. Поскольку он уже декодирован в Firefox, он дает мне неправильную ошибку последовательности URI, и IE вообще не дает мне никаких ошибок.

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Ответ выше работает, за исключением случаев, когда ваш 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

Ответ 4

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

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

Ответ 5

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

Как вы думаете?