javascript对象未使用vanilla ajax

时间:2018-06-01 22:15:32

标签: javascript php ajax

我已经搜索了互联网和stackoverflow主题以获得答案,但我还没有找到任何答案。我知道JQuery在发送对象时工作得很好但是当我尝试在没有框架的情况下做同样的事情时,我的帖子没有进入PHP页面。

我的基本2个基本功能是:

function sendAjax(){
    let car = {type:"Fiat", model:"500", color:"white"};
    var myURL = "ajaxpost.php"; 
    var post_data = {
        myData: car
    };
    ajax(myURL, post_data); 
}

function ajax(url, post_data) {
    var params = typeof data == 'string' ? post_data : Object.keys(post_data).map(
        function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(post_data[k]) }
    ).join('&');

    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.onload = function(){
        if(this.status == 200){
            document.write(this.responseText);
        } 
    }
    xhr.send(params);
}   

我在ajaxpost.php的PHP页面包含以下内容

<?php
    $data= $_POST['myData'];
    $results = print_r($data, true);
    echo $results;  // just gives me [object Object]

?>

1 个答案:

答案 0 :(得分:0)

因为post_data.myData是一个对象而不是一个字符串,所以它通过encodeURIComponent编码为[Object object]

如果您使用www/form-data编码设置死机,则需要一个使用递归来正确转义复杂对象的所有属性和子属性的函数。

使用jQuery远离我suggest,但它具有便利功能,$.param(obj)

否则,你可以使用JSON:

var jsonString = JSON.encode(complexObject);

编辑:我需要实现此功能,所以我不妨在此分享:

/**
 * Pack up an object of parameters into something that can be added to a GET
 * request.
 *
 * Example:
 * encodeParams({ 'foo': 'bar', 'baz': 'qux' })
 * -> "foo=bar&baz=qux"
 * @param { [key: string]: any } params - key-value store of string->anything
 * @return string URL encoded parameters
 */
var encodeParams = function (params) {
    var up = new URLSearchParams;
    var addParam = function (prefix, param) {
        if (param instanceof Array) {
            for (var _i = 0, param_1 = param; _i < param_1.length; _i++) {
                var i = param_1[_i];
                addParam(prefix + "[]", i);
            }
        }
        else if (param instanceof Object) {
            // add like associative array,
            // e.g. foo[bar][]=baz&foo[bar][]=qux
            for (var i in param) {
                if (param.hasOwnProperty(i)) {
                    addParam(prefix + "[" + i + "]", param[i]);
                }
            }
        }
        else {
            up.append(prefix, (param == null ? '' : param));
        }
    };
    for (var p in params) {
        if (params.hasOwnProperty(p)) {
            addParam(p, params[p]);
        }
    }
    return up.toString();
}; // end encodeParams()