• 对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;

  • 相关阅读:
    JavaWeb笔记
    Session案例_登录注销
    会话
    Cookie入门
    jsp入门
    if else优化
    cheap-source-map--不显示源码 、source-map--显示源码 、 eval--最快的编译办法
    npm run dev 克隆报错
    $emit和$on的用法
    npm
  • 原文地址:https://www.cnblogs.com/kisun168/p/9879537.html
Copyright © 2020-2023  润新知