zoukankan      html  css  js  c++  java
  • Ajax

    1.XMLHttpRequest对象

    var xhr;
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest(); //IE7+,Firefox,Chrome,Opera,Safari  
    }else{
        xhr = new ActiveXObject("Microsoft.XMLHTTP"); //IE6,IE5
    }        

    2.HTTP请求和响应

       HTTP请求完整过程:

    1. 建立TCP连接
    2. 浏览器向Web服务器发送请求命令
    3. 浏览器发送请求头信息
    4. Web服务器应答
    5. Web服务器发送应答头信息
    6. Web服务器向浏览器发送数据
    7. Web服务器关闭TCP连接

      HTTP请求的组成:

    请求的方法或动作(GET或POST)、请求的URL、请求头(客户端环境和验证信息等)、请求体(请求正文)

      HTTP响应的组成:

    状态码(数字和文字组成)、响应头(服务器类型、日期时间、内容类型和长度等)、响应体

      状态码(首字母定义了类型):

    1xx:信息类、2xx:成功(200 OK)、3xx:重定向(304)、4xx客户端错误(404 NOT FOUND)、5xx:服务器错误(500)

     

       XMLHttpRequest发送请求:

    • open(method,url,async)     //async默认值是true,即异步传输
    • send(string)
    xhr.open("GET","search.php",true);
    xhr.send();
    xhr.open("POST","create.php",true);
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xhr.send("name=小明&sex=男");

      XMLHttpRequest取得响应:

    • responseText属性:获取字符串形式的响应数据
    • responseXML属性:获取XML形式的响应数据
    • status属性和statusHeader():HTTP状态码
    • getAllResponseHeader():获取所有的响应报头
    • getResponseHeader():查询响应中的某个字段的值
    • readyState属性:0:请求未初始化、1:服务器连接已建立,open已调用、2:请求已接收,接收到头信息、3:请求处理中,接收到响应主体、4:请求已完成
    xhr.onreadystatechange = function(){
        if( xhr.readyState==4&&xhr.status===200 ){
            //xhr.requestText
        }
    }

    实例:

    <!DOCTYPE HTML>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Demo</title>
        <style>
            body, input, select, button, h1 {
                font-size: 28px;
                line-height:1.7;
            }
        </style>    
    </head>
    
    <body>
    
        <h1>员工查询</h1>
    
        <label>请输入员工编号:</label>
        <input type="text" id="keyword" />
        <button id="search">查询</button>
        <p id="searchResult"></p>
    
        <h1>员工新建</h1>
        <label>请输入员工姓名:</label>
        <input type="text" id="staffName" /><br>
        <label>请输入员工编号:</label>
        <input type="text" id="staffNumber" /><br>
        <label>请选择员工性别:</label>
        <select id="staffSex">
            <option></option>
            <option></option>
        </select><br>
        <label>请输入员工职位:</label>
        <input type="text" id="staffJob" /><br>
        <button id="save">保存</button>
        <p id="createResult"></p>
    
        <script>
            document.getElementById("search").onclick = function() { 
                var request = new XMLHttpRequest();
                request.open("GET", "server.php?number=" + document.getElementById("keyword").value);
                request.send();
                request.onreadystatechange = function() {
                    if (request.readyState===4) {
                        if (request.status===200) { 
                            document.getElementById("searchResult").innerHTML = request.responseText;
                        } else {
                            alert("发生错误:" + request.status);
                        }
                    } 
                }
            }
    
            document.getElementById("save").onclick = function() { 
                var request = new XMLHttpRequest();
                request.open("POST", "server.php");
                var data = "name=" + document.getElementById("staffName").value 
                                  + "&number=" + document.getElementById("staffNumber").value 
                                  + "&sex=" + document.getElementById("staffSex").value 
                                  + "&job=" + document.getElementById("staffJob").value;
                request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
                request.send(data);
                request.onreadystatechange = function() {
                    if (request.readyState===4) {
                        if (request.status===200) { 
                            document.getElementById("createResult").innerHTML = request.responseText;
                        } else {
                            alert("发生错误:" + request.status);
                        }
                    } 
                }
            }
        </script>
    </body>
    </html>
    View Code

     

    3.JSON

    数据格式:“名称”:“值对”

    数值得类型:数字(整型和浮点数)、字符串(双引号)、逻辑值(true或false)、数组([])、对象({})、null

    JSON解析:

    • eval 危险,特别是执行第三方json数据时尽可能使用JSON.parse()方法
    • JSON.parse 可捕捉JSON中的语法错误
    var jsondata = '{"staff":[{"name":"一","age":"60"},{"name":"二","age":"40"},{"name":"三","age":"30"}]}';
    var jsonobj = eval('('+jsondata+')');
    var jsonobj = JSON.parse(jsondata);
    //jsonobj.staff[0].name

    检查json语法错误的网站:jsonlint.com

    4.jquery实现ajax

    jQuery.ajax([settings])

    • type:类型,"POST"、"GET"
    • url:发送请求的地址
    • data:一个对象,连同请求发送到服务器的数据
    • dataType:预期服务器返回的数据类型,例如"json"、"jsonp",可不指定
    • success:请求成功后的回调函数,传入返回后的数据,以及包含成功代码的字符串
    • error:请求失败时调用,传入XMLHttpRequest对象
    $(document).ready(function(){ 
        $("#search").click(function(){ 
            $.ajax({ 
                type: "GET",     
                url: "http://127.0.0.1:8080/ajaxdemo/serverjson2.php?number=" + $("#keyword").val(),
                dataType: "json",
                success: function(data) {
                    if (data.success) { 
                        $("#searchResult").html(data.msg);
                    } else {
                        $("#searchResult").html("出现错误:" + data.msg);
                    }  
                },
                error: function(jqXHR){     
                   alert("发生错误:" + jqXHR.status);  
                },     
            });
        });
        
        $("#save").click(function(){ 
            $.ajax({ 
                type: "POST",     
                url: "serverjson.php",
                data: {
                    name: $("#staffName").val(), 
                    number: $("#staffNumber").val(), 
                    sex: $("#staffSex").val(), 
                    job: $("#staffJob").val()
                },
                dataType: "json",
                success: function(data){
                    if (data.success) { 
                        $("#createResult").html(data.msg);
                    } else {
                        $("#createResult").html("出现错误:" + data.msg);
                    }  
                },
                error: function(jqXHR){     
                   alert("发生错误:" + jqXHR.status);  
                },     
            });
        });
    });

     

    5.跨域

     一个域名地址组成: http://   www  .  abc.com  :  8080  /  scripts/jquery.js

                                协议     子域名     主域名      端口号      请求资源地址

    当协议、子域名、主域名、端口号中任意一个不相同时,都算不同域。不同域之间相互请求资源就叫跨域。

    JavaScript出于安全的考虑,不允许跨域调用其他页面的对象,即受JavaScript的同源策略的限制。

     

    处理跨域的方法:

    1. 代理:通过在同域名的web服务器端创建一个代理。比如在北京的服务器后台(www.beijing.com/proxy-shanghaiservice.php)来调用上海服务器(www.shanghai.com/seivice.php)的服务,然后再把响应结果返回给前端,这样前端调用北京同域名的服务就和调用上海的服务效果相同了。
    2. JSONP:Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>)。JSONP非正式传输协议,允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
      <script type="text/javascript">
          // 得到航班信息查询结果后的回调函数
          var flightHandler = function(data){
              alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
          };
      
          // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
          var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
          // 创建script标签,设置其属性
          var script = document.createElement('script');
          script.setAttribute('src', url);
          // 把script标签加入head,此时调用开始
          document.getElementsByTagName('head')[0].appendChild(script);
      </script>
      //服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):
      flightHandler({
          "code": "CA1998",
          "price": 1780,
          "tickets": 5
      });
      <script type="text/javascript">
           jQuery(document).ready(function(){
              $.ajax({
                   type: "get",
                   async: false,
                   url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
                   dataType: "jsonp",
                   jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
                   jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
                   success: function(json){
                       alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
                   },
                   error: function(){
                       alert('fail');
                   }
               });
           })
      </script>
      jQuery实现
    3. XHR2:HTML5提供的XMLHttpRequest Level2已实现了跨域访问以及一些其他新功能。(CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求) 在服务端做一些小小的改造:
      • header('Access-Control-Allow-Origin:*');
      • header('Access-Control-Allow-Methods:POST,GET');

    设置的header为“*”,任意一个请求过来之后服务端我们都可以进行处理&响应。

    cors在移动终端支持的不错,可以考虑在移动端全面尝试;PC上有不兼容和没有完美支持,所以小心踩坑。jsonp是get形式,承载的信息量有限,所以信息量较大时cors是不二选择。

     

    参考:慕课网-Ajax全接触http://www.imooc.com/learn/250

            AJAX POST&跨域 解决方案 - CORS http://www.cnblogs.com/Darren_code/p/cors.html

            说说JSON和JSONP,也许你会豁然开朗 http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

             

  • 相关阅读:
    哪个项目管理工具好用到哭?JIRA VS 华为软件开发云
    华为软件开发云CloudIDE功能简测
    移动APP云测试平台测评分析
    华为软件开发云对比Jenkins-JavaWeb项目持续部署方式
    微服务究竟该如何理解
    如何将Android Studio与华为软件开发云代码仓库无缝对接(二)
    如何将Android Studio与华为软件开发云代码仓库无缝对接(一)
    微服务,真的适合你么?
    如何更换git托管
    Redmine迁移至华为软件开发云-项目管理
  • 原文地址:https://www.cnblogs.com/dxchen/p/5723931.html
Copyright © 2011-2022 走看看