Проблемы с амперсандами в AJAX

Недавно мой знакомый столкнулся с проблемой передачи через 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 '}
В этом случае экранирование происходит автоматически (всю грязную работу делает библиотека)

#1

А если заменить на &аmp; ?

Рональд, 1.02.2009 - 20:44
#2

Можно и заменить. Вот только зачем писать самому лишний код, если для этого есть нужные функции библиотеки?

admin, 1.02.2009 - 22:18
#3

Рональд, а как экранировать амперсанд в &аmp;?

Сергей, 16.06.2009 - 15:09
#4

амперсанд в урлах экранируется как %26
( результат js-функции ecsape() )

Сергей, 16.06.2009 - 15:59
#5

Как комментарий к статье:
Из описания 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()) не экранирует символы, такие как: ; / ? : @ & = + $ , - _ . ! ~ * ‘ ( ) #

Сергей, 16.06.2009 - 16:16
#6

большое спасибо! :) Очень полезно и наглядно :)

birka, 16.01.2011 - 16:23
#7

№1, круто придумал & заменить на & где есть тот же самый символ

Виталий, 15.11.2011 - 11:07
#8

Спасибо! то что искал!

Юрий, 19.10.2015 - 23:57
Оставить комментарий