Недавно мой знакомый столкнулся с проблемой передачи через AJAX переменных, содержащих «&».
Проблема c амперсандом
Передаем пару переменных (var1 и var2) через AJAX методом POST или GET. Используем библиотеку jQuery.
$.ajax({ type: 'POST', url: 'some.php', data: 'var1=preved&var2=medved', success: onAjaxSuccess });
Проблемы начинаются, если в переменных встречаются амперсанды (символ &).
Например
data: 'var1=chip&dail&var2=medved'
Таким образом, амперсанды «ломают» массив параметров, т.к. & - разделитель параметров в URL.
Более того, данной проблеме подвержен не только jQuery, но и «голый» AJAX (без использования библиотек).
Решение проблемы
Нужно заэкранировать параметры, передаваемые в URL. Для этого существует функция encodeURIComponent() - латинские буквы, цифры, символы !*()'. оставляет как есть, всё остальное кодирует escape-последовательностями в кодировке UTF-8.
А можно поступить еще проще
В jQuery для передачи POST запросов существует более высокоуровневая и простая абстракция $.post, аналогичная $.ajax
$.post('some.php', {var1: 'preved ', var2: 'medved '}, onAjaxSuccess);
Параметры указываются в виде пары ключ: значение через запятую
{var1: 'preved ', var2: 'medved '}
В этом случае экранирование происходит автоматически (всю грязную работу делает библиотека)
А если заменить на &аmp; ?
Можно и заменить. Вот только зачем писать самому лишний код, если для этого есть нужные функции библиотеки?
Рональд, а как экранировать амперсанд в &аmp;?
амперсанд в урлах экранируется как %26
( результат js-функции ecsape() )
Как комментарий к статье:
Из описания encodeURIComponent() в книге Danny Goodman "JavaScript Bible" стр.1128:
"Perhaps the biggest difference between the encodeURI() and escape() functions is that the more modern
versions do not encode a wide range of symbols that are perfectly acceptable
as URI characters according to the syntax recommended in RFC2396.Thus, the following characters are
not encoded via the encodeURI() function:
; / ? : @ & = + $ , - _ . ! ~ * ‘ ( ) # ."
Если по-русски:
В отличии от escape(), encodeURI() (и encodeURIComponent()) не экранирует символы, такие как: ; / ? : @ & = + $ , - _ . ! ~ * ‘ ( ) #
большое спасибо! :) Очень полезно и наглядно :)
№1, круто придумал & заменить на & где есть тот же самый символ
Спасибо! то что искал!