Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,AJAX = 异步 JavaScript和XML(标准通用标记语言的子集),AJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。

这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

-----传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面;

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

Ajax工作原理:

1. 基本参数

$.ajax,这个是JQuery对ajax封装的最基础步骤,通过使用这个函数可以完成异步通讯的所有功能。也就是说什么情况下我们都可以通过此方法进行异步刷新的操作。但是它的参数较多,有的时候可能会麻烦一些。看一下常用的参数:

  var configObj = {
method //数据的提交方式:get和post
url //数据的提交路径
async //是否支持异步刷新,默认是true
data //需要提交的数据
dataType //服务器返回数据的类型,例如xml,String,Json等
success //请求成功后的回调函数
error //请求失败后的回调函数
} $.ajax(configObj);//通过$.ajax函数进行调用。

2. 实例分析

$.ajax({
url: '/host', // 数据提交地址
type: "POST", // 提交类型
data: {'k1': 123, 'k2': "root"}, // 提交的内容 字典格式
success: function(data){    // 客户端会一直等待服务端返回的数值
// data是服务器端返回的字符串
var obj = JSON.parse(data);
}
}) 建议:永远让服务器端返回一个字典
return HttpResponse(json.dumps(字典))

3. 简单的前后端交互

<div class="shade hide"></div>
<div class="add-modal hide">
<form method="POST" action="/home/">
<div class="group">
<input id='host' type="text" placeholder="主机名" name="hostname" />
</div> <div class="group">
<input id='ip' type="text" placeholder="IP" name="ip" />
</div> <div class="group">
<input id='port' type="text" placeholder="端口" name="port" />
</div> <div class="group">
<select id='sel' name="b_id">
{% for op in b_list %}
<option value="{{ op.id }}">{{ op.caption }}</option>
{% endfor %}
</select>
</div>
<input type="submit" value="提交" />
<a id="ajax_submit">要上天提交</a>
<input id="cancel" type="button" value="取消" /> </form> </div>

index.html

Ajax代码:

$(function(){
$('#ajax_submit').click(function () {
$.ajax({
url:"/test_ajax/",
type:"POST",
data:{'hostname':$('#host').val(),'ip':$('#ip').val(),'port':$('#port').val(),'b_id':$('#sel').val()},
success:function (data) {
if(data=='OK'){
location.reload() // 重新加载页面
}else {
alert(data);
}
}
})
})
})

Django代码:

def test_ajax(request):
print(request.method)
h = request.POST.get('hostname')
i = request.POST.get('ip')
p = request.POST.get('port')
b = request.POST.get('b_id')
print(h,i,p,b)
if h and len(h) > 5: # 主机名长度判断
models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b) # 创建数据
return HttpResponse("OK")    # 返回OK 严格大小写
else:
return HttpResponse("主机名太短")  # 返回错误提示

4. 对前后端交互完善(当后端有问题时,前端收不到data,页面无反应)

<div class="add-modal hide">
<form method="POST" action="/home/">
<div class="group">
<input id='host' type="text" placeholder="主机名" name="hostname" />
</div> <div class="group">
<input id='ip' type="text" placeholder="IP" name="ip" />
</div> <div class="group">
<input id='port' type="text" placeholder="端口" name="port" />
</div> <div class="group">
<select id='sel' name="b_id">
{% for op in b_list %}
<option value="{{ op.id }}">{{ op.caption }}</option>
{% endfor %}
</select>
</div>
<input type="submit" value="提交" />
<a id="ajax_submit">要上天提交</a>
<input id="cancel" type="button" value="取消" />
<span id="error_msg"></span> </form> </div>

index.html

Ajax代码:

$(function(){
$('#ajax_submit').click(function () {
$.ajax({
url:"/test_ajax/",
type:"POST",
data:{'hostname':$('#host').val(),'ip':$('#ip').val(),'port':$('#port').val(),'b_id':$('#sel').val()},
success:function (data) {
console.log(data) // data {"data": null, "status": false, "error": "\u4e3b\u673a\u540d\u592a\u77ed"}
var obj = JSON.parse(data); // 反序列化 把字符串data换成对象obj
// 序列化 JSON.stringify() 把obj转换为字符串
if(obj.status){
location.reload() // 重新加载页面
}else {
$('#error_msg').text(obj.error)
}
}
})
})
})

Django代码:

import json
def test_ajax(request):
ret = {'status':True,'error':None,'data':None} # 返回一个字典
try:
h = request.POST.get('hostname')
i = request.POST.get('ip')
p = request.POST.get('port')
b = request.POST.get('b_id')
print(h,i,p,b)
if h and len(h) > 5: # 主机名长度
print("ok")
models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
else:
ret['status'] = False
ret['error'] = '主机名太短'
except Exception as e:
ret['status'] = False
ret['error'] = '请求错误'
return HttpResponse(json.dumps(ret)) # 对字典进行序列化

5. serialize自动获取表单数据

