AJAX--异步JavaScript和xml

在学习ajax技术之前,我们看下传统的利用form表单的方式与后台进行数据交互的方式。
代码演示如下:
<!DOCTYPE html>
<html>
  <head>
    <title>testform1.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>

  <body>

  <!-- 

  此时form中有三个参数:
  1.action:指向一个uri地址(由后台程序员提供);
  2.method:表示请求的方法,有get和post两种方式,
  get:会将传的数据显示在地址栏上,而且get请求在服务器端编码需要特别的处理。
  所以,如果不是特别要求用get请求方式,尽量就不要用get请求。
  post:不会将数据显示在地址栏,但是这种请求方式也不安全,用专业的抓包工具可以在路由器端抓到你的信息,所以建议不要使用公共网络

   -->
    <form action="ajax.do" method="post" enctype="application/x-www-form-urlencoded">
        用户名:<input type="text" id="username" name="username">
        密码:<input type="password" id="password" name="password">
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </form>
  </body>
</html>
代码运行结果(get方式):

这里写图片描述

post方式运行结果:

这里写图片描述
这里写图片描述

由上面两个图片可以看出,虽然post请求数据不会被拼接到地址栏上,但是我们利用专业的网络抓包工具依然可以抓取到数据。所以建议大家安全用网。
看了上面传统的与后台交互数据的方式,我们发现,每次我们与后台交互时都要刷新一次页面,这样交互方式效率很低。下面我们就来介绍一下不用刷新页面就可以与后台进行交互的ajax方式吧。
代码演示如下:
<!DOCTYPE html>
<html>
  <head>
    <title>testajax.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript">

    function getData(){
         /**
         * ajax的使用分四步走
         */

       //1、创建XMLHttpRequest对象,注意,IE6的兼容问题
       var xhr=new XMLHttpRequest();


       //2.打开连接,open方法有三个参数
            /**
             * 第一个是访问的请求方式
             * 第二个是访问服务器的URL
             * 第三个是一个Boolean值,true表示异步,
             * false表示同步,一般为异步,默认是true
             * 
             * 当请求是GET时,参数可以直接在URL后面拼接,如:
             * ajax.do?name=liujianhong&password=123
             * 当参数拼接时,一定要加?表示携带参数,当存在多个参数时,
             * 每个参数间使用&拼接,注意参数时键值对的方式,以等号连接
             */
       xhr.open("GET", "ajax.do",true);


       //3、ajax的回调函数
       xhr.onreadystatechange=function(){
           /**
             * 注意:回调函数会触发好几次,但是我们一般只会使用最后一次
             * 就是请求完成的触发,readState 等于4的时候
             */
            /**
             *  0   请求未初始化(在调用 open() 之前) 
             *  1   请求已提出(调用 send() 之前) 
             *  2   请求已发送(这里通常可以从响应得到内容头部) 
             *  3   请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应) 
             *  4    请求已完成(可以访问服务器响应并使用它) 
             */

             /**
             * readyState等于4表示请求已经结束,服务器响应完成
             * status表示http请求的状态,200表示正常响应
             * 400表示资源不可达(找不到)
             * 500表示服务器端错误
             */
          if(xhr.readyState==4 && xhr.status ==200){
              //说明请求完成,并且成功
              console.log(xhr.responseText);//得到服务器端的文本数据
              console.log(xhr.responseXML);//得到服务器端的XML数据
          }

       };

       /**
         * 发送数据,如果没有数据,可以不传递数据或者传递null,如:xhr.send(null);
         * 如果post请求传递数据,则这样写
         * 首先设置一下xhr的请求头信息
         * xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
         * 再这样传递参数
         * xhr.send(name=liujianhong&password=123);
         */
       xhr.send();
    }


      //下面代码是为了兼容IE6及其以下版本,现在可以不做考虑
/*          function ajaxFunction() {
                var xmlHttp;

                try {
                    // Firefox, Opera 8.0+, Safari
                    xmlHttp = new XMLHttpRequest();
                } catch(e) {

                    // Internet Explorer
                    try {
                        xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                    } catch(e) {

                        try {
                            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch(e) {
                            alert("您的浏览器不支持AJAX!");
                            return false;
                        }
                    }
                }
                return xmlHttp;
            }*/
    </script>
  </head>

  <body>
    <button onclick="getData();">clickMe</button>
  </body>
