我正在尝试在一个项目中摆脱jQuery的依赖。该项目的一件事是像这样向服务器发布数据:
var data = {"apple": [{"kiwi": "orange"}, {"banana": "lemon"}], "pear": "passion fruit"};
$.post( url, data);
感谢You might not need jQuery,我知道如何使用XMLHttpRequest
在纯Javascript中重写$.post
:
var request = new XMLHttpRequest();
request.open( 'POST', url, true);
request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send( data);
不幸的是,这个描述似乎假定data
对象已经是一个URL编码的查询字符串,但在上面的例子中显然并非如此。事实证明,jQuery做了更多的工作:对于给定的data
对象,上述$.post
调用首先会将其转换为查询字符串,看起来像这样:
apple%5B0%5D%5Bkiwi%5D=orange&apple%5B1%5D%5Bbanana%5D=lemon&pear=passion+fruit
使用XMLHttpRequest
的代码片段没有这样做,因此服务器会向我抛出错误。
jQuery还有一个很棒的方法调用$.param
,可以完全完成这个转换。如果在上面的XMLHttpRequest
代码片段中,最后一行加入该方法,它将工作得非常好。
request.send( $.param(data));
但是,我没有摆脱 jQuery 的依赖。因此,我正在寻找一个纯 Javascript 等价的
$.param
。有人有类似的东西吗?注意:问题Plain Javascript Equivalent of jQuery.param()问了一个类似的问题,但接受的答案只适用于非常简单的情况。将该答案中给出的函数应用于上述
data
对象会产生以下结果:apple=%5Bobject%20Object%5D%2C%5Bobject%20Object%5D&pear=passion%20fruit
这与上面给出的$.param(data)
显然不同,它不会递归地工作,因此会丢失信息。