在犀牛书的第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]