优先级
如果发送的是【普通数据】
- jQuery
- XMLHttpRequest
- iframe
如果发送的是【文件】
- iframe
- jQuery(FormData)
- XMLHttpRequest(FormData)
原生Ajax
Ajax主要就是使用 【XmlHttpRequest】对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件)
1、XmlHttpRequest对象介绍
XmlHttpRequest对象的主要方法:
a. void open(String method,String url,Boolen async) 用于创建请求 参数: method: 请求方式(字符串类型),如:POST、GET、DELETE... url: 要请求的地址(字符串类型) async: 是否异步(布尔类型) b. void send(String body) 用于发送请求 参数: body: 要发送的数据(字符串类型) c. void setRequestHeader(String header,String value) 用于设置请求头 参数: header: 请求头的key(字符串类型) vlaue: 请求头的value(字符串类型) d. String getAllResponseHeaders() 获取所有响应头 返回值: 响应头数据(字符串类型) e. String getResponseHeader(String header) 获取响应头中指定header的值 参数: header: 响应头的key(字符串类型) 返回值: 响应头中指定的header对应的值 f. void abort() 终止请求主要方法
a. Number readyState 状态值(整数) 详细: 0-未初始化,尚未调用open()方法; 1-启动,调用了open()方法,未调用send()方法; 2-发送,已经调用了send()方法,未接收到响应; 3-接收,已经接收到部分响应数据; 4-完成,已经接收到全部响应数据; b. Function onreadystatechange 当readyState的值改变时自动触发执行其对应的函数(回调函数) c. String responseText 服务器返回的数据(字符串类型) d. XmlDocument responseXML 服务器返回的数据(Xml对象) e. Number states 状态码(整数),如:200、404... f. String statesText 状态文本(字符串),如:OK、NotFound...主要属性
2.用原生Ajax做个请求
ajax.html
views.py
def ajax(request): return render(request,'ajax.html') def ajax_json(request): print(request.POST) ret = { 'code':True,'data':None} import json return HttpResponse(json.dumps(ret))
3.跨浏览器支持
XmlHttpRequest
- IE7+, Firefox, Chrome, Opera, etc.
ActiveXObject("Microsoft.XMLHTTP")
- IE6, IE5
XMLHttpRequest - Ajax请求
伪Ajax
由于HTML标签的iframe标签具有局部加载内容的特性,所以可以使用其来伪造Ajax请求,进行偷偷的发送请求
views.py
def ajax(request): return render(request,'ajax.html')def ajax_json(request): print(request.POST) ret = { 'code':True,'data':None} import json return HttpResponse(json.dumps(ret))
1.Form表单提交到iframe中,页面不刷新
2.Ajax提交到iframe中,页面不刷新
3.Form表单提交到iframe中,并拿到iframe中的数据
文件上传的三种方式
原生Ajax、Ajax、伪Ajax进行上传文件
views.py
from django.shortcuts import render,HttpResponsedef upload(request): return render(request,'upload.html')def upload_file(request): username = request.POST.get(('username')) fafafa = request.FILES.get('fafafa') #获取文件 with open(fafafa.name,'wb') as f: for item in fafafa.chunks(): f.write(item) print(username,fafafa) ret = { 'code': True, 'data': request.POST.get('username')} import json return HttpResponse(json.dumps(ret))
1.原生Ajax(XmlHttpRequest)上传文件+定制好看的上传按钮:
2.JQuery进行文件的上传:
{# #}
上面两种方式都用到FormData(),但是如果是IE浏览器的话是不支持FormData(),所以就得用到下面这种方式
3.Iframe进行文件的上传:
上传文件时预览
1.预览
views.py
def upload(request): return render(request,'upload.html') def upload_file(request): username = request.POST.get(('username')) fafafa = request.FILES.get('fafafa') #获取文件 import os img_path = os.path.join('static/imgs/',fafafa.name) #static下创建imgs目录 with open(img_path,'wb') as f: for item in fafafa.chunks(): f.write(item) print(username,fafafa) ret = { 'code': True, 'data': img_path} import json return HttpResponse(json.dumps(ret))
upload.html
2.选择文件后直接上传