七.JQ对AJAX的支持
1.$obj.load()
-
作用:载入远程的HTML文件到指定的元素中
-
语法:
$obj.load(url,data,callback)
- $obj:用来显示响应内容的JQ元素(从远程载入的HTML文件所放入的元素)
- url:请求的远程地址
- data:请求到远程地址上的参数(可省略)
- 方式1:字符串传参
- “key1=value1&key2=value2”
- 注:此种传参方式会使用GET方式发送请求
- 方式2:使用JS对象传参
- {
key1:“value1”,
key2:“value2”
} - 注:此种传参方式会使用POST方式发送请求
- {
- 方式1:字符串传参
- callback:响应成功之后的回调函数(可省略)(响应成功后想干点什么,匿名函数)
-
示例:
# django_app_name/views.py def load_views(request): return render(request, '01-load.html') def server01(request): # 接受前端传递过来的参数 - 字符串传参 # uname = request.GET['uname'] # uage = request.GET['uage'] # 接受前端传递过来的参数 - JS对象传参 uname = request.POST['uname'] uage = request.POST['uage'] return render(request, '01-server.html', locals())
<!-- templates/01-load.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01-load</title> <script src="/static/js/jquery-1.11.3.js"></script> <script> $(function () { $("#btnLoad").click(function () { // 1.通过字符串表示传参 // var params = 'uname=lvze&uage=30'; // $("#baidu").load("/ajax/01-server",params); // 2.通过js对象表示参数 var params = { uname:'maria', uage:30, csrfmiddlewaretoken:$("[name = 'csrfmiddlewaretoken']").val(), }; $("#baidu").load("/ajax/01-server/",params,function () { window.setTimeout(function () { // 在3秒钟之内将#baidu元素隐藏 $("#baidu").hide(3000); },5000) }) }); }) </script> </head> <body> {% csrf_token %} <button id="btnLoad">加载01-server</button> <div id="baidu"></div> </body> </html> <!-- templates/01-server.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01-server</title> </head> <body> <h1>这是01-server.html的server</h1> <h2>姓名:{{ uname }}</h2> <h2>年龄:{{ uage }}</h2> <ul> <li> <a href="#">首页</a> </li> <li> <a href="#">购物车</a> </li> <li> <a href="#">个人信息</a> </li> </ul> </body> </html>
2.$.get()
-
作用:通过GET方式异步的向远程地址发送请求(只支持异步,不支持同步)
-
语法:$.get(url,data,callback,type)
- url:请求地址
- data:发送到服务器端的参数
- callback:响应成功之后的回调函数
- type:响应回来的数据的数据格式
- 取值如下:
- html:响应回来的文本是html文本
- Text:响应回来的文本是text文本
- script:响应回来的文本是js执行脚本
- json:响应回来的文本是JSON格式文本(JSON格式文本会转换成JSON对象)
- 取值如下:
-
综合示例
# django_app_name/views.py def get_views(request): return render(request, '02-get.html') def server02(request): dic = { 'uname': 'Uzumaki Naruto', 'uage': 16, } jsonStr = json.dumps(dic) return HttpResponse(jsonStr)
<!-- templates/02-get.html--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>02-get</title> <script src="/static/js/jquery-1.11.3.js"></script> <script> $(function () { $("#btnGet").click(function () { $.get('/ajax/02-server',function (data) { // data表示响应回来的数据 console.log(data); var msg = '姓名:'+data.uname; msg += '年龄:'+data.uage; $("#show").html(msg) },'json') }) }) </script> </head> <body> <button id="btnGet">JQ-Ajax-Get</button> <div id="show"></div> </body> </html>
3.$.post()
-
作用:通过POST方式异步的向远程地址发送请求(只支持异步,不支持同步)
-
语法:与GET方式相同,但是有
data参数
,因为需要向服务器端发送参数 -
综合示例
# django_app_name/views.py def post_views(request): return render(request, '03-post.html') def server03(request): # 获取到前端发送过来的参数 uname = request.POST['uname'] uage = request.POST['uage'] ugender = request.POST['ugender'] # 将前端发送过来的数据转换为字符串格式 # msg = "name:%s,age:%s,gender:%s" % (uname, uage, ugender) # 将前端发送过来的数据转换为字典 msg = { 'uname':uname, 'uage':uage, 'ugender':ugender } # 将字典转换为JSON字符串 msg = json.dumps(msg) print(msg) return HttpResponse(msg)
<!-- templates/03-post.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>03-post</title> <script src="/static/js/jquery-1.11.3.js"></script> <script> $(function () { $("#btnPost").click(function () { $.post('/ajax/03-server/',{ uname:$("#uname").val(), uage:$("#uage").val(), ugender:$("#ugender").val(), csrfmiddlewaretoken:$("[name = 'csrfmiddlewaretoken']").val() },function (data) { // alert("响应回来的内容:"+data); console.log(data) },'json'); }) }) </script> </head> <body> {% csrf_token %} <p> 姓名:<input type="text" id="uname"> </p> <p> 年龄:<input type="text" id="uage"> </p> <p>性别: <select id="ugender"> <option value="male">男</option> <option value="female">女</option> </select> </p> <button id="btnPost">提交</button> <div id="show"></div> </body> </html>
4.$.ajax()
-
作用:允许自定义所有的ajax操作
-
语法:$.ajax({ajax的参数对象});
- ajax的参数对象
- url:异步请求地址(必填)
- data:请求到服务器端的参数(POST必填,GET选填)
- 字符串
- JS对象
- type:请求方式,
GET
或POST
(必填) - dataType:服务器端响应回来的数据的格式(必填)
- html,Text,script,json
- async:是否采用异步的方式发送请求(异步选填,同步必填)
- true:使用异步(默认值)
- false:使用同步
- success:响应成功之后的回调函数
- function(data){
data表示的是响应回来的数据
}
- function(data){
- error:请求或响应失败时的回调函数
- ajax的参数对象
-
综合示例
# django_app_name/views.py
def ajax_views(request):
return render(request, '04-ajax.html')
def server04(request):
list = [
{
"cname": "python基础",
"teacher": "wangwu"
}, {
"cname": "web基础",
"teacher": "lisi"
}
]
return HttpResponse(json.dumps(list))
<!-- templates/04-ajax.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>04-ajax</title>
<script src="/static/js/jquery-1.11.3.js"></script>
<script>
$(function () {
$("#btnAjax").click(function () {
$.ajax({
url:'/ajax/04-server',
type:'get',
dataType:'json',
async:true,
success:function (data) {
$(data).each(function (i, obj) {
console.log("课程名称:"+obj.cname);
console.log("授课老师:"+obj.teacher);
});
},
error:function () {
alert("操作有误,请联系管理员... ...")
}
});
});
})
</script>
</head>
<body>
<button id="btnAjax">JQ-AJAX</button>
</body>
</html>
八.跨域(Cross Domain)
-
什么是跨域
-
HTTP协议中的一个策略 - ‘同源策略’
-
同源:多个地址中,具备相同协议,相同域名,相同端口的地址称为"同源地址"
-
在HTTP中,只有同源地址才能发送ajax请求,非同源地址是被拒绝的(
<script>和<img>除外
)http://www.tedu.cn/a.html http://www.tedt.cn/server 以上地址是`同源地址` http://www.tedu.cn/a.html https://www.tedu.cn/server 以上地址是`非同源地址` http://localhost:8000/a.html http://127.0.0.1:8000/server 以上地址是`非同源地址`
-
-
实际项目中的跨域请求应用
-
综合示例
# django_app_name/views.py def js_views(request): return render(request,'06-js.html') def server06(request): # return HttpResponse("console.log('这是server06响应的内容')") # return HttpResponse("cross_callback('这是server06响应的内容')") # 1.接收前端传递过来的参数值 cb = request.GET['callback'] return HttpResponse(cb+"('这是server06cb响应的内容')")
<!-- templates/06-js.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>06-js</title> <script src="/static/js/jquery-1.11.3.js"></script> <script> // function cross_callback(data) { // alert(data); // } function abcd(data) { alert(data); } // $(function () { // $("#btnJS").click(function () { // var script = document.createElement("script"); // script.src = "http://localhost:8000/ajax/06-server"; // $("body").append(script); // }) // }); $(function () { $("#btnJS").click(function () { var script = document.createElement("script"); script.src = "http://localhost:8000/ajax/06-server?callback=abcd"; $("body").append(script); }) }) </script> </head> <body> <!-- <script src="/static/js/my.js"></script>--> <!-- <script src="http://localhost:8000/ajax/06-server"></script>--> <button id="btnJS">跨域请求</button> </body> </html>
-
在浏览器端输入http://127.0.0.1:8000/ajax/06-js,点击跨域请求,浏览器会向http://localhost:8000/ajax/06-server地址发送请求,注意:
此请求为跨域请求
,并传入callback参数(函数名),在后端服务器中,通过cb = request.GET['callback']
获取到前端传入过来的函数名称,然后在响应浏览器请求的时候将函数名和数据一起返回,这样就保证了后端仅仅只是处理数据,前端接受,同时因为是在<script>
标签中,所以可以跨域接收
-