<form class="add-form" method="POST" action="/home/">
<div class="group">
<input id='host' type="text" placeholder="主机名" name="hostname" />
</div> <div class="group">
<input id='ip' type="text" placeholder="IP" name="ip" />
</div> <div class="group">
<input id='port' type="text" placeholder="端口" name="port" />
</div> <div class="group">
<select id='sel' name="b_id">
{% for op in b_list %}
<option value="{{ op.id }}">{{ op.caption }}</option>
{% endfor %}
</select>
</div>
<input type="submit" value="提交" />
<a id="ajax_submit">要上天提交</a>
<input id="cancel" type="button" value="取消" />
<span id="error_msg"></span>
</form>

index.html

Ajax代码:

$.ajax({
url:"/test_ajax/",
type:"POST",
data:$('.add-form').serialize(), // 获取表单数据提交 必须是form表单
success:function (data) {
})

6. Ajax代码补充(traditional,dataType)

Ajax代码:

$(function(){
$('#add_submit_ajax').click(function(){
$.ajax({
url: '/ajax_add_app',
data: {'user': 123,'host_list': [1,2,3,4]},
// data: $('#add_form').serialize(),
type: "POST",
dataType: 'JSON', // 内部对传过来的数据直接执行JSON.parse 拿到的数据直接为对象而非字符串
traditional: true, // 添加此项 当字典里包含列表时候,后端可以getlist到里面的数据
success: function(obj){
console.log(obj);
},
error: function () { // 未知错误时执行,指前端收不到后台发送的obj时,执行
}
})
});
})

Django代码:

def ajax_add_app(request):
ret = {'status':True, 'error':None, 'data': None} app_name = request.POST.get('app_name')
host_list = request.POST.getlist('host_list')
obj = models.Application.objects.create(name=app_name)
obj.r.add(*host_list)
return HttpResponse(json.dumps(ret))

web前端基础知识-(八)Ajax的更多相关文章

  1. web前端基础知识及快速入门指南

    web前端基础知识及快速入门指南 做前端开发有几个月了,虽然说是几个月,但是中间断断续续的上课.考试以及其它杂七杂八的事情,到现在居然一直感觉自己虽然很多前端的知识很眼熟,却也感觉自己貌似也知识在门口 ...

  2. web前端基础知识学习网站推介

    内容:一.基础知识及学习资料1. HTML入门学习:http://www.w3school.com.cn/html/index.aspHTML5 入门学习:http://www.w3school.co ...

  3. web前端基础知识总结

    上个寒假总结的web前端的一些知识点给大家分享一下 1.<html>和</html> 标签限定了文档的开始和结束点. 属性: (1)  dir: 文本的显示方向,默认是从左向右 ...

  4. web前端基础知识-(八)Django进阶之数据库对象关系映射

    Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...

  5. web前端基础知识-(七)Django进阶

    通过上节课的学习,我们已经对Django有了简单的了解,现在来深入了解下~ 1. 路由系统 1.1 单一路由对应 url(r'^index$', views.index), 1.2 基于正则的路由 u ...

  6. web前端基础知识

    #HTML    什么是HTML,和他ML...    网页可以比作一个装修好了的,可以娶媳妇的房子.    房子分为:毛坯房,精装修    毛坯房的修建: 砖,瓦,水泥,石头,石子....    精 ...

  7. web前端基础知识-(五)jQuery

    通过之前的学习我们已经了解了html.css.javascript的相关知识:本次我们就共同学习进阶知识:jQuery~ 一.什么是jQuery? jQuery其实就是一个轻量级的javascript ...

  8. web前端基础知识 - Django进阶

    1. 路由系统 1.1 单一路由对应 url(r'^index$', views.index), 1.2 基于正则的路由 url(r'^index/(\d*)', views.index), url( ...

  9. web前端基础知识 jQuery

    通过之前的学习我们已经了解了html.css.javascript的相关知识:本次我们就共同学习进阶知识:jQuery~ 一.什么是jQuery? jQuery其实就是一个轻量级的javascript ...

随机推荐

  1. SQLSERVER 2012 收缩日志

    select log_reuse_wait_desc from sys.databases where name='tfs_CARDLANWEB' backup log tfs_CARDLANWEB ...

  2. IO流总结

    IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类:  按照操作数据的类型分为两种: 字节流和字符流.  按 ...

  3. 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)

    3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...

  4. 0033 Java学习笔记-反射-初步1

    先看看通过反射能干嘛 示例:修改对象的private实例变量 package testpack; import java.lang.reflect.Field; public class Test1 ...

  5. 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...

  6. RabbitMQ调试与测试工具-v1.0.1 -提供下载测试与使用

    最近几天在看RabbitMQ,所以发了两天时间写了一个调试和测试工具.方便使用. 下载地址:RabbitMQTool-V1.0.1.zip

  7. Microsoft SQL Server 2008 R2 安装卸载

    问题 问题1 标题: Microsoft SQL Server 2008 R2 安装程序 ------------------------------ 出现以下错误: Could not open k ...

  8. codevs 2879 堆的判断

    codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...

  9. [LeetCode] Wiggle Sort 摆动排序

    Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...

  10. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...