【问题标题】:Submitting Form via JQuery Ajax Post Request通过 JQuery Ajax Post 请求提交表单
【发布时间】:2017-02-18 06:26:58
【问题描述】:

我在 Web Node / Express Web 应用程序上有一个基本的消息传递服务,我正在尝试使用 FormData 对象通过 Ajax 提交表单。

如果我在没有 AJAX 的情况下提交表单,那么一切正常,但使用 AJAX 时 req.body。都是未定义的。

在服务器上,使用 AJAX 时,我需要在 req.body 以外的地方查找数据??

创建 FormData 对象:

var ajaxData = new FormData;
ajaxData.append('newMessage', $('.new-message').val()) // I've console.logged these, and their values are correct
ajaxData.append('senderId', $('[name="senderId"]').val())
ajaxData.append('senderName', $('[name="senderName"]').val())// I've console.logged these, and their values are correct
ajaxData.append('recipientId', $('[name="recipientId"]').val())
ajaxData.append('recipientName', $('[name="recipientName"]').val())// I've console.logged these, and their values are correct

这是 POST 请求:

$.ajax({
  url: $form.attr('action'),
  type: $form.attr('method'),
  data: ajaxData,
  dataType: false,
  cache: false,
  contentType: false,
  processData: false,
  complete: function() {
    console.log('message created');
  },
  success: function(data) {


  },
  error: function(xhr, textStatus, errorThrown) {
    console.log(xhr.statusText);
    console.log(textStatus);
    console.log(errorThrown);
  }
});

编辑

感谢 G. Mansour 在下面的回答。万一其他人来了,问题就出在这条线上:

contentType: false,

我在某个时候尝试过这条线,它也不起作用

contentType: 'application/json',

但是当我完全删除这条线时,一切都正常运行......如果有人能告诉我为什么这条线会破坏一切,我很想知道。

【问题讨论】:

  • 是否涉及文件?如果只是序列化表单并摆脱您创建的自定义设置并不简单
  • 感谢@charlietfl 的评论 不,不涉及任何文件。我刚刚尝试按照 G. Mansour 在下面建议的方式对表单进行序列化,但我在位置 0 处得到了一个带有意外标记的 parseerror
  • 检查浏览器开发工具网络中的实际请求..可以看到返回的内容。这是无效的 json
  • 是的,我得到的响应是页面的 HTML,这对我没有多大帮助。我设置了一个 XHR 断点来查看显示的内容,它只给了我 FormData 对象。我搜索了我提交的消息字符串,但它不在那里......
  • 这取决于您如何解析正文...如果要发送的 json 需要修改 ajax 或发送帖子

标签: javascript jquery ajax express form-data


【解决方案1】:

这是html部分

<form id="form" action="" method="post">
<input type="text" name="msgID" id="msgID">
<input type="text" name="senderId" id="senderId">
<input type="text" name="senderName" id="senderName">
<input type="text" name="recipientId" id="recipientId">
<input type="text" name="recipientName" id="recipientName">
<input type="submit" name="dsq" value="dsqdsq">
</form>

这是 JavaScript 部分

<script type="text/javascript">

$(document).ready(function(){
$("#form").submit(function(){
    $.ajax({
        url: "test.php", 
        data: $("#form").serialize(), 
        type: "POST", 
        dataType: 'json',
        success: function (e) {
            console.log(JSON.stringify(e));


        },
        error:function(e){
            console.log(JSON.stringify(e));


        }
    }); 
    return false;
});
});

</script>

这是php代码

<?php 
die(json_encode(array("status"=>true)));
?>

希望对你有所帮助。

【讨论】:

  • 是的!那是票。非常感谢,我已经在这几个小时了。仅供参考,导致问题的是contentType: false,。我将用完整的描述编辑我的 OP...
【解决方案2】:

我检查了你的代码,它说是

非法调用

所以我会给出一个你可以使用的解决方案

data: $form.serialize(),
dataType: 'json',

然后您可以通过

捕获返回的结果
console.log(JSON.stringify(e));

希望对您有所帮助。如果您有一些错误,我可以帮助您。

【讨论】:

  • 感谢@G。曼苏尔!我刚刚按照您的建议进行了尝试,但我收到了 parseerror 说位置 0 处有一个意外字符。我忘记在我的原始帖子中提到我首先尝试设置 FormData($form),但我得到了相同的结果。
  • 能不能把错误函数改成这个错误:function(error) { console.log(JSON.stringify(error)); }
  • 我已经更改了错误处理,但我没有收到任何错误。所发生的只是我在 MongoDB 中创建了一个空的消息文档。
  • 尝试将表单的操作更改为另一个空文件,返回简单的 true 或 false,看看会发生什么,然后我会给您发送一个使用 ajax 提交表单的示例
  • 更改操作?什么意思,换个POST url?
猜你喜欢
  • 2020-02-28
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2011-04-21
  • 2016-02-29
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多