jQuery中异步交互技术详细指南

在积极备战SVT-PortalONE项目之前,听说项目中的js框架用的是jQuery,主要可能用到jQuery中提供的异步交互技术和 jQuery开源提供的UI,趁此机会总结、分享一下自己学习jQuery提供的ajax技术的经验,在本文的最后,我会提供几个学习过程中编写的代码示例供大家参考、学习!
     在jquery-1.3.1提供的API 中,最完整的方法是jQuery.ajax(options),同时她也是jQuery底层AJAX实现,简单容易的高层实现大家可以看下API中提供的 jQuery.get(options)、jQuery.post(options),以及配合JSON做为传输数据格式的方法 jQuery.getJSON(options).下面我主要针对jQuery提供的API为大家详细讲解下jQuery.ajax(options)方法(PS:在学习其提供的API过程,需要特别注意的地方我用红色、加粗)进行提示
jQuery.ajax(options):
功能描述
通过 HTTP 请求加载远程数据。
$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。
$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。
详细参数选项见下
注意:
1:如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml")。错误的 MIME 类型可能导致不可预知的错误。
2:如果dataType设置为"script",那么在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
jQuery 1.2 中,我们可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 "jsonp" 时,jQuery 将自动调用回调函数。
返回值
XMLHttpRequest
参数
options (可选) : AJAX 请求设置。所有选项都是可选的。
选项
async (Boolean) : (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
beforeSend (Function) : 发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。这是一个Ajax事件。如果返回false可以取消本次ajax请求。
function (XMLHttpRequest) {
    this; // 调用本次AJAX请求时传递的options参数
}
cache (Boolean) : (默认: true,dataType为script时默认为false) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。
complete (Function) : 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象和一个描述成功请求类型的字符串。
function (XMLHttpRequest, textStatus) {
    this; // 调用本次AJAX请求时传递的options参数
}
contentType (String) : (默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。
data (Object,String) : 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value(键值对)格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。
dataFilter (Function) :给Ajax返回的原始数据的进行预处理的函数。提供data和type两个参数:data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。
function (data, type) {
    // 对Ajax返回的原始数据进行预处理
    return data // 返回处理后的数据
}
dataType (String) : (默认值:智能判断xml或者html)预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,
可用值:
"xml":           返回 XML 文档,可用 jQuery 处理。
"html":         返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
"script":       返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了"cache"参数。注意:在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
"json":         返回 JSON 数据。
"jsonp":       JSONP 格式。使用 JSONP形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
"text":          返回纯文本字符串
error (Function) : (默认: 自动判断 (xml 或 html)) 请求失败时调用时间。参数有以下三个:XMLHttpRequest 对象、错误信息、(可选)捕获的错误对象。如果发生了错误,错误信息(第二个参数)除了得到null之外,还可能是"timeout", "error", "notmodified" 和 "parsererror"。
function (XMLHttpRequest, textStatus, errorThrown) {
    // 通常 textStatus 和 errorThrown 之中
    // 只有一个会包含信息
    this; // 调用本次AJAX请求时传递的options参数
}
global (Boolean) : (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 可用于控制不同的AJAX事件。
ifModified (Boolean) : (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。
jsonp (String) : 在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。
password (String) : 用于响应HTTP访问认证请求的密码
processData (Boolean) : (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
scriptCharset (String) : 只有当请求时dataType为"jsonp"或"script",并且type是"GET"才会用于强制修改charset。通常在本地和远程的内容编码不同时使用。
success (Function) : 请求成功后的回调函数。参数:由服务器返回,并根据dataType参数进行处理后的数据;描述状态的字符串。
function (data, textStatus) {
    // data 可能是 xmlDoc, jsonObj, html, text, 等等...
    this; // 调用本次AJAX请求时传递的options参数
}
timeout (Number) : 设置请求超时时间(毫秒)。此设置将覆盖全局设置。
type (String) : (默认: "GET") 请求方式 ("POST" 或 "GET"),默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
url (String) : (默认: 当前页地址) 发送请求的地址。
username (String) : 用于响应HTTP访问认证请求的用户名,配合password (String) 一起使用哈。
xhr (Function) : 需要返回一个XMLHttpRequest 对象。默认在IE下是ActiveXObject 而其他情况下是XMLHttpRequest 。用于重写或者提供一个增强的XMLHttpRequest 对象。这个参数在jQuery 1.3以前不可用。

下面是我学习过程中编写代码:
演示DEMO 1st:
功能描述:在登陆页面,异步检验用户提交的数据(用户名和密码)是否正确,返回相应的信息到登陆页面中id为message的DIV中,该DIV的初始状态为隐藏的,前后台返回提示信息的过程采用滑动的动画效果进行展示,展示一定的时间(setTimeout 定时器)后自动的滑动隐藏!
PS:由于本帖主要是给大家讲解jQuery中异步交互技术,后台的逻辑在这里就不给大家写了,后台代码业务逻辑、持久层逻辑在这里就不详细展示了,需要帖中的demo源文件的,可以RTX密下我。
演示截图:因为动画的过程很难以静态图片展示,所以我把窗口的边缘截了一角,大家注意窗口与登陆框的距离
Picture 1 登陆前

Picture 2  未输入用户或密码 登陆框与窗口上部边缘的距离变长了,变化的过程是动态的向下滑动,很酷的

Picture 3  恢复后的窗口呈现 恢复了以往的平静

Picture 4  输入错误的用户名和密码   大家继续看登陆框与窗口上部边缘的距离

Picture 5 输入正确的用户名     提示登陆成功

代码展示:
登陆页面代码:
<%@ page language="java"  pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>jQuery-登陆验证</title>
    <!--  引进jQuery核心js -->
    <script type="text/javascript" src="js/jquery-1.3.1.js"></script> 

    <script type="text/javascript">
           $(document).ready(function(){
                 $("#button").click(function(){
                      var username=$("#username").val();
                      var password=$("#password").val();
                      if(username==""||password=="")//用户未输入用户名或密码
                      {    
                             $("#message").slideDown("slow");//设置id为message的DIV(以下注释称DIV)以slow的速度慢慢向下滑动
                             $("#message").show();//设置DIV显现
                             $("#message").css("border-color","red");//设置DIV的边框颜色
                             $("#message")[0].innerHTML='<font color="red">Please enter username or password!</font>';//设置提示信息
    
                            setTimeout('back()',2000); //设置定时器,2秒后调用函数back
                            return;       
                      }   
           //用户输入用户和密码,对用户输入的数据进行异步检验
           $.ajax({
                         type:"POST",  //异步请求方式
                         data:"username="+username+"&password="+password,  //传递的数据
                         url:"login.do?method=login",   //请求路径 请求Action(继承DispatcherAction)中的login方法
                         success:show    //异步请求成功后的回调函数
                    })  
           })
    })
 
  //DIV展示信息一段时间后调用的函数
  function back()
  {
        $("#message")[0].innerHTML=' ';
        $("#message").slideUp('slow');
        $("#message").hide();    
  }
 
  //回调函数
  function show(response)
  {
           $("#message")[0].innerHTML='<font color="'red"'>'+response.firstChild.firstChild.nodeValue+'</font>';
           $("#message").slideDown('slow');
           $("#message").show();
           setTimeout('back()',2000);  
  }
</script>

  </head> 
  <body>
         <form>
                  <table width="80%" align="center" border="0">
                       <tr>
                             <td align="center" colspan="2">
                                  <div id="message" style="display: none;width: 500px;height: 50px;border: 1px ">
         
                                  </div>
                             </td>       
                       </tr>
                       <tr>
                              <td width="40%" align="right">username:</td>
                              <td width="*"><input type="text"  name="username" id="username" style="width: 100px;height: 20px"/></td>
                       </tr>
                       <tr>
                               <td align="right">password:</td>
                               <td><input type="password" name="password" id="password" style="width: 100px;height: 20px"/></td>
                       </tr>
                       <tr>
                               <td colspan="2" align="center"><input type="button" id="button" value="submit" /></td>
                       </tr>
                  </table>
         </form>
  </body>
</html>
演示DEMO 2nd:
功能描述:异步加载并去执行一个js,在demo2.jsp中点击按纽触发异步请求。
演示截图:
Picture 1:展示demo2.jsp中的内容

Picture 2:点击按钮后,加载并执行js,并把被请求js的文本内容打印

代码展示:
demo2.jsp
<%@ page language="java"  pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
   
    <title>jQuery-异步加载并执行一个js文件</title>   
    <script type="text/javascript" src="js/jquery-1.3.1.js"></script>
    <script type="text/javascript"> 
            //加载并去执行一个js
            $(function(){
                      $("#button").click(function(){
                      var result='请求结果:';   
                      jQuery.ajax({
                                 type:"POST",
                                 url:"js/test.js",
                                dataType:"script",
                                error:function(XMLHttpRequest,textStatus,errorThrown)
                                 {
                                       result+=textStatus;
                                       alert(result);
          
                                 },
                               success:function(data,textStatus)
                                {
                                      result+=textStatus;
                                      alert(result);
                                }      
                      })
                })
         })
  </script>
  </head>

  <body>
             <center>
                    <input type="button" id="button" value="Click me!" />
              </center>
  </body>
</html>
text.js
           alert('hello,chinasoft resource!');
好了,这两个简单的sample结合上面分析API,应该能够帮助大家概要简单的认识下jQuery中提供的异步交互功能了。

你可能感兴趣的:(jsonp,jquery,json,Ajax,应用服务器)