Django之Ajax

1. jQuery Ajax

1.1 Ajax简介

1)Ajax概述

AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案。

异步的JavaScript:使用JavaScript以及浏览器提供类库向服务端发送请求,当服务端处理完请求之后,自动执行某个JavaScript的回调函数

XML:是Ajax在于后台之间交互时传输的数据格式之一。

Ajax的请求和响应的整个过程页面上无任何感知。

2)Ajax能实现的功能

注册时检测用户名是否已经存在

登录时提示用户名密码错误

删除数据行时,将行ID发送到后台,后台在数据库中删除,数据库删除成功后,在页面DOM中将数据行也删除

1.2 jQuery Ajax

jQuery Ajax的本质是 XMLHttpRequest 或 ActiveXObject 

1)$.ajax({}) 部分参数

        url:请求地址
       type:请求方式,GET、POST(1.9.0之后用method)
    headers:请求头
       data:要发送的数据
contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
      async:是否异步
    timeout:设置请求超时时间(毫秒)

 beforeSend:发送请求前执行的函数(全局)
   complete:完成之后执行的回调函数(全局)
    success:成功之后执行的回调函数(全局)
      error:失败之后执行的回调函数(全局)


    accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
   dataType:将服务器端返回的数据转换成指定类型
converters:转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数

2)dataType的类型

"xml": 将服务器端返回的内容转换成xml格式
"text": 将服务器端返回的内容转换成普通文本格式
"html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
"script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
"json": 将服务器端返回的内容转换成相应的JavaScript对象
"jsonp": JSONP 格式
    # 使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
    
# 如果不指定,jQuery 将自动根据HTTP包MIME信息返回相应类型

3)converters转换器

// converters: 转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数
$.ajax({
  accepts: {
    mycustomtype: 'application/x-some-custom-type'
  },
  
  // Expect a `mycustomtype` back from server
  dataType: 'mycustomtype'

  // Instructions for how to deserialize a `mycustomtype`
  converters: {
    'text mycustomtype': function(result) {
      // Do Stuff
      return newresult;
    }
  },
});

1.3 jQuery Ajax使用示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .btn{
            display: inline-block;
            padding: 5px 10px;
            background-color: coral;
            color: white;
        }
    </style>
</head>
<body>

<div>
    <a class="btn" onclick="AjaxSubmit1();">点我1</a>
    <a class="btn" onclick="AjaxSubmit2();">点我2</a>
</div>

<script type="text/javascript" src="/static/jquery-3.1.1.js"></script>
<script>
    function AjaxSubmit1() {
        $.ajax({
            url: '/ajax1.html',
            type: "GET",
            data: {'p': 123},
            success: function (arg) {
            }
        })
    }
    function AjaxSubmit2() {
        $.ajax({
            url: '/ajax1.html',
            type: "POST",
            data: {'p': 123},
            success: function (arg) {
            }
        })
    }
</script>
</html>

2. 原生Ajax

  • Ajax主要就是使用 XmlHttpRequest 对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE)
  • Ajax首次出现IE5.5中存在(ActiveX控件)

2.1 XmlHttpRequest对象的方法

void open(String method,String url,Boolen async)
	作用:用于创建请求
	参数:
		method: 请求方式(字符串类型),如:POST、GET、DELETE...
		url:    要请求的地址(字符串类型)
		async:  是否异步(布尔类型)

void send(String body)
	作用:用于发送请求
	参数:
		body: 要发送的数据(字符串类型)

void setRequestHeader(String header,String value)
	作用:用于设置请求头
	参数:
		header: 请求头的key(字符串类型)
		vlaue:  请求头的value(字符串类型)

String getAllResponseHeaders()
	作用:获取所有响应头
	返回值:
		响应头数据(字符串类型)

String getResponseHeader(String header)
	作用:获取响应头中指定header的值
	参数:
		header: 响应头的key(字符串类型)
	返回值:
		响应头中指定的header对应的值

void abort()
	作用:终止请求

2.2 XmlHttpRequest对象的属性

Number readyState
	状态值(整数)
	详细:
	   0-未初始化,尚未调用open()方法
	   1-启动,调用了open()方法,未调用send()方法
	   2-发送,已经调用了send()方法,未接收到响应
	   3-接收,已经接收到部分响应数据
	   4-完成,已经接收到全部响应数据

Function onreadystatechange
	当readyState的值改变时自动触发执行其对应的函数(回调函数)

String responseText
	服务器返回的数据(字符串类型)

XmlDocument responseXML
	服务器返回的数据(Xml对象)

Number states
	状态码(整数),如:200、404...

String statesText
	状态文本(字符串),如:OK、NotFound...

2.3 使用示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .btn{
            display: inline-block;
            padding: 5px 10px;
            background-color: coral;
            color: white;
        }
    </style>
</head>
<body>

<div>
    <a class="btn" onclick="AjaxSubmit1();">点我1</a>
    <a class="btn" onclick="AjaxSubmit2();">点我2</a>
</div>

<script type="text/javascript" src="/static/jquery-3.1.1.js"></script>
<script>
        function AjaxSubmit2() {
            var xhr = new XMLHttpRequest();
            // 定义回调函数
            xhr.onreadystatechange = function () {
                 ///0-未初始化,尚未调用open()方法
                 // 1-启动,调用了open()方法,未调用send()方法
                 // 2-发送,已经调用了send()方法,未接收到响应
                 // 3-接收,已经接收到部分响应数据
                 // 4-完成,已经接收到全部响应数据
                if(xhr.readyState == 4){
                  // 接收完毕服务器返回的数据
                    console.log(xhr.responseText)
                }
            };
            // 指定连接方式和地址
            xhr.open('GET', '/ajax1.html?p=123');
            // 发送请求
            xhr.send(null);
        }
        
        function AjaxSubmit4() {
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function () {
                if(xhr.readyState == 4){
                  // 接收完毕服务器返回的数据
                    console.log(xhr.responseText)
                }
            };
            xhr.open('POST', '/ajax1.html?p=123');
            // 设置请求头,固定格式
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8  ');
            xhr.send("p=456");
    }
</script>
</html>

3. 伪Ajax

由于HTML标签的 iframe 标签具有局部加载内容的特性(页面不刷新),所以可以使用其来伪造Ajax请求。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Iframe伪造Ajax请求</h3>
<div>
    <h3>基于Iframe+Form表单构建伪Ajax</h3>
    <iframe id="iframe" name="ifra"></iframe>
    <form action="/ajax1.html" method="POST" id='fm' target="ifra">
        <input type="text" name="root" value="11111">
        <a onclick="AjaxSubmit();">提交</a>
    </form>
</div>

<script type="text/javascript" src="/static/jquery-3.1.1.js"></script>
<script>
    function AjaxSubmit() {
        document.getElementById('iframe').onload = reloadIframe;
        document.getElementById('f').submit();
    }

    function reloadIframe() {
        {#console.log(ths.contentWindow.document.body.innerHTML);#}
        {#console.log($(ths).contents().find('body').html());#}
        var content = this.contentWindow.document.body.innerHTML;
        var obj = JSON.parse(content);
        if (obj.status){
            alert(obj.message);
        }
    }
</script>

</body>
</html>

4. 跨域Ajax

原文地址:https://www.cnblogs.com/hgzero/p/13404782.html