对Ajax的理解

一、什么是Ajax?

  ajax全称为Asynchronous JavaScript and XML (异步的JavaScript和XML),是一种创建交互式网页应用的网页开发技术方案,它的出现使得传统的web应用程序,从一次请求得到完整的被渲染后的网页文件 到  网页局部刷新的一次改变。

  tips:ajax的产生是由于用户的操作而偷偷进行的 客户端与服务器交互数据的行为

    XML是一种标记语言,是数据交互以及传输一种格式,近几年比较火的还有json;

二、Ajax的应用:

  1.用户上传头像的预览功能;

  2.注册,验证登录操作,比如用户名是否重复、登录密码是否错误等等;

  3.主机管理系统中的编辑功能,例如删除某一行主机信息,会偷偷执行删除数据库相关操作,并删除该页上的数据Dom;

  4.热点新闻的刷新、鼠标滚动刷新等;

  5.等等;

三:原生Ajax:

  Ajax的实现依赖于XmlHttpRequest(主流)以及ActiveXObject(IE6及以下版本) 

 1 a. void open(String method,String url,Boolen async)
 2    用于创建请求
 3     
 4    参数:
 5        method: 请求方式(字符串类型),如:POST、GET、DELETE...
 6        url:    要请求的地址(字符串类型)
 7        async:  是否异步(布尔类型)
 8  
 9 b. void send(String body)
10     用于发送请求
11  
12     参数:
13         body: 要发送的数据(字符串类型)
14  
15 c. void setRequestHeader(String header,String value)
16     用于设置请求头
17  
18     参数:
19         header: 请求头的key(字符串类型)
20         vlaue:  请求头的value(字符串类型)
21  
22 d. String getAllResponseHeaders()
23     获取所有响应头
24  
25     返回值:
26         响应头数据(字符串类型)
27  
28 e. String getResponseHeader(String header)
29     获取响应头中指定header的值
30  
31     参数:
32         header: 响应头的key(字符串类型)
33     返回值:
34         响应头中指定的header对应的值
35  
36 f. void abort()
37  
38     终止请求
原生Ajax主要方法
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>index</title>
 6 </head>
 7 <body>
 8     <input onclick="ajaxtest();" type="button" value="ajax测试">
 9     <form method="post" action="/index/" target="ifm">
10         <iframe src="" name="ifm"></iframe>
11         <input type="url" name="url">
12         <input type="submit" value="提交">
13     </form>
14     {% load staticfiles %}
15     <script src="{% static "jquery-1.12.4.js" %}"></script>
16     <script src="{% static "jquery.cookie.js" %}"></script>
17     <script>
18         //获取XHR对象
19         function getXHR(){
20             var xhr;
21             //兼容操作
22             if(window.XMLHttpRequest){
23                 xhr = new XMLHttpRequest();
24             }
25             else{
26                 xhr = new ActiveXObject("Microsoft.XMLHTTP");
27             }
28             return xhr;
29         }
30         //ajax post操作
31         function ajaxtest(){
32             var xhr = getXHR();
33             xhr.onreadystatechange = function() {
34                 if (xhr.readyState == 4) {
35                     //将获取到的数据反序列化为
36                     var obj = JSON.parse(xhr.responseText);
37                     console.log(obj);
38                 }
39             }
40             xhr.open("POST", "/index/", true)
41             // 如果使用原生的ajax进行post操作,就需要设置以下请求头
42             xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
43             xhr.send(JSON.stringify("action:ajax; "));
44         }
45     </script>
46 </body>
47 </html>
Demo

四:JQuery封装的ajax:

  JQuery封装后的ajax的可读性变得更好,以key-value的方式封装ajax的传输自指定的参数以及数据;

 1 jQuery.get(...)
 2                 所有参数:
 3                      url: 待载入页面的URL地址
 4                     data: 待发送 Key/value 参数。
 5                  success: 载入成功时回调函数。
 6                 dataType: 返回内容格式,xml, json,  script, text, html
 7 
 8 
 9             jQuery.post(...)
