• Ajax的使用


    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面,而AJAX 最大的优点是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。ajax是基于XMLHttpRequest 对象实现的。

    1、创建XMLHttpRequest 对象

    if (window.XMLHttpRequest){
        var xmlhttp = new XMLHttpRequest();     //其他浏览器
    }else{
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   // IE6, IE5 浏览器执行代码,IE6、IE5不支持XMLHttpRequest()方法
    }

    2、向服务器发送请求

    使用 XMLHttpRequest 对象的 open() 和 send() 方法来将请求发送到服务器

    xmlhttp.open(type, url, boolean);  //type:请求的类型,GET或者POST,值为字符串;  url:请求地址,值为字符串;  boolean:true表示异步请求,false表示同步请求
    xmlhttp.send();   // xmlhttp.send(str); 用于post方法中

    2.1、异步和同步请求:

    当使用同步请求(即open函数的第三个参数为false)时,JavaScript 会等到服务器响应了才能继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止处于假死状态。

    当使用异步请求(即open函数的第三个参数为true)时,JavaScript 无需等到服务器响应后面的脚本代码也能继续执行。

    如果要用于 AJAX 的话,必须设为异步请求。在onreadystatechange 事件中监听响应状态并判断是否就绪以对响应数据进行处理。如果使用同步请求就不要编写 onreadystatechange 函数,直接把代码放到 send() 语句后面即可因为不用监听只能等到响应就绪才能继续执行代码

    2.2、用 post 或者 get 的场景:

    GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器。

    (1)发送大量数据时使用POST方法:POST 没有数据量限制,而GET方法有限制

    (2)GET方式请求的数据会被浏览器缓存起来,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求,此时使用GET方法比较快速,但其他人也可以从浏览器的历史记录中读取到这些数据,因此有严重的安全问题

    (3)传输密码等重要信息使用POST方法:由于GET方法传输参数在URL上,别人也可以看到,而且GET方法会将返回结果缓存在浏览器中,因此不安全

    (4)当服务器通过请求的参数无其它副行为(如只进行搜索)时,使用GET方法,当通过请求的参数有其它副行为(如更新服务器上的文件或数据库、添加数据行等)时,使用POST方法。

    2.3、GET发送请求的方式

    最简单的:

    xhttp.open("GET", "demo_get.asp", true);
    xhttp.send();

    加上参数的情况:

    xmlhttp.open("GET","demo_get2.php?fname=Henry&lname=Ford",true);   //在 ? 后面添加参数,以键值对形式添加,每个参数以 & 符号隔开
    xmlhttp.send();

    但是以上都有可能只是获得浏览器缓存的数据,要想避免这种情况,应保证每次请求的URL都是不一样的,我们可以添加一个无关紧要的参数

    xmlhttp.open("GET","demo_get2.php?fname=Henry&lname=Ford&t=" + new Date().getTime(),true);  
    xmlhttp.send();

    2.4、POST发送请求的方式

    最简单的:

    xmlhttp.open("POST","/try/ajax/demo_post.php",true);
    xmlhttp.send();

    加上参数:

    xmlhttp.open("POST","/try/ajax/demo_post2.php",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");  //设置请求头  setRequestHeader(header,value)  header: 请求头的名称,这里的Content-type表示传送给服务器的数据类型    value:请求头的值  
    xmlhttp.send("fname=Henry&lname=Ford");   //POST方法加参数应在send()方法里添加

    xmlObj.setRequestHeader() 方法用来设置请求头,有时候并不是必须要的,这得看后端的要求,需要什么类型的请求头一般也是后端提出要求。ContentType 默认为text/html,表单数据默认为application/x-www-form-urlencoded。

    如果是使用 get 请求,传参与Content-Type无关,无需设置。当使用是post请求时,如果数据是由from表单提交,此时就必须把content-Type设为application/x-www-form-urlencoded(也可以不指定content-Type),否则后台是无法接收到数据的。

    (1)Content-type:application/x-www-form-urlencoded:默认的。如果不指定content-type,默认使用此格式。参数格式:key1=value1&key2=value2

    (2)Content-type:application/json:参数为json格式 

    (3)Content-type:multipart/form-data:上传文件用这个

    3、监听服务器响应

    当请求被发送到服务器时,用 onreadystatechange 事件来监听服务器的响应。每当 XMLHttpRequest 对象的属性 readyState 发生改变时,onreadystatechange 事件就会触发,readyState 属性存有 XMLHttpRequest 的状态信息。

    3.1、XMLHttpRequest 对象的三个属性

    0 (未初始化)
    对象已建立,但是尚未初始化(尚未调用open方法)
    1 (初始化)
    已调用send()方法,正在发送请求
    2 (发送数据)
    send方法调用完成,但是当前的状态及http头未知
    3 (数据传送中)
    已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
    4 (完成)
    数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据

    当 readyState 等于 4 且状态 status 为 200 时,此时响应已就绪

    xmlhttp.onreadystatechange = function(){
      if (xmlhttp.readyState==4 && xmlhttp.status==200){
        ...
      }
    }

    通常可以把 Ajax 任务封装为一个函数,然后该函数可以作为回调函数存在,这样就不会引起程序停滞。

    4、获取服务器响应的数据

    通过 XMLHttpRequest 对象的 responseText 或 responseXML 属性来获取服务器的响应数据。

    如果来自服务器的响应不是 XML,就使用 responseText 属性来获取数据,responseText 属性返回字符串形式的响应。

    xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
      }
    }

    如果来自服务器的响应是 XML,那就使用 responseXML 属性,对 XML 对象进行解析。

    XML文件示例:

    <CATALOG>
      <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
      </CD>
      <CD>
        <TITLE>Hide your heart</TITLE>
        <ARTIST>Bonnie Tyler</ARTIST>
        <COUNTRY>UK</COUNTRY>
      </CD>
    </CATALOG>
    xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        xmlDoc = xmlhttp.responseXML;
        txt = "";
        x = xmlDoc.getElementsByTagName("ARTIST");
        for (i = 0; i < x.length; i++) {
          txt = txt + x[i].childNodes[0].nodeValue + "<br>";
        }
        document.getElementById("myDiv").innerHTML = txt;
      }
    }

    5、ajax代码实例

    var xmlhttp;
    if (window.XMLHttpRequest) {
      //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
      xmlhttp = new XMLHttpRequest();
    } else {
      // IE6, IE5 浏览器执行代码
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
      }
    }
    xmlhttp.open("GET", "/try/ajax/ajax_info.txt", true);
    xmlhttp.send();
  • 相关阅读:
    适配器模式—对象适配器模式
    状态模式
    抽象工厂模式、反射
    Spring日记_01 之 Maven搭建
    既有e^x又有sinx或cosx的积分题的解法
    printf的执行顺序
    C++ 冒泡排序、选择排序、快速排序
    神舟战神 HotKey 主面板无法打开? Fn+Esc失效?
    PyCharm 和 IntelliJ IDEA的破解激活 、添加文件头注释
    单片机 之 超声波测距
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/10349535.html
Copyright © 2020-2023  润新知