u634781 2009-07-11 19:39
浏览 211
已采纳

为什么犀牛书的ajax post函数要对post的数据先encodeFormData呢?

在犀牛书的第20章中的post函数如下:
[code="js"]
HTTP.post = function(url, values, callback, errorHandler)
{
var request = HTTP.newRequest();
request.onreadystatechange = function()
{
if (request.readyState == 4)
{
if (request.status == 200)
{
callback(HTTP._getResponse(request));
}
else
{
if (errorHandler)
{
errorHandler(request.status, request.statusText);
}
else
{
callback(null);
}
}
}
};

request.open("POST", url);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(HTTP.encodeFormData(values));

};

HTTP.encodeFormData = function(data)
{
var pairs = [];
var regexp = /%20/g;

for (var name in data)
{
var value = data[name].toString();
var pair = encodeURIComponent(name).replace(regexp, "+") + "=" +
    encodeURIComponent(value).replace(regexp, "+");
pairs.push(pair);
}
return pairs.join("&");

};
[/code]
这样子每次post的数据都要写成一个类才可以,比如测试用例是:
[quote]
function callback_test(obj)
{
alert(obj);
}

var post_data = {'class':1, 'name':'oo'};
HTTP.post('/z.php', post_data, callback_test, null);
[/quote]

个人觉得把encodeFormData去掉,直接写成"name=oo&class=1"不是更方便吗?
谢谢:)
[b]问题补充:[/b]
encodeURIComponent可以对中文进行编码这个我知道,但是搞不懂作者为什么要写成post_data = {'class':1, 'name':'oo'}; 的形式,我觉得如果从一下url的参数里面提取出成一个类不就更麻烦?
比如读者可以调用
ajax.send_request('class=1&name="oo"', "post");
而ajax.send_request()的原型是
ajax.send_request(data, Method);
这样不知道有没有现成的函数把'class=1&name="oo"'转换成:
{'class':1, 'name':'oo'};
呢?
谢谢
[b]问题补充:[/b]
谢谢,呵呵,我也越来越感受到犀牛书的价值了。
刚刚写了个个函数对uri进行转换的,献丑一下。
[code="js"]
function uri2json(uri)
{
var tmp_uris = uri.split("&");
var json_str = 'uri_obj={'
for (i = 0; i < tmp_uris.length; i++)
{
tmp_uri = tmp_uris[i].split('=');
json_str += tmp_uri[0] + ':"' + tmp_uri[1] + '",';
}
json_str += '}';
eval(json_str);
return uri_obj;
}
[/code]
测试用例是
[quote]
var str = "a=1&b=2&c=kaka&d=tw22";
alert(uri2json(str).c);
[/quote]

  • 写回答

5条回答 默认 最新

  • wanghaolovezlq 2009-07-11 21:08
    关注

    没有现成的函数把'class=1&name="oo"'转换成:
    {'class':1, 'name':'oo'};

    这就是讲究写js框架的设计了

    写成{'class':1, 'name':'oo'}; 这种形式是非常的能用,把参数封装成一个JSON格式的对象,由框架内部也就是encodeFormData来解析生成参数串,多好的设计,

    你觉得直接写成"name=oo&class=1"方便,是方便,但没点可重用性,你是站在一个人写代码的角度来看这个问题,这部分完全可以提取出来作为一个通用的方法也就是encodeFormData,从这点上就看来js权威指南这本书的价值!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题