Модифицируйте POST-переменные перед публикацией, используя jQuery - PullRequest
40 голосов
/ 15 апреля 2010

У меня есть форма и обработчик отправки в jQuery.

Когда пользователь отправляет форму, я хочу изменить (добавить) некоторые параметры в запросе POST, прежде чем он будет отправлен с клиента на сервер.

т.е.

  1. Пользователь нажимает "отправить"
  2. Мой jQuery submit hander начинает выполнение ...
  3. Я создаю несколько новых пар ключ / значение и добавляю их в полезную нагрузку POST

На данный момент, похоже, мои единственные варианты - использовать $.post() или $('form').append('<input type="hidden" name=... value=...');

Спасибо за любую помощь.

Редактировать: я уже прикрепил обработчик отправки к форме; Я пытаюсь редактировать переменные записей между пользователем, нажимающим кнопку отправки, и запросом, отправляемым на сервер.

Ответы [ 7 ]

43 голосов
/ 15 апреля 2010

Используйте функцию submit() в форме для создания обратного вызова. Если функция возвращает true, форма будет отправлена; если ложь, форма не будет отправлять.

$('#theForm').submit(function() {
    $("#field1").val(newValue1);
    $("#field2").val(newValue2);
    $(this).append(newFormField);
    return true;
});

и т.д.

19 голосов
/ 24 сентября 2015

Просмотр высокого уровня:
Когда форма отправляется исходным образом, это самая последняя операция, выполняемая браузером, и она выполняется вне области действия движка рендеринга / интерпретатора JavaScript.

Любые попытки перехватить фактический запрос POST или GET через JavaScript невозможны, поскольку этот традиционный веб-запрос происходит исключительно между механизмом браузера и подсистемой сети.

Современное решение:
Для веб-разработчиков становится все более популярным отправлять данные форм с помощью XMLHttpRequest - API веб-браузера, который позволяет интерпретатору JavaScript получать доступ к сетевой подсистеме браузера.
This is commonly referred to as Ajax

Простое, но общепринятое использование этого будет выглядеть примерно так:

<html>
  <form id="myForm" onsubmit="processForm()">
   <input type="text" name="first_name"/>
   <input type="text" name="last_name"/>
   <input type="submit" value="Submit">
  </form>

  <!--Using jQuery and Ajax-->
  <script type="text/javascript">
    /**
     * Function is responsible for gathering the form input data, 
     * adding additional values to the list, and POSTing it to the
     * server via Ajax.
     */
    function processForm() {
      //Retreive the data from the form:
      var data = $('#myForm').serializeArray();

      //Add in additional data to the original form data:
      data.push(
        {name: 'age',      value: 25},
        {name: 'sex',      value: 'M'},
        {name: 'weight',   value: 200}
      );

      //Submit the form via Ajax POST request:
      $.ajax({
        type: 'POST',
        url:  'myFormProcessor.php',
        data:  data,
        dataType: 'json'
      }).done(function(data) {
        //The code below is executed asynchronously, 
        //meaning that it does not execute until the
        //Ajax request has finished, and the response has been loaded.
        //This code may, and probably will, load *after* any code that
        //that is defined outside of it.
        alert("Thanks for the submission!");
        console.log("Response Data" +data); //Log the server response to console
      });
      alert("Does this alert appear first or second?");
    }
  </script>
</html>

Собственный подход: До существования XMLHttpRequest одним из решений было бы просто добавить любые дополнительные данные формы непосредственно в документ.

Используя ту же форму, что и выше, метод добавления jQuery может выглядеть следующим образом:

<html>
  <form action="myFormProcessor.php" method="POST" id="myForm" onsubmit="return processForm()">
    <input type="text" name="first_name"/>
    <input type="text" name="last_name"/>
    <input type="submit" value="Submit">
  </form>

 <script type="text/javascript">
  /**
   * Function is responsible for adding in additional POST values
   * by appending <input> nodes directly into the form.
   * @return bool - Returns true upon completion to submit the form
   */
  function processForm() {
    $('<input>').attr('type', 'hidden').attr('name', 'age').attr('value', 25).appendTo('#myForm');
    $('<input>').attr('type', 'hidden').attr('name', 'sex').attr('value', 'M').appendTo('#myForm');
    $('<input>').attr('type', 'hidden').attr('name', 'weight').attr('value', 200).appendTo('#myForm');

    return true; //Submit the form now 
    //Alternatively you can return false to NOT submit the form.
  }
 </script>
</html>
3 голосов
/ 21 апреля 2010

Я не думаю, что вы можете изменить POST-переменные таким образом. Когда запускается обработчик отправки, нет хеша реально существующих данных формы, которые вы можете добавить или изменить. Я думаю, что вы правы - ваши единственные опции - это $ .post () самостоятельно (что я бы порекомендовал) или добавление скрытых входных данных в форму (имеет накладные расходы на модификацию DOM, которая вам не нужна).

2 голосов
/ 24 сентября 2015

Я работал над этим вопросом в течение одного дня и нашел хорошее решение:

Вы можете использовать Jquery .clone () для создания копии формы, которую вы хотите отправить. Затем вы можете внести изменения в копию и, наконец, отправить копию.

2 голосов
/ 15 апреля 2010

Прикрепите обработчик submit () к форме.

$('form#myForm').submit(myPostHandlingFunction);

Затем отправьте / сделайте сообщение из вашей функции. Проще всего было бы просто заполнить пару скрытых входных данных в форме и затем вернуть true, чтобы разрешить отправку, если все выглядит правильно.

0 голосов
/ 28 июля 2017
$("#frm").submit(function (e) {
    e.preventDefault();
    form = document.getElementById("frm"); //$("#frm")

    $.each(form.elements, function (i, el) {
        el.name = your_new_name;
        el.value = your_new_value;
        //... //el.type, el.id ...
    });

    form.submit();

    return true;
});
0 голосов
/ 15 апреля 2010

Вы можете перехватить событие нажатия кнопки отправки и выполнить там свою обработку.Для пар ключ / значение вы можете использовать скрытый элемент формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...