</html>
运行结果如下:

这里写图片描述

可以看出,此时不用刷新整个页面就可以实现与后台进行交互,这大大增强了用户的页面体验。
Ajax的使用包括了四步:

1、得到XMLHttpRequest对象,注意如果要兼容IE6则使用我注释的代码
2、使用XMLHttpRequest对象的open方法,注意参数问题
3、Ajax的回调函数,服务器响应后,得到数据的处理
4、发送请求send方法。

我们知道,从后台传过来数据的方式有两种:json数据类型,xml类型。
下面我们演示一下怎样处理用后台传过来的json类型。
<!DOCTYPE html>
<html>
  <head>
    <title>index03.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script>
       function getData(node){
          var id = node.value;
          var xhr=new XMLHttpRequest();

          xhr.open("POST","personJson.do?did="+id,true);

          xhr.onreadystatechange=function(){
              if(xhr.readyState==4 && xhr.status==200){
                 var s=xhr.responseText;
                 //console.log(typeof json);//string
                 var json=eval(s);
                 //console.log(json);//[object,object,object,object];
                 var str="";
                 str +="<table border='1' cellspacing=0>";
                 for(var i=0;i<json.length;i++){
                     //console.log(json[i]);//Object {id: 21, name: "孙悟空", age: 132}, Object {id: 22, name: "猪八戒", age: 133},Object {id: 23, name: "沙和尚", age: 134},Object {id: 24, name: "唐和尚", age: 135}
                     str +="<tr>";
                     var p=json[i];
                     //console.log(p);//Object {id: 21, name: "孙悟空", age: 132}, Object {id: 22, name: "猪八戒", age: 133},Object {id: 23, name: "沙和尚", age: 134},Object {id: 24, name: "唐和尚", age: 135}
                     for(var j in p){
                         //console.log(p[j]);
                         str +="<td style='padding:5px'>"+p[j]+"</td>";
                     }

                     str +="</tr>";
                 }
                 str +="</table>";
                 document.getElementById("content").innerHTML=str;
              }
          };
          xhr.send();
       }
    </script>
  </head>

  <body>
    <p>i am a page.</p>

    <select onchange="getData(this);">
       <option value="1">凡人组</option>
       <option value="2">明星组</option>
       <option value="3">神仙组</option>
    </select>
    <br>
    <div id="content"></div>
  </body>
</html>
代码运行结果如下:

这里写图片描述

上面我们学习了javascript使用ajax接收json格式数据的方法,下面我们来学习一下javascript使用ajax接收xml格式数据的方法.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    window.onload = init;
    function init() {
        //1、获取部门节点
        var dn = document.getElementById("dep");
        //2、为该节点创建onchange
        dn.onchange = getPerson
        //3、创建一个getPerson的方法来处理事件 
    }

    function getPerson() {
        var did = this.value;
        //1、获取XMLHttpRequest;
        var xhr = new XMLHttpRequest();
        //2、通过xhr来打开页面,使用POST
        xhr.open("POST", "person.do", true);
        xhr.onreadystatechange = function() {
            //3、处理请求
            if (xhr.readyState == 4 && xhr.status == 200) {
                //3.1、获取xml节点
                var xmlDoc = xhr.responseXML;
                //3.2、获取所有的person节点
                var pns = xmlDoc.getElementsByTagName("person");
                //3.3、遍历所以节点,获取id,name等信息
                var node = "";
                for (var i = 0; i < pns.length; i++) {
                    node += getValueByProp(pns[i], "id") + "----------"
                            + getValueByProp(pns[i], "name") + "----------"
                            + getValueByProp(pns[i], "age") + "<br/>"
                }
                //3.4、写入到persons
                document.getElementById("persons").innerHTML = node;
            }
        }
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.send("did=" + did);
        //4、发送信息,需要传入did
    }
    //根据节点获取值
    function getValueByProp(node, prop) {
        return (node.getElementsByTagName(prop))[0].firstChild.nodeValue;
    }
