山月

失败

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

XMLHttpRequest对像的几个方法与属性

|- open():建立到服务器的新请求。
|- send():向服务器发送请求。
|- abort():退出当前请求。
|- readyState:提供当前 HTML 的就绪状态。
|- responseText:服务器返回的请求响应文本。

创建对象
--------

1.创建新的XMLHttpRequest对象

<script language = "javascript" type = "text/javascript">
  var request = new XMLHttpRequest();
</script>

2.创建具有错误处理能力的XMLHttpRequest对象(针对有的浏览器不支持此对象)

<script language = "javascript" type = "text/javascript">
  var request = false;
  try {
        request = new XMLHttpRequest();
  } catch(failed) {
        request = false;
    }
    if(!request) {
        alert("Error initializing XMLHttpRequest!");
    }
</script>

3.应付 Microsoft

Microsoft 支持 Ajax,但是其 XMLHttpRequest 版本有不同的称呼。事实上,它将其称为几种 不同的东西。如果使用较新版本的 Internet Explorer,则需要使用对象 Msxml2.XMLHTTP,而较老版本的 Internet Explorer 则使用 Microsoft.XMLHTTP。我们需要支持这两种对象类型(同时还要支持非 Microsoft 浏览器)。

<script language = "javascript" type = "text/javascript">
  var request = false;
  try {
        request = new XMLHttpRequest();
  } catch(trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(failed) {
                request = false;
            }
        }
    }
    if(!request) {
        alert("Error initializing XMLHttpRequest!");
    }
</script>

4.静态与动态:以上所有代码都直接嵌套在 script 标记中为静态,代码是在页面显示给用户之前的某个时候运行;放到方法或函数体中为动态。

将 XMLHttpRequest 创建代码移动到方法中:

<script language = "javascript" type = "text/javascript">
  var request;
  function createRequest() {
      try {
            request = new XMLHttpRequest();
      } catch(trymicrosoft) {
            try {
                request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(othermicrosoft) {
                try {
                    request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(failed) {
                    request = false;
                }
            }
        }
        if(!request) {
            alert("Error initializing XMLHttpRequest!");
        }
    }
    function getCustomerInfo() {
        createRequest();
        //do something with the request variable.
    }
</script>

此代码惟一的问题是推迟了错误通知,这也是多数 Ajax 程序员不采用这一方法的原因。假设一个复杂的表单有 10 或 15 个字段、选择框等,当用户在第 14 个字段(按照表单顺序从上到下)输入文本时要激活某些 Ajax 代码。这时候运行 getCustomerInfo() 尝试创建一个 XMLHttpRequest 对象,但(对于本例来说)失败了。然后向用户显示一条警告,明确地告诉他们不能使用该应用程序。但用户已经花费了很多时间在表单中输入数据!这是非常令人讨厌的,而讨厌显然不会吸引用户再次访问您的网站。

如果使用静态 JavaScript,用户在点击页面的时候很快就会看到错误信息。这样也很烦人,是不是?可能令用户错误地认为您的 Web 应用程序不能在他的浏览器上运行。不过,当然要比他们花费了 10 分钟输入信息之后再显示同样的错误要好。因此,我建议编写静态的代码,让用户尽可能早地发现问题。

用 XMLHttpRequest 发送请求
--------------------------

<script language = "javascript" type = "text/javascript">
  var request = false;
  try {
        request = new XMLHttpRequest();
  } catch(trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(failed) {
                request = false;
            }
        }
    }
    if(!request) {
        alert("Error initializing XMLHttpRequest!");
    }
    function getCustomerInfo() {
        var phone = document.getElementId("phone").value;
        var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);
        request.open("GET", url, true);
        request.onreadystatechange = updatePage;   /////////
        request.send(null);
    }
</script>

表单:
<body>
  <p><img src = "breakneck-logo_4c.gif" alt = "Break Neck Pizza" /></P>
  <form action = "POST">
    <p>Enter your phone number:
      <input type = "text" size = "14" name = "phone" id = "phone"
             onChange = "getCustomerInfo();" />
     </p>
     <p>Your order will be delivered to:</p>
     <div id = "address"></div>
     <p>Type your order in here:</p>
     <p><textarea name = "order" row = "6" cols= "50" id = "order"></textarea>
     </p>
     <p><input type = "submit" value = "Order Pizza" id = "submit" /></p>
  </form>
</body>

处理服务器响应
--------------

<script language = "javascript" type = "text/javascript">
  var request = false;
  try {
        request = new XMLHttpRequest();
  } catch(trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(failed) {
                request = false;
            }
        }
    }
    if(!request) {
        alert("Error initializing XMLHttpRequest!");
    }
    function getCustomerInfo() {
        var phone = document.getElementId("phone").value;
        var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);
        request.open("GET", url, true);
        request.onreadystatechange = updatePage;   //回调
        request.send(null);
    }
    function updatePage() {
        if(request.readyState == 4) { //检查就绪状态
          if(request.status == 200) { //检查 HTTP 状态码
            alert("Server is done!");
        } else {
                alert("Error: status code is " + request.status);
            }
      }
    }
</script>

读取响应文本

现在可以确保请求已经处理完成(通过就绪状态),服务器给出了正常的响应(通过状态码),最后我们可以处理服务器返回的数据了。返回的数据保存在 XMLHttpRequest 对象的 responseText 属性中。

    function updatePage() {
        if(request.readyState == 4) { //检查就绪状态
          if(request.status == 200) { //检查 HTTP 状态码
            var response = request.responseText.split("|");
            document.getElementById("order").value = response[0];
            document.getElementById("address").innerHTML = response[1].replace(/\n/g, "");
        } else {
                alert("Error: status code is " + request.status);
            }
      }
    }

posted on 2010-12-20 10:10  山|月  阅读(716)  评论(0编辑  收藏  举报