使用jQuery在提交之前修改POST变量

49

我有一个表单,在jQuery中有一个提交处理程序。

当用户提交表单时,我想在客户端将其发送到服务器之前修改(添加)POST请求的一些参数。

例如:

  1. 用户点击“提交”
  2. 我的jQuery提交处理程序开始执行...
  3. 我创建一些新的键/值对并将它们添加到POST负载中

目前,看起来我的唯一选择是使用$.post()或者$('form').append('<input type="hidden" name=... value=...');

感谢任何帮助。

编辑:我已经将提交处理程序附加到表单上;我正在尝试在用户单击提交按钮和请求被发送到服务器之间编辑POST变量。

8个回答

59

在表单上使用submit()函数创建一个回调。如果该函数返回true,则提交表单;如果返回false,则不会提交表单。

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

等等。


2
听起来这似乎是最好的选择。虽然我必须动态创建很多隐藏输入。 - aidan

24

总体概述:
当一个表单被本地提交时,这是浏览器执行的最后一个操作,并且它在呈现引擎/JavaScript解释器范围之外执行。

由于这种传统的Web请求仅在浏览器引擎和网络子系统之间发生,任何通过JavaScript拦截实际的POST或GET请求的尝试都是不可能的。

现代解决方案:
越来越多的Web开发人员使用XMLHttpRequest提交表单数据--这是一种Web浏览器API,允许JavaScript解释器访问浏览器网络子系统。
这通常称为Ajax

这样一个简单但常见的应用程序看起来会像这样:

/**
 * 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 src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<form id="myForm" onsubmit="processForm()">
  <input type="text" name="first_name" />
  <input type="text" name="last_name" />
  <input type="submit" value="Submit">
</form>

本地方法: 在XMLHttpRequest出现之前,一种解决方案是直接将任何额外的表单数据附加到文档中。

使用上面发布的相同表单,jQuery的append方法可能如下所示:

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 src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<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>


3

我认为你不能以那种方式修改POST变量。当提交处理程序运行时,不存在真正的表单数据哈希可以添加或修改。 我认为你是对的 - 你唯一的选择是$.post()自己(我建议这样做)或向表单附加隐藏输入(具有您不真正需要的DOM修改开销)。


2
我已经花了一天的时间研究这个问题,我想出了一个好的解决方案:
你可以使用Jquery .clone()来创建要提交的表单的副本。 然后,您可以对副本进行修改,最后提交副本。

2

将submit()处理程序附加到表单。

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

然后从您的函数中提交/发布。最简单的方法是在表单中填充一些隐藏的输入,如果一切看起来正确,就返回true以允许提交发生。


我必须创建许多输入。我的问题是:我使用 $.post('url', myData); return false; 还是 $('form').append('lost of new hidden inputs'); return true;?或者有更好的方法吗?我希望有更好的方法。 - aidan
如果您有大量的额外数据要传递,我想您会使用$.post。您可以调用$('form#myForm).serialize来获取初始数据字典,然后附加到其中,然后在成功时发布数据并重定向用户。但是,如果您有大量的其他数据要传递,为什么呢?如果这不是用户输入,为什么不在后端计算而不是依赖JavaScript? - Tom

1
$("#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;
});

属性将被重置,在POST后会恢复正常。 - Franco Ugarte

0
你可以挂钩提交按钮的点击事件并在那里进行处理。 对于键/值对,您可以尝试使用隐藏表单元素。

感谢您的输入。我已经在使用 $('form').submit(fnuction(){ ... }); 我正在尝试确定修改POST变量的最佳方法。 - aidan

0
$('#myForm').submit(function() {
  $.each(this, function (i, element) {
    console.log("element name " + element.name + ", element val: " + element.value);
    if(element.name="thisThingInParticular")
      element.value = "myNewValueForThisElementInParticular";
    )

  }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接