zoukankan      html  css  js  c++  java
  • 利用Ajax实现异步请求

    Ajax

    1.课程引入
         静态网站和动态网站都是同步的,但同步方式有缺点:页面请求响应式阻塞,影响用户体验
         为了解决这个问题,可以通过变通的手段实现页面的局部更新(隐藏帧),由于隐藏帧不方便就有了Ajax
     
    2.隐藏帧实现局部更新
     
    <form action="./11inner.php" method="post" target="abc">
            用户名:<input type="text" name="username">
             密  码:<input type="password" name="password">
            <input type="submit" value="提交">
        </form>
        <iframe src="" width="200" height="200" frameborder="2" name="abc"></iframe>
     
    PHP中的代码
     
    <?php
        $uname = $_POST['username'];
        $pw = $_POST['password'];
        if($uname == '111' && $pw == '111') {
            //js中的parent表示父级页面
            echo '<script> parent.document.getElementById("dv").innerHTML = "登录成功" </script>';
        }
        else {
            echo '<script> parent.document.getElementById("dv").innerHTML = "用户名或密码错误" </script>';
        }
     
     ?>
    3.如何实现Ajax响应请求
    基本步骤:创建XMLHttpRequest对象-->配置发送参数-->执行发送-->处理响应
     
     1、创建xhr对象
        var xhr = null;
        if(window.XMLHttpRequest){
            标准浏览器
            xhr = new XMLHttpRequest();
        }else{
            非标准浏览器IE6/7/8
            xhr = new ActiveXObject('Microsoft.XMLHTTP');
        }
        readyState==0表示xhr对象初始化完成
        console.log(xhr.readyState + '---------1----------');
    2、配置发送参数
        var type = 'get';
        var myurl = './data.php';
        var async = false;//第三个参数默认值就是true,表示异步;false表示同步
        xhr.open(type,myurl,async);
     3、发送
        var param = null;
        xhr.send(param);
        readyState==1表示请求已经发出
      
     
     4、处理响应(指定回调函数),如下的回调函数不是我们自己调用,而是由浏览器自动调用
         那么浏览器在什么情况下调用?xhr.readyState(0、1、2、3、4)这个状态值发生变化的时候调用
         xhr.onreadystatechange = function(){
           if(xhr.status == 200){
             if(xhr.readyState == 4){
                    获取到服务器响应的数据
                var result = xhr.responseText;
              }
           }
     }
        如果是同步的请求,就没有必要使用回调函数了,直接通过xhr.responseText就可以得到数据
        console.log(xhr.responseText);
     
     
     
     
    4.处理响应中的status (xhr.status == 200 )
    xhr.status是http协议的状态码:200成功、404没有找到资源、500服务器报错
     
    5.处理响应中的readyState是状态值(0,1,2,3,4)
    readyState==0表示xhr对象初始化完成
    readyState==1表示请求已经发出
    readyState== 2表示服务器端数据已经完全返回
    readyState== 3表示正在解析数据
    readyState== 4表示数据解析完成,可以使用了
     
    6.注意事项:
        1、xhr的对象创建需要兼容处理
        2、xhr.open的3个参数的作用
        3、xhr.readyState状态值要了解
        4、通过xhr.responseText获取服务器响应的数据
        5、对于get请求来说,xhr.send()的参数固定写成null
        6、xhr.status和xhr.readyState的作用和区别
     
     
    7.阻止表单提交的几种方式
         1.return false;
         2.e.preventDefault();
         3. <input type="submit" value="提交" id="btn">把“submit”换成“button”
     
    8.手动提交表单
         form.submit();
     
     
    9.Ajax-get提交
    Aja的get提交数据是通过url传递参数,并且需要对参数进行编码处理
    xhr.send();方法参数固定为null
     
    2.配置发送函数
                encodeURI作用对get参数进行编码处理,防止乱码
                var param = encodeURI('?username='+uname+'&password='+pw);
                xhr.open('get','./data.php'+param);
    3.发送
                xhr.send(null);
     
     
    10.Ajax-post提交
     
    Ajax的post提交方式通过xhr.send();
    函数传递的参数发送数据,而不是通过url传递数据
    post提交方式必须设置请求头
    post提交的数据不需要进行编码处理
     
     
     2.配置发送函数
                   xhr.open('post','./33data.php');
                   //设置请求头信息(对于post提交必须设置请求头)
                   xhr.setRequestHeader('Content-Type','application/x-www-form-urlencode');
    3.发送
                   var param = 'username='+uname+'&password='+pw;
                   xhr.send(param);
     
     
     
    11.post和get的区别
     
    get post
    2.配置发送函数
                encodeURI作用对get参数进行编码处理,防止乱码
                var param = encodeURI('?username='+uname+'&password='+pw);
                xhr.open('get','./data.php'+param);
    3.发送
                xhr.send(null);
    2.配置发送函数
                   xhr.open('post','./33data.php');
                  设置请求头信息(对于post提交必须设置请求头)
                   xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    3.发送
                   var param = 'username='+uname+'&password='+pw;
                   xhr.send(param);
     
    1、Aja的get提交数据是通过url传递参数,并且需要对参数进行编码处理
    2、xhr.send();方法参数固定为null
    1、Ajax的post提交方式通过xhr.send();
    函数传递的参数发送数据,而不是通过url传递数据
    2、post提交方式必须设置请求头(   xhr.setRequestHeader('Content-Type','application/x-www-form-urlencode'); )
    3、post提交的数据不需要进行编码处理
     
    12.url的标准格式
     
    http://www.baidu.com/a/ac/b?flag=123#abc scheme://host:port/path?query#fragment
    http----scheme scheme:通讯协议 http https ftp
    www.baidu.com---host host:域名或IP地址
    隐藏的 http的默认端口是80---port port:端口 浏览器是隐藏的
    a/ac/b---path path:路径,端口到问号之间的部分
    #后面的abc----fragment fragment:锚点 hash(哈希),作用:定位页面中的某一确定位置
     
     
     
    13.encodeURICompontent()和encodeURI()
         encodeURIComponent()方法可以对url中的特殊字符进行编码
         encodeURI()方法不会转换特殊字符
         
       var url = 'http://www.sina.com';
         var str = 'http://www.baidu.com?username=张三&flag='+encodeURIComponent('://??:');
        console.log(encodeURI(str));
         console.log(encodeURIComponent(str));
     
     
    14.解析服务器服务器返回的xml形式的数据   var result = xhr.responseXML;
    15.解析服务器服务器返回的json形式的数据    var result = xhr.responseText;
    14&15
    解析服务器服务器返回的xml形式的数据
    var result = xhr.responseXML;
    解析服务器服务器返回的json形式的数据
    var result = xhr.responseText;
    xml数据格式的缺点:
    1.元数据(描述数据的数据):元数据占用的空间较多,不利于网络传输
    2.不方便解析
    json数据格式
    1.数据由键值对组成
    2.键和值必须用双引号引起来
    3.值得类型可以是:数值 字符串 数组 对象
     
    json_encode();方法的作用:把数组转化成json字符串
    $str = json_encode($arr);
     
    JSON.parse();作用:把字符串转成对象
    var str = '{"username":"lisi","age":"12"}';
    var obj = JSON.parse(str);
    var obj = eval('('+str+')');//也可以实现
     
    eval方法的作用就是把符合js语法 的字符串转成代码并执行
    eval('console.log(111)');//输出111
     
     if(xhr.status == 200 && xhr.readyState == 4){
     xml数据格式
                        var ret = xhr.responseXML;
                        var books = ret.getElementsByTagName('book');
                        var tag = '';
                        for (var i = 0; i < books.length; i++) {
                            var book = books[i];
                            var name = book.getElementsByTagName('name')[0].innerHTML;
                            var author = book.getElementsByTagName('author')[0].innerHTML;
                            var price = book.getElementsByTagName('price')[0].innerHTML;
                            var desc = book.getElementsByTagName('desc')[0].innerHTML;
                            tag += '<ul><li>'+name+'</li><li>'+author+'</li><li>'+price+'</li><li>'+desc+'</li></ul>';
                        }
                        var container = document.getElementById('container');
                        container.innerHTML = tag;
              }
     if(xhr.status == 200 && xhr.readyState == 4){
                        // 原生Ajax从服务器获取的原始数据是字符串(有可能是json格式的字符串)
                        var result = xhr.responseText;
                        // JSON.parse()的作用就是把json形式的字符串转化成对象
                        result = JSON.parse(result);
                        console.log(result);
                        var tag = '';
                        for (var i = 0; i < result.length; i++) {
                            var book = result[i];
                            tag += '<ul><li>'+book.name+'</li><li>'+book.author+'</li><li>'+book.price+'</li><li>'+book.desc+'</li></ul>'
                        }
                        var container = document.getElementById('container');
                        container.innerHTML = tag;
                    }
    <?php 
        header('Content-Type:application/xml; charset=utf-8');
      
    ?>
    <?xml version='1.0' encoding='utf-8' ?>
     
    <booklist>
        <book>
            <name>三国演义</name>
            <author>罗贯中</author>
            <price>20</price>
            <desc>一个杀伐纷争的年代</desc>
        </book>
    </booklist>
    <?php
        $arr = array(   

      array('name'=>'三国演义','author'=>'罗贯中','price'=>'20','desc'=>'一个杀伐纷争的年代'),
      array('name'=>'红楼梦','author'=>'曹雪芹','price'=>'30','desc'=>'封建社会家族的缩影'),
      array('name'=>'水浒传','author'=>'施耐庵','price'=>'40','desc'=>'一群土匪的故事'),
      array('name'=>'西游记','author'=>'吴承恩','price'=>'50','desc'=>'四个男人和一匹马的故事')

        );
     
        json_encode()方法的作用:把数组转化成json字符串
        $str = json_encode($arr);
        echo $str;
     
     print_r($arr);//也可以实现
     
     ?>
     
     
     
     
     
     
  • 相关阅读:
    (简单) POJ 1860 Currency Exchange,SPFA判圈。
    (简单) POJ 3259 Wormholes,SPFA判断负环。
    (简单) POJ 1502 MPI Maelstrom,Dijkstra。
    (中等) POJ 3660 Cow Contest,Floyd。
    (简单) POJ 2240 Arbitrage,SPFA。
    3.Git基础-查看当前文件状态、跟踪新文件、暂存文件、忽略文件、提交更新、移除文件、移动文件
    2.Git基础-仓库的获取方式与Git文件的状态变化周期(生命周期)
    1.Git起步-Git的三种状态以及三种工作区域、CVCS与DVCS的区别、Git基本工作流程
    获取URL参数
    进度条
  • 原文地址:https://www.cnblogs.com/zhushenshen/p/6741599.html
Copyright © 2011-2022 走看看