zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    BZOJ1819 [JSOI]Word Query电子字典 Trie
    洛谷2973 [USACO10HOL]赶小猪Driving Out the Piggi… 概率 高斯消元
    BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
    BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA
    BZOJ5045 打砖块 2017年9月月赛 其他
    BZOJ1858 [Scoi2010]序列操作 线段树
    BZOJ1826 [JSOI2010]缓存交换 堆 贪心
    BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
    BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
    BZOJ1875 [SDOI2009]HH去散步 矩阵
  • 原文地址:https://www.cnblogs.com/hgzero/p/13404782.html
Copyright © 2011-2022 走看看