赞
踩
通过JS异步的向服务器发送请求并接收响应数据
function createXhr(){
var xhr;
if (window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
}
else
{
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
return xhr;
}
// open(method, url, asyn) , 创建请求 // method: get/post // url: 请求地址 // asyn: true/false xhr.open('get', '/server', true); // send(body) , 发送请求 // get请求,body=null // post请求,body=请求参数 // 属性 - readState // 0: 代理被创建,但没调用open()方法 // 1: open()方法被调用 // 2: send(),方法被调用 // 3: 下哉中 // 4: 下载完成 //属性 - responseText // 响应数据 // 属性 - status // 服务器端的响应状态 // 200 ok // onreadystatechange // readyState == 4 and status==200
var xhr = createXhr()
xhr.open('get', url, true)
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200)
{
var resp = xhr.responseText;
}
}
xhr.send(null)
var xhr = createXhr()
xhr.open('post', url, true)
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200)
{
var resp = xhr.responseText;
}
}
// 设置 Content-Type
// ajax 默认头是 "text/plain,charset=utf-8"
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send('请求数据') // 'username=aaa&age=333'
var obj = {
"uname": 'xxxx',
"age": 18,
"gender"L "unknow"
};
var objs = [
{"uname":"xxxx", "age": 18, "gender": "xxx"},
{"uname":"xxxx", "age": 18, "gender": "xxx"}
];
var objs = [
{"uname":"xxxx", "age": 18, "gender": "xxx"},
{"uname":"xxxx", "age": 18, "gender": "xxx"}
];
$(objs).each(function(index, obj){});
$.each(objs, function(index, obj){});
var jobj = JSON.parse(json字符串);
a = []
a = (x,)
a = {}
json.dumps(列表|元组|字典)
return HttpResponse(json_str, content_type='application/json')
return JsonResponse(obj)
json.dumps(obj, sort_key=True) # 排序会耗费资源
json.dumps(obj, separetors=(',',':')) # ( '字段分隔符','键值分隔符')
``` json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) ``` import json from json.encoder import JSONEncoder class Student: def __init__(self, name, age): self.name = name self.age = age class StudentEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, Student): return dict(name=obj.name, age = obj.age) return super.default(obj) students = [Student('aa', 25), Student('bb', 35)] json.dumps(students, cls=StudentEncoder)
把指定url的html内容加载到你指定的元素中;
$obj.load(url,data, callback);
// $obj 显示内容的容器
// data 向url传的参数 1. key=val&key1=val& ... get请求; 2. {key:val, kye1:val2,...} ...post请求
// callback 成功后调用的函数,可选
// 用于导航栏 和 页尾
$("#btn").click(function(){
$("#show").load('/ajax/load_test_server/ #h2',null, function(data){
});
}); // data 是请求到的内容, #h2 是url页面中某个元素的ID
注意:
GET请求 没有 Content-Type
POST请求一定有 Content-Type [application/x-www-form-urlencoded]
响应内容一定有Content-Type
$get/post(url, data, callback, type)
url :
data: "name=sf.zhang&age=18" 或 {name:'sf.zhang', age: 18}
callback: function(data){ }
type: 返回来的格式: html , text, script, json
url: type: get, post data: "key=val&key=val" 或 {name:"xxx", age:xxx} dataType: 返回的数据格式 html, text, script, json,xml,jsonp(跨域) success: 成功回调 error: 失败回调 beforeSend: 发送前回调,retur false, 终止请求, async: true 使用js对象 {url:"xxxx", type:"get",。。。} $(function () { $("#btn").click(function () { var pars = { url: '/ajax/jquery_ajax_server/', type: 'post', dataType: 'json', data:{name:"sf.zhang", age: 20}, async:true, success: function(data){ console.log('success'); console.log(data); }, error: function(data){ console.log('errro'); console.log(data); }, beforeSend: function(){ console.log('beforeSend'); }, }; $.ajax(pars); }) });
非同源的网页,相互发送请求的过程,就是跨域。
浏览器的同源策略
多个地址中,相同协议,相同域名,相同端口被视为“同源”
在HTTP中,必须是同源地址才能互相发送请求,非同源拒绝请求(<script> 和 <img> 除外)
浏览器不允许跨域
通过 <script> 的 src属性 向服务器发送请求,由服务器来决定执行客户端指定的方法。
# 后台代码
def jsonp_server(request):
callback = request.GET.get("callback", 'func')
str_json = {"name": "sf.zhang", "age": 25}
st = callback + "(" + json.dumps(str_json) + ");"
return HttpResponse(st, content_type="application/jsonp")
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/.../ajax/static/js/jquery-1.11.3.js" type="text/javascript"></script> </head> <body> <button id="btn">jsonp</button> <script> $(function(){ $('#btn').click( function(){ var $script = $("<script type='text/javascript' ><" + "/script>"). attr("src",'http://localhost:8000/ajax/jsonpserver/?callback=func'); $('body').append($script); } ); }); function func(a) { alert(a); } </script> </body> </html>
$.ajax({
url: xxx,
type: 'get',
dataType:'jsonp',
jsonp: 'callback',
jsonpCallback: 'xx', // ==> ?callback=xx
});
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/home/xxx/ajax/static/js/jquery-1.11.3.js" type="text/javascript"></script> </head> <body> <button id="btn">jsonp</button> <script> $(function(){ $('#btn').click( function(){ $.ajax({ url: "http://localhost:8000/ajax/jsonpserver", type: 'get', dataType:'jsonp', jsonp: 'callback', jsonpCallback: 'func', }); } ); }); function func(a) { alert(a); } </script> </body> </html>
$.ajax({
url: "http://localhost:8000/ajax/jsonpserver",
type: 'get',
dataType:'jsonp',
success: function(data){
}, // ==> ?callback=xx , xx由jquery帮我们完成
});
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。