3.1 使用Ajax.Request类

优质
小牛编辑
134浏览
2023-12-01

如果你不使用任何的帮助程序包,你很可能编写了整个大量的代码来创建XMLHttpRequest对象并且异步的跟踪它的进程, 然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。

为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。

假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&year=1998与服务器通信。它返回下面这样的XML 响应。

<?xml version="1.0" encoding="utf-8" ?>
<ajax-response>
  <response type="object" id="productDetails">
    <monthly-sales>
      <employee-sales>
        <employee-id>1234</employee-id>
        <year-month>1998-01</year-month>
        <sales>$8,115.36</sales>
      </employee-sales>
      <employee-sales>
        <employee-id>1234</employee-id>
        <year-month>1998-02</year-month>
        <sales>$11,147.51</sales>
      </employee-sales>
    </monthly-sales>
  </response>
</ajax-response> 

用 Ajax.Request对象和服务器通信并且得到这段 XML是非常简单的。下面的例子演示了它是如何完成的。

<script>
function searchSales(){
    var empID=$F('lstEmployees');
    var y=$F('lstYears');
    var url='http://yoursever/app/get_sales';
    var pars='empID='+empID+'&year='+y;

    var myAjax=new Ajax.Request(url,{
        method:'get',parameters:pars,onComplete:showResponse
    });
}
function showResponse(originalRequest)
{
    //put returned XML in the textarea
    $('result').value = originalRequest.responseText;
}
</script> 
<select id="lstEmployees" size="10" onchange="searchSales()">
    <option value="5">Buchanan, Steven</option>
    <option value="8">Callahan, Laura</option>
    <option value="1">Davolio, Nancy</option>
</select>
<select id="lstYears" size="3" onchange="searchSales()">
    <option selected="selected" value="1996">1996</option>
    <option value="1997">1997</option>
    <option value="1998">1998</option>
</select>
<br>
<textarea id=result cols=60 rows=10 ></textarea>

你注意到传入 Ajax.Request构造方法的第二个对象了吗? 参数{method: 'get', parameters: pars, onComplete: showResponse}表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method值为 'get'的属性,另一个属性名为 parameters包含HTTP请求的查询字符串,和一个onComplete属性/方法包含函数showResponse。

还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为true或 false来决定AJAX对服务器的调用是否是异步的(默认值是 true)。

这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse方法。

也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request对象在任何阶段调用自定义方法 ,Complete是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status属性。

还有另外两个有用的选项用来处理结果。我们可以在onSuccess选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。

我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。

在1.4.0版本中,一种新的事件回传外理被引入。如果你有一段代码总是要为一个特殊的事件执行,而不管是哪个AJAX调用引发它,那么你可以使用新的Ajax.Responders对象。

假设你想要在一个 AJAX 调用正在运行时,显示一些提示效果,像一个不断转动的图标之类的,你可以使用两个全局事件 Handler 来做到,其中一个在第 一个调用开始时显示图标,另一个在最后一个调用完成时隐藏图标。看下面的例子。

<script> var myGlobalHandlers = { onCreate: function(){ Element.show('systemWorking'); }, onComplete: function() { if(Ajax.activeRequestCount == 0){ Element.hide('systemWorking'); } } }; Ajax.Responders.register(myGlobalHandlers); </script> <div id='systemWorking'><img src='spinner.gif'>Loading...</div>

更完全的解释,请参照 Ajax.Request 参考和 Ajax选项参考。