一、知识储备
1、json
由于使用Ajax发送的大多是json数据,所以我们需要先了解一下json是什么。首先json指的是一种轻量级的数据交换格式,它所支持的数据类型是JavaScript数据类型的一个子集,它支持数字,字符串,布尔值,类列表,类字典,null,json数据只支持双引号,json字符串由单引号包裹。
2、JavaScript的序列化与反序列化
序列化:JSON.stringify()
反序列化:JSON.parse()
二、jQuery实现Ajax
语法:$.ajax()
参数:
请求参数:
url #当前请求的地址 type #当前请求的方式 data #当前请求要发送的数据 processData #是否对data中的数据做编码处理 contentType #当前请求发送的数据类型
traditional #当data中有数组是使用,为true时直接将数组发送到服务端,为false时进行深层次迭代
响应参数:
dataType #预期服务端返回的数据类型,可用的值有:html|xml|json|text|script
三、Ajax发POST请求携带Django的CSRFTOKEN的方法
1、通过Django模板语言获取csrftoken,并设置相应键值对 $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 2、通过jQuery.cookie获取csrftoken并设置到请求头中 <script src="jquery.cookie.js路径' %}"></script> $.ajax({ headers:{"X-CSRFToken":$.cookie('csrftoken')}, }) 3、获取csrftoken标签生成的input标签的value值,并设置相应键值对 {% csrf_token %} $.ajax({ data:{csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
})
四、jQueryd的serialize()方法
#serialize()方法用于自动获取需要提交的表单数据并序列化
1、直接找到表单对象,对所有数据序列化 $('form').serialize() 2、对指定的表单数据进行序列化 $(':text,select').serialize()
五、Ajax通过FormData发送文件
#FormDta可以发送任意类型的数据
var formdata=new FormData(); #创建FormData对象
formdata.append("upload_file",$()[0].files[]) #向FormData对象中添加键值对,document对象的files方法获取文件对象列表,第一个对象就是当前准备上传的文件
$.ajax({data:formdata,contentType:false,processData:false}) #添加到data中发送
六、JavaScript实现Ajax
1、创建XMLHttpRequest对象
function createXMLHttpRequest() { var xmlHttp; // 适用于大多数浏览器,以及IE7和IE更高版本
try{ xmlHttp = new XMLHttpRequest(); } catch (e) { // 适用于IE6
try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { // 适用于IE5.5,以及IE更早版本
try{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e){} } } return xmlHttp; }
2、创建与服务器的连接
var xmlHttp = createXMLHttpRequest(); xmlHttp.open("GET", "/ajax_get/?a=1", true); #第一个参数为请求方式,第二个参数为请求的服务器地址,第三个参数表示是否异步请求,默认不传值为true
3、发送请求
1、get请求 xmlHttp.send(null); #get请求没有请求体数据,但是需要发送null,否则会引起火狐浏览器无法正常发送 2、post请求 xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); #设置请求头,form表单会默认这个键值对不设定,Web服务器会忽略请求体的内容。
xmlHttp.send(“username=yuan&password=123”) #设置请求体数据
4、接收服务器响应
XMLHttpRequest对象有一个onreadystatechange事件,它会在XMLHttpRequest对象的状态发生变化时被调用,而XMLHttpRequest对象一共有5种状态分别是0:初始化未完成状态,只是创建了XMLHttpRequest对象,还未调用open()方法;1:请求已开始,open()方法已调用,但还没调用send()方法;2:请求发送完成状态,send()方法已调用;3:开始读取服务器响应;4:读取服务器响应结束。onreadystatechange事件只会在除0以外的状态下触发。
#状态码和响应内容只有在状态4才能获取到
xmlHttp.onreadystatechange = function() { if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { alert(xmlHttp.responseText); } };
七、同源策略的概念
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
#请求方页面
<button onclick="f()">sendAjax</button> <script>
#创建script标签 function addScriptTag(src){ var script = document.createElement('script'); script.setAttribute("type","text/javascript"); script.src = src; document.body.appendChild(script); document.body.removeChild(script); } function func(name){ alert("hello"+name) } #将需要调用的回调函数通过url传参的方式传递给响应方视图函数 function f(){ addScriptTag("http://127.0.0.1:7766/SendAjax/?callbacks=func") } </script> #响应方视图函数 def SendAjax(request): import json dic={"k1":"v1"} print("callbacks:",request.GET.get("callbacks")) callbacks=request.GET.get("callbacks") return HttpResponse("%s('%s')"%(callbacks,json.dumps(dic)))
jQuery实现
1、getJSON方法实现 #url的后面必须添加一个callback参数,callback后面的那个问号是内部自动生成的一个回调函数名 <button onclick="f()">sendAjax</button> <script> function f(){ $.getJSON("http://127.0.0.1:7766/SendAjax/?callbacks=?",function(arg){ alert("hello"+arg) }); } </script> 2、Ajax实现 #用自定义回调函数处理响应,jsonp定义回调函数的键,jsonpCallback定义回调函数的值即回调函数函数名 <script> function f(){ $.ajax({ url:"http://127.0.0.1:7766/SendAjax/", dataType:"jsonp", jsonp: 'callbacks', jsonpCallback:"SayHi" }); } function SayHi(arg){ alert(arg); } </script> <script> #用Ajax的success回调函数处理响应 function f(){ $.ajax({ url:"http://127.0.0.1:7766/SendAjax/", dataType:"jsonp", //必须有,告诉server,这次访问要的是一个jsonp的结果。 jsonp: 'callbacks', //jQuery帮助随机生成的:callbacks="wner" success:function(data){ alert("hi "+data) } }); } </script>