10                 所有参数:
11                      url: 待载入页面的URL地址
12                     data: 待发送 Key/value 参数
13                  success: 载入成功时回调函数
14                 dataType: 返回内容格式,xml, json,  script, text, html
15 
16 
17             jQuery.getJSON(...)
18                 所有参数:
19                      url: 待载入页面的URL地址
20                     data: 待发送 Key/value 参数。
21                  success: 载入成功时回调函数。
22 
23 
24             jQuery.getScript(...)
25                 所有参数:
26                      url: 待载入页面的URL地址
27                     data: 待发送 Key/value 参数。
28                  success: 载入成功时回调函数。
29             jQuery.ajax(...)
30 
31                 部分参数:
32 
33                         url:请求地址
34                        type:请求方式,GET、POST(1.9.0之后用method)
35                     headers:请求头
36                        data:要发送的数据
37                 contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
38                       async:是否异步
39                     timeout:设置请求超时时间(毫秒)
40 
41                  beforeSend:发送请求前执行的函数(全局)
42                    complete:完成之后执行的回调函数(全局)
43                     success:成功之后执行的回调函数(全局)
44                       error:失败之后执行的回调函数(全局)
45                 
46 
47                     accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
48                    dataType:将服务器端返回的数据转换成指定类型
49                                    "xml": 将服务器端返回的内容转换成xml格式
50                                   "text": 将服务器端返回的内容转换成普通文本格式
51                                   "html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
52                                 "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
53                                   "json": 将服务器端返回的内容转换成相应的JavaScript对象
54 "jsonp": JSONP 格式
55                                           使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
56 
57                                   如果不指定,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
58 
59                  converters: 转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数
60                          $.ajax({
61                               accepts: {
62                                 mycustomtype: 'application/x-some-custom-type'
63                               },
64                               
65                               // Expect a `mycustomtype` back from server
66                               dataType: 'mycustomtype'
67 
68                               // Instructions for how to deserialize a `mycustomtype`
69                               converters: {
70                                 'text mycustomtype': function(result) {
71                                   // Do Stuff
72                                   return newresult;
73                                 }
74                               },
75                             });
$.ajax的类型
 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 
 9     <p>
10         <input type="button" onclick="XmlSendRequest();" value='Ajax请求' />
11     </p>
12 
13 
14     <script type="text/javascript" src="jquery-1.12.4.js"></script>
15     <script>
16         function JqSendRequest(){
17             $.ajax({
18                 url: "/test/",
19                 type: 'GET',
20                 dataType: 'text',
21                 success: function(data, statusText, xmlHttpRequest){
22                     console.log(data);
23                 }
24             })
25         }
26     </script>
27 </body>
28 </html>
demo

五、“伪”Ajax操作:

  iframe标记具有嵌套HTML对象的特性,简单地说,就是iframe能够在标签内部加载HTML页面的特性,好像是偷偷进行了ajax操作; 

1 <form method="post" action="/index/" target="ifm">
2         <iframe src="" name="ifm"></iframe>
3         <input type="url" name="url">
4         <input type="submit" value="提交">
5 </form>
客户端
def index(request, *args, **kwargs):
    if request.method == "GET":
        return render(request, "index.html")
    elif request.method == "POST":
        ret = {"state": request.POST.get("url", None)};
        print(ret)
        return HttpResponse(json.dumps(ret))
服务端

  其实,诸多网站上的头像预览功能就是利用了这一特性;

  具体过程:

    1. form内部的文件上传,如果采用的是ajax方式提交,需依赖于 new FormData(form-obj) 这一对象(为了方便将该对象命为A);

    2.发送A.get("file-select") 到服务器;

    3.服务器获取数据,并通过file-obj.chunks存储文件内容,并返回dumps后的json数据(包含服务器暂存文件的url)

    4.iframeDocument = iframe.contentWindow.document;

    5.后续对iframe标签提取url;

posted @ 2018-10-30 21:50  风来与你安  阅读(2455)  评论(0编辑  收藏  举报