Ответ 1
После поиска выяснилось, что это проблема с перекрестным браузером, и лучше использовать location.href.split("#")[1]
вместо window.location.hash
У меня расстройство между 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 вообще не дает мне никаких ошибок.
Как я могу это исправить?
После поиска выяснилось, что это проблема с перекрестным браузером, и лучше использовать location.href.split("#")[1]
вместо window.location.hash
Это то, что вы хотите использовать:
decodeURI(window.location.hash.substr(1))
Действительно window.location.href.split( "#!" ) [1] автоматически не декодируется FF (по крайней мере сегодня).
Ответ выше работает, за исключением случаев, когда ваш URL-адрес содержит более одного #. Это должно обрабатывать все случаи:
var hash = "";
var indexOfHash = location.href.indexOf("#");
if (indexOfHash > -1) {
hash = location.href.substring(indexOfHash);
}
Кроме того, похоже, что это должно быть исправлено в Firefox в ближайшее время. Просто нажмите ночные часы:
У меня была эта проблема. Я решил это с помощью этого решения:
var currentLocation = document.location.hash;
var decodedLocation = decodeURI(currentLocation);
Это действительно старый вопрос, но основная проблема до сих пор не решена. 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));
Как вы думаете?