Символ амперсанда (& amp;) внутри значения параметра данных запроса JQuery AJAX

Я выполняю асинхронные запросы HTTP (Ajax) через jQuery с помощью базовой функции $ .ajax (). Код выглядит следующим образом:

$("textarea").blur(function(){
   var thisId = $(this).attr("id");
   var thisValue = $(this).val();

   $.ajax({
      type: "POST",
      url: "some.php",
      data: "id=" + thisId + "&value=" + thisValue,
      success: function(){
        alert( "Saved successfully!" );
      }
   });

});

Все работает как обычно, пока пользователь не введет внутри текстового символа амперсанд (& amp;)). Чем когда я отлаживаю функцию PHP, которая сохраняет значение, оно всегда будет иметь значение до этого символа.

Я считаю, что должно быть решение, чтобы как-то пропустить амперсанд (& amp;). Есть идеи?

29
задан 16.04.2020, 13:00

4 ответа

Вместо:

data: "id=" + thisId + "&value=" + thisValue

do:

data: { id: thisId, value: thisValue }

Таким образом, jquery позаботится о правильном кодировании значений URL. Конкатенации строк являются корнем всего зла: -)

83
ответ дан 16.04.2020, 13:02
  • 1
    Обратите внимание, что необходимо потребовать ' json' и ' active_support/core_ext/hash' - НЕ ' active_support/core_ext' – etayluz 08.11.2019, 15:18
  • 2
    +1, Возможно, не весь , но многое из него.:-) – T.J. Crowder 16.04.2020, 13:02
  • 3
    но тогда я буду в состоянии получить значения в файле PHP с помощью простого $ _POST []? То же как передающие значения в строке, правильно?! – Nik Sumeiko 16.04.2020, 13:02
  • 4
    @Nikita, yeap, абсолютно тот же путь. Различие - то, что они будут правильно закодированы. – Darin Dimitrov 16.04.2020, 13:03
  • 5
    Спасибо. Это сохранило меня много головной боли. – JordanC 16.04.2020, 13:03
  • 6
    @Darin Dimitrov +1 – CFNinja 16.04.2020, 13:03
$.ajax({

   type:'POST',
 dataType: "text",
   url:'save.php',
   data:'_id='+$('#id').val()+'&title='+$('#title').val(),
??
data: { id: thisId, value: thisValue }
0
ответ дан 16.04.2020, 13:01
  • 1
    Тета была бы в источниках излучения и градусах? Простите, если немой-Q-.. – lb. 01.09.2009, 23:10
  • 2
    Это решение you' ре, обеспечивающее? – Rahil Wazir 16.04.2020, 13:02

просто используйте функцию javascript encodeURIComponent():

$("textarea").blur(function(){
   var thisId = $(this).attr("id");
   var thisValue = $(this).val();

   $.ajax({
      type: "POST",
      url: "some.php",
      data: "id=" + thisId + "&value=" + encodeURIComponent(thisValue),
      success: function(){
        alert( "Saved successfully!" );
      }
   });

});
6
ответ дан 16.04.2020, 13:02
  • 1
    У Вас есть 3D версия в памяти также?:) – Mehrdad Afshari 25.04.2009, 06:08
  • 2
    никогда слишком поздно для кого-то к downvote Вы: D – mkey 16.04.2020, 13:02

Настоятельно рекомендуем вам использовать решение , предоставленное Дарином выше, если это возможно; Таким образом, вы можете повторно использовать хорошо проверенный код для построения POST данных.

Но если вам действительно нужно использовать конкатенацию строк (здесь или в другом месте вашего приложения при построении строк запроса или POST данных из пользовательских данных), вам нужно использовать encodeURIComponent :

$("textarea").blur(function(){
   var thisId = $(this).attr("id");
   var thisValue = $(this).val();

   $.ajax({
      type: "POST",
      url: "some.php",
      data: "id=" + encodeURIComponent(thisId) + "&value=" + encodeURIComponent(thisValue),
      success: function(){
        alert( "Saved successfully!" );
      }
   });
});

По умолчанию при отправке POST с jQuery.ajax вы отправляете данные с типом контента application/x-www-form-urlencoded , что означает, что вы обещая, что данные закодированы таким образом. Вы должны быть уверены, что сохранили свою часть сделки и фактически закодировали ее. Это не просто важно для амперсандов.

27
ответ дан 16.04.2020, 13:03
  • 1
    самодельными решениями для кода обычно является плохая идея для универсальных проблем - за исключением изучения целей. Особенно, когда вопросом является конкретно запрос о существующей библиотеке. – Titou 08.11.2019, 15:14
  • 2
    +1 для объяснения , почему ошибка произошла и как зафиксировать его, как. – sholsinger 16.04.2020, 13:03
  • 3
    @EduardLuca: " я на самом деле попробовал это и это didn' t работа " You' d должны дать некоторые специфические особенности (вероятно, в Вашем собственном вопросе); encodeURIComponent корректный способ сделать это. " я также пытался заменить & с & усилитель; и это ничего не сделало также, surprisingly" На самом деле не удивление, как that' s кодирование объекта HTML, которое не имеет ничего вообще, чтобы сделать с кодированием URI. – T.J. Crowder 16.04.2020, 13:03
  • 4
    Точно, & объект HTML, таким образом, это shouldn' t берут его в качестве части URL, но в качестве части строки в параметрических усилителях URL. Когда я сказал " я попробовал this" я на самом деле подразумевал, что попробовал точно Ваше решение encodeURIcomponent на всех полях, и оно не имело никакого эффекта вообще. – Eduard Luca 16.04.2020, 13:04
  • 5
    Я на самом деле попробовал это и это didn' t работа. Я также пытался заменить & &, и это ничего не сделало также, удивительно. – Eduard Luca 16.04.2020, 13:04
  • 6
    @EduardLuca: " Точно, & усилитель; объект HTML, таким образом, это shouldn' t берут его в качестве части URL, но в качестве части строки в URL params." Ха? Компьютеры don' t предполагают, как вещи (обычно) кодируются. Если Вы будете включать его в URL, то сервер будет рассматривать его, как закодировано URI, потому что that' s, как определяются URIs. При включении его в данные формы в POST это будут рассматривать, как закодировано URI, потому что that' s, как , что определяется. Снова, не показывая Вашу определенную ситуацию (и это предложило бы, необходимо отправить вопрос, не комментарий), " это не имело никакого effect" не имеет точно никакого значения. – T.J. Crowder 16.04.2020, 13:04