URL encode видит "&" (амперсанд) как "&" Объект HTML

Я кодирую строку, которая будет передана в URL (через GET). Но если я использую escape, encodeURI или encodeURIComponent, & будет заменен на %26amp%3B, но я хочу, чтобы его заменили на %26. Что я делаю неправильно?

Ответ 1

Не видя своего кода, трудно ответить, кроме удара в темноте. Я бы предположил, что строка, которую вы передаете encodeURIComponent(), которая является правильным методом для использования, исходит из результата доступа к свойству innerHTML. Решение состоит в том, чтобы получить значение свойства innerText/textContent:

var str, 
    el = document.getElementById("myUrl");

if ("textContent" in el)
    str = encodeURIComponent(el.textContent);
else
    str = encodeURIComponent(el.innerText);

Если это не так, вы можете использовать метод replace() для замены объекта HTML:

encodeURIComponent(str.replace(/&/g, "&"));

Ответ 2

Если вы сделали это буквально:

encodeURIComponent('&')

Тогда результат %26, вы можете проверить здесь. Убедитесь, что строка, которую вы кодируете, всего лишь &, а не &, чтобы начать с... в противном случае это кодирование правильно, что, вероятно, так. Если по какой-то причине вам нужен другой результат, вы можете сделать .replace(/&/g,'&') перед кодировкой.

Ответ 3

Существуют кодировки HTML и URI. & & закодирован в HTML, а %26 - & в кодировка URI.

Итак, перед кодировкой URI вашей строки вы можете захотеть декодировать HTML, а затем кодировать URI:)

var div = document.createElement('div');
div.innerHTML = '&AndOtherHTMLEncodedStuff';
var htmlDecoded = div.firstChild.nodeValue;
var urlEncoded = encodeURIComponent(htmlDecoded);

результат %26AndOtherHTMLEncodedStuff

Надеюсь, это сэкономит вам время.