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

异步的JavaScript:

  使用 【JavaScript语言】 以及相关【浏览器提供类库】 的功能向服务端发送请求,当服务端处理完请求之后,【自动执行某个JavaScript的回调函数】。

  PS:以上请求和响应的整个过程是【偷偷】进行的,页面上无任何感知。

XML:XML是一种标记语言,是Ajax在和后台交互时传输数据的格式之一。

一、原生AJAX

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

1、XmlHttpRequest对象使用案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="text" name="i1">
+
<input type="text" name="i2">
=
<input type="text" name="i3">
<input type="button" id="btn1" value="jQuery Ajax" onclick="add1()">
{#绑定一个点击事件#}
<input type="button" id="btn2" value="原生 Ajax" onclick="add2()">
{#绑定一个点击事件#}
<script src="/static/jquery-3.2.1.js"></script>
<script>
{#=============================================常用方式========================================#}
    function add1() {
        $.ajax({
            url:\'/add1/\',
            type:\'POST\',
            data:{\'i1\':$(\'#i1\').val(),\'i2\':$(\'#i2\').val()},
{#通过jquery获取标签的值#}
            success:function (arg) {
{#回调函数,把arg参数传进去#}
                $(\'#i3\').val(arg);
{#通过jquery设置i3标签的值为arg变量的内容#}
            }
        })
    }


    function add2() {
{# ==========================================原生Ajax GET方式======================================#}
        var xhr =new XMLHttpRequest();
{#使用原生的Ajax 创建一个对象#}
        xhr.onreadystatechange=function () {
{#为对象设置回调函数#}
            if(xhr.readyState==4){
{#如果对象执行时的数值等于4就执行下边的#}
                alert(xhr.responseText);
{#弹出提示框,框内的内容是对象返回的文本信息#}
            }

        };
        xhr.open(\'GET\',\'/add2/?i1=12&i2=19\');
{#通过对象创建一个连接 参数(GET传输方式,/add2/传输的地址url ?i1=12&i2=19这是放在url上的数据) 通过get方式传输,把传输的内容放在请求头中,传输到/add2/url#}
        xhr.send();
{#对象调用进行发送#}


{# ==========================================POST方式======================================#}
        var xhr =new XMLHttpRequest()
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4){
                alert(xhr.responseText);
            }

        }
    };
    xhr.open(\'POST\',\'/add2/\');
{#通过对象创建一个连接 参数(post传输方式,/add2/传输的地址url ) 通过get方式传输,把传输的内容放在请求体中,传输到/add2/url#}
    xhr.setRequestHeader(\'Content-Type\',\'application/x-www-from-urlencoded\');
{#设置请求体,因为后端需要进行请求体的校验#}
    xhr.send(\'i1=12&i2=19\');
{#设置要发送的数据#}
</script>
</body>
</html>

原生的 Ajax html

  

 

2、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()
  
    终止请求

  

2、XmlHttpRequest对象的主要属性:

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...

  

二、jQuery Ajax

jQuery其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能。

  • jQuery 不是生产者,而是大自然搬运工。
  • jQuery Ajax本质 XMLHttpRequest 或 ActiveXObject 

jquery ajax 方法列表:

jQuery.get(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数。
                 success: 载入成功时回调函数。
                dataType: 返回内容格式,xml, json,  script, text, html


            jQuery.post(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数
                 success: 载入成功时回调函数
                dataType: 返回内容格式,xml, json,  script, text, html


            jQuery.getJSON(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数。
                 success: 载入成功时回调函数。


            jQuery.getScript(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数。
                 success: 载入成功时回调函数。


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

                                  如果不指定,jQuery 将自动根据HTTP包MIME信息返回相应类型(an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string

                 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;
                                }
                              },
                            });

jQuery Ajax 方法列表  

 

jquery ajax demo:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <p>
        <input type="button" onclick="XmlSendRequest();" value=\'Ajax请求\' />
    </p>


    <script type="text/javascript" src="jquery-1.12.4.js"></script>
    <script>

        function JqSendRequest(){
            $.ajax({
                url: "http://c2.com:8000/test/",
                type: \'GET\',
                dataType: \'text\',
                success: function(data, statusText, xmlHttpRequest){
                    console.log(data);
                }
            })
        }


    </script>
</body>
</html>

基于jQueryAjax - Demo

  

 

三、伪造ajax

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

 1 <!DOCTYPE html>
 2 <html>
 3   
 4     <head lang="en">
 5         <meta charset="UTF-8">
 6         <title></title>
 7     </head>
 8   
 9     <body>
10   
11         <div>
12             <p>请输入要加载的地址:<span id="currentTime"></span></p>
13             <p>
14                 <input id="url" type="text" />
15                 <input type="button" value="刷新" onclick="LoadPage();">
16             </p>
17         </div>
18   
19   
20         <div>
21             <h3>加载页面位置:</h3>
22             <iframe id="iframePosition" style="width: 100%;height: 500px;"></iframe>
23         </div>
24   
25   
26         <script type="text/javascript">
27   
28             window.onload= function(){
29                 var myDate = new Date();
30                 document.getElementById(\'currentTime\').innerText = myDate.getTime();
31   
32             };
33   
34             function LoadPage(){
35                 var targetUrl =  document.getElementById(\'url\').value;
36                 document.getElementById("iframePosition").src = targetUrl;
37             }
38   
39         </script>
40   
41     </body>
42 </html>

伪造ajax demo1

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form id="f1" method="POST" action="fake_ajax" target="ifr">
 9 {#通过form标签指定以post传输 传输的url是fake_ajax  提交方式使用form表单里的ifr   这样就达到不刷新页面也能把所有信息打包发送#}
10     {% csrf_token %}
11 {#csrf验证#}
12     <input type="text" name="user">
13     <a onclick="submitForm();">提交</a>
14 {#绑定点击事件#}
15     <iframe id="ifr" name="ifr" src="http://www.baidu.com" width="1000px" height="2000px"></iframe>
16 {#使用iframe 标签 访问http://www.baidu.com链接 这样就成功的伪造了一个Ajax#}
17 </form>
18 <script>
19     function submitForm() {
20 {#定义函数#}
21         document.getElementById(\'ifr\').onclick=loadIframe;
22 {#查找id是ifr的标签设置一个点击事件,相当于绑定一个回调函数#}
23         document.getElementById(\'f1\').submit();
24 {#找到id是f1的标签.触发提交函数#}
25     }
26 
27     function loadIframe() {
28 {#定义一个相当于回调函数的函数#}
29         alert(123);
30     }
31 </script>
32 </body>
33 </html>
34 
35 伪 Ajax html

伪造ajax demo2

 

四、使用原生Ajax/jquery ajax做一个文件上传功能

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9     <h1>原生Ajax上传文件</h1>
10     <input type="file" id="i1">
11     <a onclick="upload1();">上传</a>
12     <div id="container1"></div>
13 
14 
15 
16 {#======================================================原生Ajax上传文件======================================#}
17         function  upload1() {
18 {#定义一个点击事件函数#}
19             var formData =new FormData();
20 {#通过FornData 实例化一个对象,FormData是个特殊的功能,可以传输文件和字符串#}
21             formData.append(\'k1\',\'v1\');
22 {#给对象添加俩个值键是k1 值是v1#}
23             formData.append(\'fafafa\',document.getElementById(\'i1\').files[0]);
24 {#给对象添加键是fafafa 值是i1标签的第一个#}
25             var xhr =new XMLHttpRequest();
26 {#实例化一个对象#}
27             xhr.onreadystatechange =function () {
28 {#给对象设置一个回调函数#}
29                 if (xhr.readyState==4){
30 {#判断如果xhr对象的执行数字等于4#}
31                     var file_path =xhr.responseText;
32 {#获取对象的文本信息赋值给file_path responseText是返回文本字符串#}
33                     var tag = document.createElement(\'img\');
34 {#创建一个img标签,标签名字是tag#}
35                     tag.src=\'/\'+file_path;
36 {#通过标签名创建一个图片路径#}
37                     document.getElementById(\'container1\').appendChild(tag);
38 {#通过id找到container1标签 然后再通过标签的名添加个子标签#}
39                 }
40             }
41         };
42         xhr.open(\'POST\',\'/upload/\');
43 {#对象调用open方法创建一个连接,参数post传输方式  /upload/传输地址url#}
44         xhr.send(formData);
45 {#通过对象发送FormData实例化的对象#}
46 
47 
48     </script>
49 </body>
50 </html>
51 
52 原生Ajax 文件上传html

原生ajax uoload file

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 
10     <h1>JQuery Ajax上传文件</h1>
11     <input type="file" id="i2">
12     <a onclick="upload2();">上传</a>
13     <div id="container2"></div>
14 
15 
16 {#======================================================JQuery Ajax上传文件======================================#}
17         function upload2() {
18 {#定义一个函数#}
19             var formData =new FormData();
20 {#通过FornData 实例化一个对象,FormData是个特殊的功能,可以传输文件和字符串#}
21             formData.append(\'k1\',\'v1\');
22 {#给对象添加俩个值键是k1 值是v1#}
23             formData.append(\'fafafa\',$(\'#i2\')[0].files[0]);
24 {#把fafafa作为键 值是id等于i2的标签转换成Dom对象的第一个#}
25             $.ajax({
26                 url:\'/upload/\',
27                 type:\'POST\',
28                 data:formData,
29                 contentType:false,
30 {#告诉后端不进行请求头设置#}
31                 processData:false,
32 {#告诉后端不进行请求头设置#}
33                 success:function (arg) {
34 {#回调函数#}
35                     var tag =document.createElement(\'img\');
36 {#创建一个img标签名称为tag#}
37                     tag.src=\'/\'+arg;
38 {#为名字为tag的标签设置路径#}
39                     $(\'#container2\').append(tag);
40 {#为id是container2标签的添加名字是tag的标签为子标签#}
41                 }
42             })
43 
44         }
45 
46 
47 
48 
49     </script>
50 </body>
51 </html>
52 
53 JQuery Ajax 文件上传 html

jquery upload file

以下是原生、jquery和伪造ajax demo
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
    <h1>原生Ajax上传文件</h1>
    <input type="file" id="i1">
    <a onclick="upload1();">上传</a>
    <div id="container1"></div>
 
 
    <h1>JQuery Ajax上传文件</h1>
    <input type="file" id="i2">
    <a onclick="upload2();">上传</a>
    <div id="container2"></div>
 
     
 
    <h1>伪 Ajax上传文件</h1>
    <form id="f1" method="POST" action="/upload/" target="ifr" enctype="multipart/form-data">
    <iframe id="ifr" name="ifr" src="" style="display: none"></iframe>
    <input type="file" name="fafafa">
    <a onclick="upload3();">上传</a>
    </form>
    <div  id="container3"></div>
    <script src="/static/jquery-3.2.1.js"></script>
    <script>
 
{#======================================================原生Ajax上传文件======================================#}
        function  upload1() {
{#定义一个点击事件函数#}
            var formData =new FormData();
{#通过FornData 实例化一个对象,FormData是个特殊的功能,可以传输文件和字符串#}
            formData.append(\'k1\',\'v1\');
{#给对象添加俩个值键是k1 值是v1#}
            formData.append(\'fafafa\',document.getElementById(\'i1\').files[0]);
{#给对象添加键是fafafa 值是i1标签的第一个#}
            var xhr =new XMLHttpRequest();
{#实例化一个对象#}
            xhr.onreadystatechange =function () {
{#给对象设置一个回调函数#}
                if (xhr.readyState==4){
{#判断如果xhr对象的执行数字等于4#}
                    var file_path =xhr.responseText;
{#获取对象的文本信息赋值给file_path responseText是返回文本字符串#}
                    var tag = document.createElement(\'img\');
{#创建一个img标签,标签名字是tag#}
                    tag.src=\'/\'+file_path;
{#通过标签名创建一个图片路径#}
                    document.getElementById(\'container1\').appendChild(tag);
{#通过id找到container1标签 然后再通过标签的名添加个子标签#}
                }
            }
        };
        xhr.open(\'POST\',\'/upload/\');
{#对象调用open方法创建一个连接,参数post传输方式  /upload/传输地址url#}
        xhr.send(formData);
{#通过对象发送FormData实例化的对象#}
 
 
{#======================================================JQuery Ajax上传文件======================================#}
        function upload2() {
{#定义一个函数#}
            var formData =new FormData();
{#通过FornData 实例化一个对象,FormData是个特殊的功能,可以传输文件和字符串#}
            formData.append(\'k1\',\'v1\');
{#给对象添加俩个值键是k1 值是v1#}
            formData.append(\'fafafa\',$(\'#i2\')[0].files[0]);
{#把fafafa作为键 值是id等于i2的标签转换成Dom对象的第一个#}
            $.ajax({
                url:\'/upload/\',
                type:\'POST\',
                data:formData,
                contentType:false,
{#告诉后端不进行请求头设置#}
                processData:false,
{#告诉后端不进行请求头设置#}
                success:function (arg) {
{#回调函数#}
                    var tag =document.createElement(\'img\');
{#创建一个img标签名称为tag#}
                    tag.src=\'/\'+arg;
{#为名字为tag的标签设置路径#}
                    $(\'#container2\').append(tag);
{#为id是container2标签的添加名字是tag的标签为子标签#}
                }
            })
 
        }
 
        function upload3() {
{#            定义一个函数#}
            document.getElementById(\'ifr\').onload=loadIframe;
{#            查找id是ifr的标签并设置在加载时调用loadIframe函数#}
            document.getElementById(\'f1\').submit();
{#查找id是f1的标签并启动#}
        }
 
        function loadIframe() {
{#定义一个函数#}
            var content =document.getElementById(\'ifr\').contentWindow.document.body.innerText;
{#查找id是ifr的标签,的window内容的请求体的文本信息#}
            var tag = document.createElement(\'img\');
{#创建一个img标签并设置标签名字是tag#}
            tag.src=\'/\'+content;
{#找到名字是tag标签设置路径#}
            $(\'#container3\').append(tag);
{#找到id 是container3的标签添加一个名字是tag的标签tag#}
 
        }
    </script>
</body>
</html>

  

 

版权声明:本文为adamans原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/adamans/articles/7145181.html