Ajax 和 JavaScript,如何在不使用 JQuery 的情况下发布数组?

Posted

技术标签:

【中文标题】Ajax 和 JavaScript,如何在不使用 JQuery 的情况下发布数组?【英文标题】:Ajax and JavaScript, how to POST array *without* using JQuery? 【发布时间】:2016-03-31 20:04:21 【问题描述】:

我正在通过 Ajax 调用 php 函数:

var ajax = new XMLHttpRequest();
ajax.open("POST", "file.php", true);
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

ajax.onreadystatechange = function()
    if(ajax.readyState == 4 && ajax.status == 200)
        var returnVal = JSON.parse(ajax.responseText);

        // do stuff here //
    
   
ajax.send('term=' + javascriptArray);

一切都很好,它在发送单个值时很有效,但是当我尝试发布一个数组时就失败了。

在我的 PHP 函数中,我正在检查 POST 变量是否为数组:

is_array($_POST['term']);

但它总是返回false。

回显该值会打印如下内容:

value1,value2,value3

但作为单个字符串,而不是作为数组。

This SO thread 的答案不是作为数组发送,而是作为多个不同的变量发送,并使用 GET:

ajax.open("GET","myserver.com/myfunction.php?var1=1&var2=2&var3=3",true);

我发送的数据在项目数量上总是可变的,因此作为数组发送对我来说是最好的选择。 PHP 中的一个简单的is_array() 对于我正在做的事情要简单得多。

我看过设置多个变量:

for(var i = 0; i < argument.length; i++)
    postString += 'arg' + i + '=' + argument[i] + '&';

ajax.send(postString);

但这仍然没有真正得到我想要的结果(再次使用多个变量)。

我也试过用相同的变量名发送它们:

ajax.send('arg=one&arg=two&arg=three');

但是每一个后续的都会覆盖它的前一个。

我对使用 JQuery 的解决方案不感兴趣。我不需要整个库,这是我唯一需要的。

编辑 1

我也想保留为POST

【问题讨论】:

JSON.stringify 无需 jquery 即可工作 【参考方案1】:

对于被视为数组的参数,它必须使用[] 表示法

var postArray = new Array();
for(var i = 0; i < argument.length; i++)
    postArray[i] = 'arg[]=' + encodeURIComponent(argument[i]);

ajax.send(postArray.join('&'));

【讨论】:

就可以了。我不知道用于发布数组的 [] 语法,非常感谢! 如果可以的话,我会再次为.join() +1 - 我以前从未见过。【参考方案2】:

您需要让 PHP 清楚,它是您发送的数组。您通常可以通过添加[] 来做到这一点,就像在 PHP 中一样。所以在你的例子中,试试这个:

ajax.send('arg[]=one&arg[]=two&arg[]=three');

【讨论】:

是的,我注意到在 PHP 中它现在总是会接收一个数组,即使只是一个值。谢谢。

以上是关于Ajax 和 JavaScript,如何在不使用 JQuery 的情况下发布数组?的主要内容,如果未能解决你的问题,请参考以下文章

AJAX

jquery 或 javascript 中有没有一种方法可以在不使用 ajax 请求的情况下在页面加载时填充下拉列表?

如何在不解析的情况下在javascript中同步包含JSON数据?

Ajax是如何运行的?

如何使用 Django、Ajax、jQuery 在不刷新页面的情况下提交表单?

Ajax Javascript 在不刷新页面的情况下不会改变样式