• ajax编程


    即 Asynchronous [e'sɪŋkrənəs] Javascript And XML, AJAX 不是一门的新的语言,而是对现有技术的综合利用。 本质是在HTTP协议的基础上以异步的方式与服务器进行通信。

    1、 异步

     

    指某段程序执行时不会阻塞其它程序执行,其表现形式为程序的执行顺序不依赖程序本身的书写顺序,相反则为同步。

    其优势在于不阻塞程序的执行,从而提升整体执行效率。

    XMLHttpRequest可以以异步方式的处理程序。

    2、 XMLHttpRequest

    浏览器内建对象,用于在后台与服务器通信(交换数据) , 由此我们便可实现对网页的部分更新,而不是刷新整个页面。

    /*初始化 XMLHttpRequest  可以以异步方式的处理程序*/
    var xhr = new XMLHttpRequest();
    /*js 内置的 http 请求对象  XMLHttpRequest*//*1.怎么使用 这个内置对象*/var xhr = new XMLHttpRequest;
    
        /*2.怎么样去组请求*//*请求的行*/
        xhr.open('post','01.php');
    
        /*请求头*///get  没有必要设置//post 必须设置 Content-Type: application/x-www-form-urlencoded
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    
        /*请内容*//*3.发送请求*/
        xhr.send("name=xjj&age=10");
    2.1、请求

    HTTP请求3个组成部分与XMLHttpRequest方法的对应关系

    1、请求行

    /*设置请求行*/
    /*第一个参数是请求的方式 第二个参数是请求的地址*/ 第三个参数是是否异步(async)async 默认是true*/
    xhr.open('get','09.XMLHttpRequest.php?username=xjj&password=123456', true); //数据可以拼接到字符串上
    xhr.open('post','01.php');

    2、请求头

    /*请求头 注意 post必须设置请求头*/
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    get请求可以不设置

    3、请求主体

    /*发送请求 以&符拼接*/
    xhr.send('username=xjj&password=123456');
    xhr.send("name=xjj&age=10");
    get可以传空
    /*设置请求的内容 get方式的时候 发送的内容 null是不传任何东西的意思*/
    xhr.send(null);

    注意书写顺序

    2.2、响应

    HTTP响应是由服务端发出的,作为客户端更应关心的是响应的结果。

    HTTP响应3个组成部分与XMLHttpRequest方法或属性的对应关系。

    由于服务器做出响应需要时间(比如网速慢等原因),所以我们需要监听服务器响应的状态,然后才能进行处理。

    xhr.onreadystatechange = function(){
    /*什么时候才算是http通讯结束 在readyState=4的是 响应完成*/
    /*什么是才算是通讯成 status 200 */
    //console.log(xhr.readyState);
    //console.log(xhr.responseText);
    if(xhr.readyState == 4 && xhr.status == 200){
    if(xhr.readyState == 4 && xhr.status == 200){
            console.log('ok');
            console.log(xhr.responseText);
            /*把内容渲染在页面当中*/document.querySelector('#result').innerHTML = xhr.responseText;
        }
    **readyState**
    0:请求未初始化(还没有调用 open())。  
    1:请求已经建立,但是还没有发送(还没有调用 send())。  
    2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。  
    3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。  
    4:响应已完成;您可以获取并使用服务器的响应了。

    onreadystatechange是Javascript的事件的一种,其意义在于监听XMLHttpRequest的状态

    1、获取状态行(包括状态码&状态信息)

    xhr.status 状态码 status.txt
    
    
    xhr.statusText 状态码信息

    2、获取响应头

    xhr.getResponseHeader('Content-Type');
    xhr.getAllResponseHeaders();

    3、响应主体

    xhr.responseText
    xhr.responseXML

    我们需要检测并判断响应头的MIME类型后确定使用request.responseText或者request.responseXML

    2.3、API详解
    xhr.open() 发起请求,可以是get、post方式
    xhr.setRequestHeader() 设置请求头
    xhr.send() 发送请求主体get方式使用xhr.send(null)
    xhr.onreadystatechange = function () {} 监听响应状态
    xhr.status表示响应码,如200
    xhr.statusText表示响应信息,如OK
    xhr.getAllResponseHeaders() 获取全部响应头信息
    xhr.getResponseHeader('key') 获取指定头信息
    xhr.responseText、xhr.responseXML都表示响应主体

    注:GET和POST请求方式的差异(面试题)

    1、GET没有请求主体,使用xhr.send(null)   一般是读取数据的时候用

    2、GET可以通过在请求URL上添加请求参数

    3、POST可以通过xhr.send('name=itcast&age=10')    传参数的时候使用

    4、POST需要设置

    5、GET效率更好(应用多)

    6、GET大小限制约4K,POST则没有限制

    3  XML

    1、必须有一个根元素
    <!--root 根节点是一定但添加的-->
    2、不可有空格、不可以数字或.开头、大小写敏感
    3、不可交叉嵌套
    4、属性双引号(浏览器自动修正成双引号了)
    5、特殊符号要使用实体

    6、注释和HTML一样

    虽然可以描述和传输复杂数据,但是其解析过于复杂并且体积较大,所以实现开发已经很少使用了。

    /*xhr.responseXML*/返回的是一个dom对象*/
    var xmlDom = xhr.responseXML//用它才能获取dom;//可以查询元素对象
    var items = xmlDom.querySelectorAll('item');
    <?php 
    //php必须是Content-Type:application/xml  才能返dom
    header('Content-Type:application/xml;charset=utf-8');
    /*返回内容是 application/xml */
    /*php程序来获取xml内容*/
    $xml = file_get_contents('01.xml');
    <?xml version="1.0" encoding="UTF-8"?><root><arrayList><array><src>images/banner.jpg</src><newPirce>12.00</newPirce><oldPrice>30.00</oldPrice></array><array><src>images/banner.jpg</src><newPirce>12.00</newPirce><oldPrice>30.00</oldPrice></array></arrayList></root>
    <?php 
        header('Content-Type:text/xml;charset=utf-8');
        /*以xml格式传输数据的时候要求响应内容格式是   text/xml*//*file_get_contents 获取文件内容*/$xml = file_get_contents('01.xml');
    
        /*输出xml内容*/echo$xml;
    ?>
    var xhr = new XMLHttpRequest;
    xhr.open('get','01.php');
    xhr.send(null);
    xhr.onreadystatechange = function(){
        if(xhr.status == 200 && xhr.readyState == 4){
            /*获取到XML格式内容  放回的是DOM对象  document*/var xml = xhr.responseXML;
            /*通过选着器可以获取到xml的数据*/console.log(xml.querySelectorAll('array')[0].querySelector('src').innerHTML);
        }
    }

    4、 JSON

    即 JavaScript Object Notation,另一种轻量级的文本数据交换格式,独立于语言。

    1、数据在名称/值对中
    2、数据由逗号分隔(最后一个健/值对不能带逗号)
    3、花括号保存对象方括号保存数组

    4、使用双引号

    [
      {"src":"images/detail01.jpg","oldPrice":"10.12","newPrice":"130.00"},
      {"src":"images/detail02.jpg","oldPrice":"1.00","newPrice":"11.00"},
      {"src":"images/detail03.jpg","oldPrice":"100.00","newPrice":"1000.00"}
    ]

    JSON数据在不同语言进行传输时,类型为字符串,不同的语言各自也都对应有解析方法,需要解析完成后才能读取

    1、PHP解析方法

    json_encode()、json_decode()

    /*把php数组编码成json字符串  json_encode*/
    $json_str = json_encode($json_obj);
    /*试用json_decode方法解析json字符串  解码成php数组 数组当中是php对象*/
    $json_obj = json_decode($json);
    <?php 
        header('Content-Type:text/html;charset=utf-8');
        /*以json格式传输数据的时候要求响应内容格式是   application/json*//*注意也可以不设置  但是这遵循的一个规范*//*file_get_contents 获取文件内容*/$json = file_get_contents('01.json');
    
        /*输出json内容*/echo$json;
        echo'<br><br>';
    
        $array = array(
            array('src'=>'images/detail01.jpg','newPrice'=>'12.00','oldPrice'=>'455.00'),
            array('src'=>'images/detail02.jpg','newPrice'=>'65.00','oldPrice'=>'878.00'),
            array( 'src'=>'images/detail01.jpg','newPrice'=>'100.00','oldPrice'=>'1000.00')
        );
    
        /*将php数组转化成json字符*/$json_array = json_encode($array);
        echo$json_array;
        echo'<br><br>';
    
        /*将json字符转化成php数组*/$array_json = json_decode($json_array);
        echo$array_json;
        echo'<br><br>';
    ?>

    1、Javascript 解析方法

    JSON对象 JSON.parse()、JSON.stringify();
    JSON兼容处理json2.js

    总结:JSON体积小、解析方便且高效,在实际开发成为首选。

    /*json字符串  怎么转化成js认识的对象   JSON  把这个对象叫做 json对象*/
    var json_obj = JSON.parse(json);
    /*把json对象转成json字符串*/

    var json_str = JSON.stringify(json_obj);
    var xhr = new XMLHttpRequest;
        xhr.open('get','01.php');
        xhr.send(null);
        xhr.onreadystatechange = function(){
            if(xhr.status == 200 && xhr.readyState == 4){
                /*获取仅仅是字符串*/var text = xhr.responseText;
    
                /*需要把字符串转化成JSON对象*/var json_obj = JSON.parse(text);
                console.log(json_obj);
    
                /*我们也可以把JSON对象转化成字符串*/var json_str = JSON.stringify(json_obj);
                console.log(json_str);
            }
        }

    5、 兼容性

    关于IE的兼容方面,了解即可。

    functionXHR() {
            var xhr;
            try {
                xhr = new XMLHttpRequest();
            }
            /*如果 try内的程序运行错误  抛出异常  捕捉异常  上面程序当中运行的错误*/catch(e) {
                /*在不同的IE版本下初始  ActiveXObject  需要传入的标识*/var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
    
                for (var i=0;i<IEXHRVers.length;i++) {
                    try {
                        xhr = new ActiveXObject(IEXHRVers[i]);
                    }
                    catch(e) {
                        /*如果出现错误的时候  停止当次的循环*/continue;
                    }
                }
            }
            return xhr;
        }

    8.6、 封装ajax工具函数01.ajax.js

    /**
     * ITCAST WEB
     * Created by zhousg on 2016/5/24.
     *//*
     * 1. 请求的类型                type    get post
     * 2. 请求地址                  url
     * 3. 是异步的还是同步的         async   false true
     * 4. 请求内容的格式            contentType
     * 5. 传输的数据                data    json对象
     *
     * 6.响应成功处理函数           success   function
     * 7.响应失败的处理函数         error     function
     *
     * 这些都是动态参数  参数对象  options
     * *//*封装一个函数*/window.$ = {};
    /*申明一个ajax的方法*/
    $.ajax = function(options){
    
        if(!options || typeof options != 'object'){
            returnfalse;
        }
    
        /*请求的类型*/var type = options.type || 'get';/*默认get*//*请求地址 */var url = options.url || location.pathname;/*当前的地址*//*是异步的还是同步的 */var async = (options.async === false)?false:true;/*默认异步*//*请求内容的格式 */var contentType = options.contentType || "text/html";
    
        /*传输的数据 */var data = options.data || {};/*{name:'',age:''}*//*在提交的时候需要转成 name=xjj 这种格式*/var dataStr = ''/*数据字符串*/for(var key in data){
            dataStr += key+'='+data[key]+'&';
        }
    
        dataStr = dataStr && dataStr.slice(0,-1);
    
        /*ajax 编程*/var xhr = new XMLHttpRequest();
    
        /*请求行*//*(type=='get'?url+'?'+dataStr:url)判断当前的请求类型*/
        xhr.open(type,(type=='get'?url+'?'+dataStr:url),async);
    
        /*请求头*/if(type == 'post'){
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        }
    
        /*请求主体*//*需要判断请求类型*/
        xhr.send(type=='get'?null:dataStr);
    
        /*监听响应状态的改变  响应状态*/
        xhr.onreadystatechange = function(){
            /*请求响应完成并且成功*/if(xhr.readyState == 4 && xhr.status == 200){
                /*success*/var data = '';
                var contentType = xhr.getResponseHeader('Content-Type');
                /*如果我们服务器返回的是xml*/if(contentType.indexOf('xml') > -1){
                    data = xhr.responseXML;
                }
                /*如果我们的服务器返回的是json字符串*/elseif(contentType.indexOf('json') > -1){
                    /*转化json对象*/
                    data = JSON.parse(xhr.responseText);
                }
                /*否则的话他就是字符串*/else{
                    data = xhr.responseText;
                }
    
                /*回调 成功处理函数*/
    
                options.success && options.success(data);
            }
            /*计时请求xhr.status不成功  他也需要的响应完成才认作是一个错误的请求*/elseif(xhr.readyState == 4){
                /*error*/
                options.error && options.error('you request fail !');
    
            }
    
        }
    }
    $.post = function(options){
        options.type = 'post';
        $.ajax(options);
    }
    $.get = function(options){
        options.type = 'get';
        $.ajax(options);
    }

    7、 jquery的ajax

  • 相关阅读:
    Finder那点事
    mysql基础综述(四)
    【算法编程】过河问题
    CodeForces 7D Palindrome Degree 字符串hash
    语音信号短时域分析之预处理(三)
    sqlite学习笔记7:C语言中使用sqlite之打开数据库
    cpu真实占用率检測工具
    Mediator Design Pattern 中介者模式
    POJ-3984-迷宫问题-BFS(广搜)-手写队列
    HDU 4858 项目管理
  • 原文地址:https://www.cnblogs.com/zhanggaojun/p/5743060.html
Copyright © 2020-2023  润新知