【问题标题】:Why does serialize() have the same effect as serializeArray() when setting post data for jQuery.ajax()?为什么为jQuery.ajax()设置post数据时serialize()和serializeArray()效果一样?
【发布时间】:2011-05-13 05:06:13
【问题描述】:

我在下面有这个 jQuery-AJAX 代码和一个表单:

<script type="text/javascript">
$(document).ready(function () {
    $('form').submit(function () {
        form_data = $(this).serializeArray();

        $.ajax({
            url: "/frontend_dev.php/coche1/update/id/1",
            type: "POST",
            data: form_data

            });
        });
        return false;

});
</script>

如您所见,我使用的是serializeArray(),但是当我使用serialize() 时,它的工作原理也一样..

为什么在这两种情况下工作方式相同?我应该使用它们中的哪一个?

我使用 symfony 作为 php 框架。如果您需要,我可以为您提供更多信息。

【问题讨论】:

    标签: jquery forms serialization


    【解决方案1】:

    如果一个对象/数组被传递(.serializeArray() 返回),它将通过$.param() 序列化。

    如果一个字符串被传递(.serialize() 返回)它不会做任何进一步的事情。

    ...所以当作为data 属性传递时,它们具有相同的效果。 You can find the relevant check here:

        // convert data if not already a string
        if ( s.data && s.processData && typeof s.data !== "string" ) {
            s.data = jQuery.param( s.data, s.traditional );
        }
    

    你应该使用哪一个? 真的在这里并不重要,.serialize() makes the same $.param() call,所以他们做的工作量完全相同。我个人使用.serialize(),因为它的输入更少。

    【讨论】:

      【解决方案2】:

      在这种情况下,它们是相同的。但是如果你不指定类型会有很大的不同——serialize 会执行 GET,serializeArray 会执行 POST!

      【讨论】:

        【解决方案3】:

        我注意到在 CodeIgniter 中,.serialize 方法可以生成被 CodeIgniter 的 CSRF 保护污染的数据(CodeIgniter 以某种方式在数组键中添加分号),而我使用 .serializeArray 提交的表单没有有这个问题。

        另外,如果您使用复杂的 POST 名称,例如name="some[a][data][structure]" 其中 $_POST 数组中的位置发生变化并且不是任意的,那么使用 .serialize 可能会容易得多,因为您可以将其转换回 PHP 数据结构更多很容易。

        【讨论】:

          猜你喜欢
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-02
          相关资源
          最近更新 更多