</script>
</head>
<body>
    <select id="dep">
        <option value="1">普通组</option>
        <option value="2">明星组</option>
        <option value="3">西游组</option>
    </select>
    <div id="persons"></div>
</body>
</html>
运行结果如下:

这里写图片描述

既然js有使用ajax的式,jquery肯定也有啊,下面我们就来介绍下jquery使用ajax的方法。

1.首先演示jquery.load()方法。
语法:
  $(selector).load(URL,data,callback);
参数解析:
必需的 URL: 参数规定您希望加载的 URL。
可选的 data :参数规定与请求一同发送的查询字符串键/值对集合。
可选的 callback: 参数是 load() 方法完成后所执行的函数名称。
代码演示如下:
//1.jquery.load():加载页面片段(从服务器端加载数据)
//jquery_load.html
<!DOCTYPE html>
<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
        <script type="text/javascript" src="js/jquery-1.11.1.js" ></script>
        <script type="text/javascript">

            //通过路径加载一个静态页面
            $(function(){
                $("#content").load("a.html");//此时页面加载了a.html页面的内容

            });

        </script>
    </head>

    <body>
        <div id="content">1111</div>
    </body>

</html>
//a.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</h1>
    </body>
</html>
运行结果如下显示:

这里写图片描述

2.jquery.get();方法
语法:
 $.get(URL,callback);
参数:
 必需的 URL 参数规定您希望请求的 URL。
 可选的 callback 参数是请求成功后所执行的函数名。
代码演示如下:
<!DOCTYPE html>
<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
        <script type="text/javascript" src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(function() {
                $("#dep").on("change", getPerson);
            });

            function getPerson() {
                var did = this.value;
                //get方法默认向服务器传值的方式是(拼接在uri后面):"personJson.do?username=liyanan&password=1234"(?:说明我要向服务器传递参数,&参数间分离)
                $.get("personJson.do",{"did" : did}, 
                    function(data) {
                        var ps = eval(data);
                        var node = "";
                        for(var i = 0; i < ps.length; i++) {
                            node += ps[i].id + "--------" + ps[i].name + "--------" +
                                ps[i].age + "<br/>";
                        }
                        document.getElementById("persons").innerHTML = node;
                    }
                );
            }
        </script>
    </head>

    <body>
        <select id="dep">
            <option value="1">普通组</option>
            <option value="2">明星组</option>
            <option value="3">西游组</option>
        </select>
        <div id="persons"></div>
    </body>

</html>
3.jquery.post();与上面get()方法类似,
代码演示如下:
<!DOCTYPE html>
<html>
  <head>
    <title>jqueryAjax.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript" src="js/jquery-1.11.1.js" ></script>

    <script>
       $(function(){
           console.log($(".content"));
       });

       /*function getData(node){
          //console.log(node);//node指向整个select
          //var id=node.value;//1,2,3
            var str = "";
                for (var i = 0; i < data.length; i++) {
                    var p = data[i];
                    str += p.id+"-----------"+p.name+"-----------"+p.age+"<br>";
                }
                content.innerHTML = str;
            },"json");
       }*/



        function getData(node) {
            //console.log($("select").serialize());
            var id = node.value;
            //$("select").serializeArray();serializeArray() 方法通过序列化表单值来创建对象(name 和 value)的数组。
            //$("select").serialize() 方法通过序列化表单值创建 URL 编码文本字符串.您可以选择一个或多个表单元素(如输入和/或文本区),或表单元素本身。序列化的值可在生成 AJAX 请求时用于 URL 查询字符串中。
            $.post("personJson.do",$("select").serializeArray(),function(data){
            //console.log(data);
                //var data = eval(data);
                var str = "";
                for (var i = 0; i < data.length; i++) {
                    var p = data[i];
                    str += p.id+"-----------"+p.name+"-----------"+p.age+"<br>";
                }
                content.innerHTML = str;
            },"json");

        }
    </script>

  </head>
  <body>
    <select onchange="getData(this)" name="did">
        <option value="1">凡人组</option>
        <option value="2">明星组</option>
        <option value="3">神仙组</option>
    </select>
    <div id="content"></div>

  </body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值