1.简介
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
a.同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
b.异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程
2.示例
页面输入两个整数,通过AJAX传输到后端计算出结果并返回。
html文件名称为ajax_demo1.html,内容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>AJAX局部刷新实例</title> </head> <body> <input type="text" id="i1">+ <input type="text" id="i2">= <input type="text" id="i3"> <input type="button" value="AJAX提交" id="b1"> <script src="/static/jquery-3.2.1.min.js"></script> <script> $("#b1").on("click", function () { $.ajax({ url:"/ajax_add/", //别忘了加双引号 type:"GET", data:{"i1":$("#i1").val(),"i2":$("#i2").val()}, //object类型,键值形式的,可以不给键加引号 success:function (data) { $("#i3").val(data); } }) }) </script> </body> </html>
views.py里面的内容:
def ajax_demo1(request): return render(request, "ajax_demo1.html") def ajax_add(request):
#time.sleep(10) #不影响页面发送其他的请求 i1 = int(request.GET.get("i1")) i2 = int(request.GET.get("i2")) ret = i1 + i2 return JsonResponse(ret, safe=False)
#return render(request,'index.html') #返回一个页面没有意义,就是一堆的字符串,拿到了这个页面,你怎么处理,你要做什么事情,根本就没有意义
urls.py里面的内容
urlpatterns = [ ... url(r'^ajax_add/', views.ajax_add), url(r'^ajax_demo1/', views.ajax_demo1), ... ]
启动django项目,然后运行看看效果,页面不刷新
3.AJAX常见应用情景
搜索引擎根据用户输入的关键字,自动提示检索关键字。
还有一个很重要的应用场景就是注册时候的用户名的查重。
其实这里就使用了AJAX技术!当文件框发生了输入变化时,使用AJAX技术向服务器发送一个请求,然后服务器会把查询到的结果响应给浏览器,最后再把后端返回的结果展示出来。
a.整个过程中页面没有刷新,只是刷新页面中的局部位置而已!
b.当请求发出后,浏览器还可以进行其他操作,无需等待服务器的响应!
当输入用户名后,把光标移动到其他表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为lemontree7777777的用户是否存在,最终服务器返回true表示名为lemontree7777777的用户已经存在了,浏览器在得到结果后显示“用户名已被注册!”。
a.整个过程中页面没有刷新,只是局部刷新了;
b.在请求发出后,浏览器不用等待服务器响应结果就可以进行其他操作;
4.AJAX的优缺点
优点:
1.AJAX使用JavaScript技术向服务器发送异步请求;
2.AJAX请求无须刷新整个页面;
3.因为服务器响应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高;
例子:一个登陆认证页面,登陆失败不刷新页面,提示用户登陆失败,登陆成功自动跳转到网站首页。
# html页面: {% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> </head> {#<form action="{% url 'login' %}" method="post" >#} {# {% csrf_token %}#} {# 用户名: <input type="text" name="username">#} {# 密码: <input type="password" name="password">#} {# <input type="submit">#} {##} {#</form>#} {% csrf_token %} 用户名: <input type="text" id="username"> 密码: <input type="password" id="password"> <button id="sub" >提交</button> <span id="error" style="color: red;, font-size: 12;"></span> </body> <script src="{% static 'js/jquery.js' %}"></script> <script> $('#sub').click(function () { var name = $('#username').val(); var pw = $('#password').val(); var csrf_token = $('input[name=csrfmiddlewaretoken]').val(); $.ajax({ url: {% url 'login' %}, # 向哪里提交数据 type: 'post', # 提交数据的方式 data:{'uname':name, 'pwd':pw, 'csrfmiddlewaretoken':csrf_token}, # 提交的数据 /object类型, 键值形式,键可以不加引号 success: function (response) { # response: 形参, if(response.status){ $('#error').text('成功了'); location.href = response.home_url; }else{ $('#error').text('失败了'); } } }) }) </script> </html>
# views.py from django.shortcuts import render, HttpResponse, redirect from app01 import models from django.http import JsonResponse from django.urls import reverse import json # Create your views here. def login(request): if request.method == "GET": return render(request, 'login.html') else: # form 表单提交数据 # uname = request.POST.get('username') # pwd = request.POST.get('password') # print(uname, pwd) # return HttpResponse('ok') a = {'status': None, 'home_url': None} uname = request.POST.get('uname') pwd = request.POST.get('pwd') print(uname, pwd) ret = models.UserInfo.objects.filter(name=uname, pwd=pwd) if ret.exists(): a['status'] = True a['home_url'] = reverse('home') a_json = json.dumps(a) # return HttpResponse(a_json, content_type='application/json') return JsonResponse(a ) else: return HttpResponse('file') def home(request): return render(request, 'home.html')
# urls.py from django.conf.urls import url # from django.contrib import admin from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^login/', views.login, name='login'), url(r'^home/', views.home, name='home'), ]
登陆失败:
登陆成功:(会跳转到home页面)