异步请求request.status .responseText 等

来源:互联网 发布:斑马斑马 知乎 编辑:程序博客网 时间:2024/05/27 01:30

XMLHttpRequest简介

对象的很少的几个方法和属性。

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

XMLHttpRequest对象的open()方法来完成。该方法有五个参数:

  • request-type:发送请求的类型。典型的值是GET或POST,但也可以发送HEAD请求。
  • url:要连接的URL。
  • asynch:如果希望使用异步连接则为true,否则为false。该参数是可选的,默认为true。
  • username:如果需要身份验证,则可以在此指定用户名。该可选参数没有默认值。
  • password:如果需要身份验证,则可以在此指定口令。该可选参数没有默认值。

如果监控XHTML/Ajax页面及其连接脚本之间的网络和数据传递,当调用open()方法时将看不到任何通信。

在Ajax应用程序中需要了解五种就绪状态:

  • 0:请求没有发出(在调用open()之前)。
  • 1:请求已经建立但还没有发出(调用send()之前)。
  • 2:请求已经发出正在处理之中(这里通常可以从响应得到内容头部)。
  • 3:请求已经处理,响应中通常有部分数据可用,但是服务器还没有完成响应。
  • 4:响应已完成,可以访问服务器响应并使用它。

所有的文档和规范都强调,只有在就绪状态为4时数据才可以安全使用。

Internet Explorer(1,2,3,4)  |Firefox(1,2,3,4)  |Safari 2.0.1(2,3,4)  | Opera8.5(3,4)

<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" rows="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.getElementByIdx("phone").value;var url = "/cgi-local/lookupCustomer.php?phone=" + escape(phone);request.open("GET", url, true); //准备好打开请求,且配置好了要发送的变量就等发送请求了//通常使用其中的前三个参数。事实上,即使需要异步连接,也应该指定第三个参数为 “true”。//多数请求使用GET就够了,再加上URL,这就是使用open()方法需要的全部内容了。request.onreadystatechange = updatePage;request.send(null);//一旦用open()配置好之后,就可以发送请求了。send()只有一个参数,就是要发送的内容。//如果不需要通过send()传递数据,则只要传递null作为该方法的参数即可。}function updatePage() {if (request.readyState == 4)if (request.status == 200){var response = request.responseText.split("|"); //用split进行分切document.getElementByIdx("order").value = response[0]; //response[0]为切出的第1个document.getElementByIdx("address").innerHTML =response[1].replace(/\n/g,"<br/>");//设定其div中html内容为;replace为js中的替代方法alert("Server is done!");}else if(request.status ==404)alert("Request URL does not exist");elsealert("Error: status code is " + request.status); }

</script>

那么Ajax和Web 2.0最大的秘密是什么呢?秘密就在于XMLHttpRequest的一个简单属性onreadystatechange。

建立其请求然后发出请求。

此外,因为是异步请求,所以JavaScript方法(例子中的getCustomerInfo())不会等待服务器。

因此代码将继续执行,就是说,将退出该方法而把控制返回给表单。

用户可以继续输入信息,应用程序不会等待服务器。

当服务器完成请求之后,会查看XMLHttpRequest对象,特别是onreadystatechange属性。然后调用该属性指定的任何方法。

onreadystatechange属性在调用send()之前设置的,也就是发送前就要告诉服务器其反馈可回调哪个方法。

前面提到,服务器在完成请求之后会在XMLHttpRequest的onreadystatechange属性中查找要调用的方法。

这是真的,但还不完整。事实上,每当HTTP就绪状态改变时它都会调用该方法。这意味着什么呢?首先必须理解HTTP就绪状态。

HTTP就绪状态表示请求的状态或情形。

它用于确定该请求是否已经开始、是否得到了响应或者请求/响应模型是否已经完成。

它还可以帮助确定读取服务器提供的响应文本或数据是否安全。

与大多数跨浏览器问题一样,这些就绪状态的使用也不尽一致

但不同的浏览器也会有不同的开始,有的是0开始有的是1,有的是2或3.但是4都是代表响应已完成.

所以我们可以在回调的方法中用 if (request.readyState ==4)来检测状态.

但是此状态只说明服务器回馈响应了信息回来了,并没代表此信息正确与否.

404错误码的情形,它表示该页面不存在

403 访问数据受到保护

401 禁止访问

request.status,状态码是200,它表示一切顺利。

现在可以确保请求已经处理完成(通过就绪状态),

服务器给出了正常的响应(通过状态码),

最后我们可以处理服务器返回的数据了。

返回的数据保存在XMLHttpRequest对象的responseText属性中。

关于responseText中的文本内容,比如格式和长度,有意保持含糊。

这样服务器就可以将文本设置成任何内容。

比方说,一种脚本可能返回逗号分隔的值,另一种则使用管道符(即|字符)分隔的值,还有一种则返回长文本字符串。何去何从由服务器决定。

在本文使用的例子中,服务器返回客户的上一个订单和客户地址,中间用管道符分开。然后使用订单和地址设置表单中的元素值