【问题标题】:Send form with associative array via AJAX to PHP通过 AJAX 将带有关联数组的表单发送到 PHP
【发布时间】:2016-08-13 00:29:25
【问题描述】:

我有一个包含关联数组字段的表单:

<label for="my_array[][system]">System</label>
<input id="my_array[][system]" type="text" value="" name="my_array[0][system]">

<label for="my_array[][name]">Name</label>
<input id="my_array[][name]" type="text" value="" name="my_array[0][name]">

我正在尝试使用 Ajax 将此表单发布到 PHP。我试过这个:

$.ajax({
    type: "POST",
    dataType: "json",
    url: ajaxurl,
    data: {
        action: "update_postmeta", 
        post_id: post_id, 
        nonce: nonce,
        my_array: $('input:text[name="my_array*"]')
            .each(function() { values[this.name] = $(this).val() })
        },
    success: function (response) {
        alert(response);
    },
    error: function ( jqXHR, textStatus, errorThrown) {
        alert("Error: " + textStatus + '\r\n\r\n' + errorThrown);
    }
})

问题出在这行代码上:

my_array: $('input:text[name="my_array*"]')
    .each(function() { values[this.name] = $(this).val() })

.each() 不是一个函数...我不知道如何让my_array 以与使用常规表单提交(没有 Ajax)相同的结构填充表单数据。

当使用关联数组创建表单时,如何发布表单数据?

【问题讨论】:

  • 将其发布为 JavaScript 对象
  • 您的问题并不完全清楚。 $.fn.each() 是一个函数,它应该可以填充数组。您是说.each() 不起作用,还是您不能通过$.ajax() 将数组作为数据发布?
  • @Nostalg.io 我认为问题出在我的选择器上 - 是否正确使用星号来选择关联数组表单字段?由于选择器失败 .each() 无效,我认为? :S
  • 是的,你是对的。我一直在一个空的 JavaScript 控制台上用一个已知的好 ajaxurl 测试它。那一行确实破坏了功能。奇怪的是,“破坏”部分本身运行良好......
  • 好的。我认为这也有错误,但首先我希望您尝试一下。使用新的 jQuery .ajax() API。函数签名将url作为第一个参数:jQuery.ajax( url [, settings ] )

标签: php jquery ajax


【解决方案1】:

更改您的 my_array function() 以自动调用该函数并返回一个 key: value 对象数组:

{ 
    ...,
    my_array: (function() { 
        var my_array = [];
        $('input:text[name="my_array*"]')
            .each(function() {
                my_obj = {};
                my_obj[this.name] = $(this).val();
                my_array.push(my_obj);
            });
        return my_array;
    })()
}

另外,您可能需要使用attributeStartsWith 选择器语法:

jQuery( "[attribute^='value']" )

为了完整起见,这里是一个使用对象而不是数组来直接控制 my_array 的 key: value 对的示例。另外,我使用的是 startsWith 语法。

{ 
    ...,
    my_array: (function() { 
        var my_array = {};
        $('input:text[name^="my_array"]')
            .each(function() {
                // Directly sets the key/value data in the POST.
                // You could modify the key names if desired.
                my_array[this.name] = $(this).val();
            });
        return my_array;
    })()
}

【讨论】:

  • 好的,这对我有用。我的这个页面的 POST 数据,带有一些测试变量出来:action:update_postmeta post_id:7 nonce:asdfsdf my_array[0][]: my_array[1][q]: my_array[2][author]: 当然......输入字段中没有数据,所以它们是空白的。
  • @Nostaig.io Ajax POST 成功。我所有的其他表单变量都在 $_POST 中,但没有 my_array 为空。没有错误。我将在这里进行一些跟踪。
  • 没有。选择器没有返回任何结果。我知道这是对的,但肯定有别的事情发生了。仍在检查。
  • 您的编辑解决了问题!谢谢你。我看到表单变量现在正在发送到服务器。如果在没有 Ajax 的情况下像往常一样提交表单,它们的结构就不一样了,但我现在至少可以获取数据了!谢谢。
  • 您也可以将my_array设置为对象而不是数组,然后您可以手动设置发送的键:值对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2022-06-17
  • 2017-06-22
  • 1970-01-01
  • 2019-06-22
  • 2010-09-22
相关资源
最近更新 更多