zoukankan      html  css  js  c++  java
  • AJAX

    什么是AJAX?

    AJAX是异步Javascript和XML(Asynchronous Javascript And XML)。简单点说,就是使用XMLHttpRequest对象与服务器通信。

    它可以使用JSON,XML,HTML和文本等多种格式发送和接受。AJAX最吸引人的就是它的‘异步特性’,也就是说他可以在不刷新页面的

    情况下与服务器通信,交换数据,更换页面。

    主要做的事:

    1、在不重新加载的页面情况下发送请求给服务器;

    2、接受并使用从服务器发来的数据;

    第一步:XMLHttpRequest对象发送http请求,

    // Old compatibility code, no longer needed.
    if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...
        httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE 6 and older
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }

    发送一个请求后,会收到响应。在这一阶段,你要告诉XMLHttp请求对象是由哪一个JavaScript函数处理响应,在设置了对象的

    onreadystatechange属性后给他命名,当请求状态改变时间函数

    httpRequest.onreadystatechange = nameOfTheFunction;

    要注意的是,函数名后没有参数,因为你把一个引用赋值给了函数,而不是真正的调用了它。此外,如果不使用函数名的方式,你还

    可以用JavaScript的匿名函数响应处理的动作。就像下面这样:

    httpRequest.onreadystatechange = function(){
        // Process the server response here.
    };

    接下来,声明当你接到响应后的要做什么,你要发送一个实际的请求吗,通过调用HTTP请求对象的open()和send()方法,像

    下面这样:

    httpRequest.open('GET', 'http://www.example.org/some.file', true);
    httpRequest.send();

    1.open()的第一个参数是HTTP请求方法,有GET,POST,HEAD以及服务器支持的其他方法。保证这些方法一定要是大写字母,否则

    其他一些浏览器(比如FireFox)可能无法处理这个请求;

    2.第二个参数是要发送的URL。由于安全原因,默认不能调用第三方URL域名。确保你在页面中使用的是正确的域名,否则在调用open()方法是会有“权限被拒绝”错误提示。一个容易犯的错误是你企图通过domain.tld访问网站,而不是www.domain.tld。

    3.第三个参数是可选,用于设置请求是否是异步的。如果设为true(默认设置),javascript执行会持续,并且在服务器还没有响应的情况下与页面进行交互。

    send()方法的参数可以是任何你想发送给服务器的内容,如果是POST请求的话。发送表单数据时应该用服务器可以解析的格式,想查询语句:

    "name=value&anothername="+encodeURIComponent(myVar)+"&so=on"

    或者其他格式, 类似 multipart/form-data,JSON,XML等。

    如果你使用 POST 数据,那就需要设置请求的MIME类型。比如,在调用 send() 方法获取表单数据前要有下面这个:

    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    第二步 处理器服务器响应

    在发送请求时,你提供的Javascript函数名负责处理响应

    httpRequest.onreadystatechange = nameOfTheFunction;

    这个函数应该做什么?首先,函数要检查请求的状态。如果状态的值是XMLHttpRequest.DONE(对应的值是4),意味着服务器

    响应收到了并且是没有问题的,然后就可以继续执行。

    if (httpRequest.readyState === XMLHttpRequest.DONE) {
        // Everything is good, the response was received.
    } else {
        // Not ready yet.
    }

    全部readyState状态值都在 XMLHTTPRequest.readyState,如下也是:

    • 0 (未初始化) or (请求还未初始化)
    • 1 (正在加载) or (已建立服务器链接)
    • 2 (加载成功) or (请求已接受)
    • 3 (交互) or (正在处理请求)
    • 4 (完成) or (请求已完成并且响应已准备好)

      接下来,
    if (httpRequest.status === 200) {
        // Perfect!
    } else {
        // There was a problem with the request.
        // For example, the response may have a 404 (Not Found)
        // or 500 (Internal Server Error) response code.
    }

    在检查完请求状态和HTTP响应码后,你就可以用服务器返回的数据做任何你做的了,你有两个方法去访问这些数据:
    httpRequest.responseText-服务器以文本字符的形式返回

    httpRequest.responseXML-以XMLDocument对象方式返回,之后就可以使用Javascript来处理。

    注意上面这一步只在你发起异步请求时有效(既 open() 的第三个参数未特别指定或设为 true)。如果你你发起的是同步请求则不必使用函数,但是非常不推荐这样子做,它的用户体验很糟糕。

    例子:

    <button id="ajaxButton" type="button">Make a request</button>
    
    <script>
    (function() {
      var httpRequest;
      document.getElementById("ajaxButton").addEventListener('click', makeRequest);
    
      function makeRequest() {
        httpRequest = new XMLHttpRequest();
    
        if (!httpRequest) {
          alert('Giving up :( Cannot create an XMLHTTP instance');
          return false;
        }
        httpRequest.onreadystatechange = alertContents;
        httpRequest.open('GET', 'test.html');
        httpRequest.send();
      }
    
      function alertContents() {
        if (httpRequest.readyState === XMLHttpRequest.DONE) {
          if (httpRequest.status === 200) {
            alert(httpRequest.responseText);
          } else {
            alert('There was a problem with the request.');
          }
        }
      }
    })();
    </script>
  • 相关阅读:
    CF1175B Catch Overflow!
    震惊!一蒟蒻竟然写出fhqTreap
    树上差分
    洛谷 P3128 最大流Max Flow
    线段树的标记永久化/二维线段树模板
    矩阵加速~desire drive
    置换相关
    树形图们
    严格单调递增与非严格之间的转换
    记录延续性的一类dp
  • 原文地址:https://www.cnblogs.com/xumqfaith/p/9283705.html
Copyright © 2011-2022 走看看