Проблемы с амперсандами в 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
 
английский язык для начинающих
Ашманов Египет Москва РХТУ Россия США Снежинск Таиланд Тушино Урал Челябинская область Яндекс алкоголь английский язык баги база данных безопасность бизнес блоги взлом видео выставка выходные горные лыжи дайвинг дауншифтинг допинг идиотизм инвентарь интернет книги кэширование мозг море музей ноутбук образование оптимизация отдых отпуск пароль плагин пора сваливать программирование программисты путешествия работа работоспособность радиация реклама самогоноварение собеседование социальные сети спам стартап статистика страны тайм-менеджмент техника учеба фантастика фото фриланс хакер экология электронные деньги юмор Ajax CMS DbSimple DDOS email FireFox Google honda htaccess HTML javascript jQuery life md5 MySQL PHP SEO soft SQL vkontakte Web web 2.0 wordpress