从零开始学习jQuery (六) jquery中的AJAX使用


Posted in Javascript onFebruary 23, 2011

一.摘要

本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍.

本篇文章讲解如何使用jQuery方便快捷的实现Ajax功能.统一所有开发人员使用Ajax的方式.

二.前言

Ajax让用户页面丰富起来, 增强了用户体验. 使用Ajax是所有Web开发的必修课. 虽然Ajax技术并不复杂, 但是实现方式还是会因为每个开发人员的而有所差异.jQuery提供了一系列Ajax函数来帮助我们统一这种差异, 并且让调用Ajax更加简单.

三.原始Ajax与jQuery中的Ajax

首先通过实例, 来看一下jQuery实现Ajax有多简单. 下面是一个使用原始Ajax的示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>jQuery Ajax</title>
  <script type="text/javascript">
    $(function()
    {
      var xhr = new AjaxXmlHttpRequest();
      $("#btnAjaxOld").click(function(event)
      {
        var xhr = new AjaxXmlHttpRequest();
        xhr.onreadystatechange = function()
        {
          if (xhr.readyState == 4)
          {
            document.getElementById("divResult").innerHTML = xhr.responseText;
          }
        }
        xhr.open("GET", "data/AjaxGetCityInfo.aspx?resultType=html", true);
        xhr.send(null);
      });
    })

    //跨浏览器获取XmlHttpRequest对象
    function AjaxXmlHttpRequest()
    {
      var xmlHttp;
      try
      {
        // Firefox, Opera 8.0+, Safari
        xmlHttp = new XMLHttpRequest();
      }
      catch (e)
      {

        // Internet Explorer
        try
        {
          xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {

          try
          {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
          }
          catch (e)
          {
            alert("您的浏览器不支持AJAX!");
            return false;
          }
        }
      }
      return xmlHttp;
    }    
  </script>

</head>
<body>  
  <button id="btnAjaxOld">原始Ajax调用</button><br />
  <br />
  <div id="divResult"></div>
</body>
</html>

上面的实例中, data/AjaxGetCityInfo.aspx?resultType=html 地址会返回一段HTML代码.

使用原始Ajax, 我们需要做较多的事情, 比如创建XmlHttpRequest对象,  判断请求状态, 编写回调函数等.

而用jQuery的Load方法, 只需要一句话:

$("#divResult").load("data/AjaxGetCityInfo.aspx", { "resultType": "html" });

 

曾经我是一个原始Ajax的绝对拥护者, 甚至摒弃微软的Asp.net Ajax, 因为我想要最高的代码灵活度. 使用原始Ajax让我感觉完成自己的工作更加轻松, 即使多写了一些代码. 但是当我去翻看别人的Ajax代码并且尝试修改的时候, 我改变了我的看法--我们的代码到处分布着创建XmlHttpRequest方法的函数, 或者某些Ajax程序逻辑性和结构性很差, 很难看懂.

我们可以将通用方法放到一个js文件中, 然后告诉大家"嘿伙伴们, 都来用这个js中的方法". 但是在某些时候有些新来的外包人员并不知道有这个js文件的存在. 而且其实这个通用的js就是一个公共的脚本类库,  我相信没有人会觉得自己开发一个类库会比jQuery更好!

所以我放弃了制造轮子的计划,  大家都使用jQuery编写Ajax相关的方法就可以解决各种差异性问题, 并且让工作更有效率.

现在只是用jQuery的Ajax函数, 我的页面变得简洁了:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>jQuery Ajax</title>
  <script type="text/javascript" src="scripts/jquery-1.3.2-vsdoc2.js"></script>
  <script type="text/javascript">
    $(function()
    {      
      $("#btnAjaxJquery").click(function(event)
      {
        $("#divResult").load("data/AjaxGetCityInfo.aspx", { "resultType": "html" });
      });    
    })    
  </script>
</head>
<body>  
  <button id="btnAjaxJquery">使用jQuery的load方法</button>
  <br />
  <div id="divResult"></div>
</body>
</html>

 

四.jQuery Ajax详解

jQuery提供了几个用于发送Ajax请求的函数. 其中最核心也是最复杂的是jQuery.ajax( options ),所有的其他Ajax函数都是它的一个简化调用. 当我们想要完全控制Ajax时可以使用此结果, 否则还是使用简化方法如get, post, load等更加方便. 所以jQuery.ajax( options ) 方法放到最后一个介绍. 先来介绍最简单的load方法:

1.  load( url, [data], [callback] )

Returns: jQuery包装集

说明:

load方法能够载入远程 HTML 文件代码并插入至 DOM 中。

默认使用 GET 方式, 如果传递了data参数则使用Post方式.

- 传递附加参数时自动转换为 POST 方式。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector", 默认的选择器是"body>*".

讲解:

load是最简单的Ajax函数, 但是使用具有局限性:

  1. 它主要用于直接返回HTML的Ajax接口
  2. load是一个jQuery包装集方法,需要在jQuery包装集上调用,并且会将返回的HTML加载到对象中, 即使设置了回调函数也还是会加载.

不过不可否认load接口设计巧妙并且使用简单.下面通过示例来演示Load接口的使用:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>jQuery Ajax - Load</title>

  <script type="text/javascript" src="../scripts/jquery-1.3.2-vsdoc2.js"></script>

  <script type="text/javascript">
    $(function()
    {
      $("#btnAjaxGet").click(function(event)
      {
        //发送Get请求
        $("#divResult").load("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click" + "×tamp=" + (new Date()).getTime());
      });

      $("#btnAjaxPost").click(function(event)
      {
        //发送Post请求
        $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxPost_click" });
      });

      $("#btnAjaxCallBack").click(function(event)
      {
        //发送Post请求, 返回后执行回调函数.
        $("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxCallBack_click" }, function(responseText, textStatus, XMLHttpRequest)
        {
          responseText = " Add in the CallBack Function! <br/>" + responseText
          $("#divResult").html(responseText); //或者: $(this).html(responseText);
        });
      });

      $("#btnAjaxFiltHtml").click(function(event)
      {
        //发送Get请求, 从结果中过滤掉 "鞍山" 这一项
        $("#divResult").load("../data/AjaxGetCityInfo.aspx?resultType=html" + "×tamp=" + (new Date()).getTime() + " ul>li:not(:contains('鞍山'))");
      });

    })
  </script>

</head>
<body>  
  <button id="btnAjaxGet">使用Load执行Get请求</button><br />
  <button id="btnAjaxPost">使用Load执行Post请求</button><br />
  <button id="btnAjaxCallBack">使用带有回调函数的Load方法</button><br />
  <button id="btnAjaxFiltHtml">使用selector过滤返回的HTML内容</button>
  <br />
  <div id="divResult"></div>
</body>
</html>

 

上面的示例演示了如何使用Load方法.

提示:我们要时刻注意浏览器缓存,  当使用GET方式时要添加时间戳参数 (net Date()).getTime() 来保证每次发送的URL不同, 可以避免浏览器缓存.

提示: 当在url参数后面添加了一个空格, 比如"  "的时候, 会出现"无法识别符号"的错误, 请求还是能正常发送. 但是无法加载HTML到DOM. 删除后问题解决.

2.jQuery.get( url, [data], [callback], [type] ) 

Returns: XMLHttpRequest

说明:

通过远程 HTTP GET 请求载入信息。

这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。

讲解:

此函数发送Get请求, 参数可以直接在url中拼接, 比如:

$.get("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click");

或者通过data参数传递:

$.get("../data/AjaxGetMethod.aspx", { "param": "btnAjaxGet2_click" });
 

两种方式效果相同, data参数会自动添加到请求的url中

如果url中的某个参数, 又通过data参数传递, 不会自动合并相同名称的参数.

回调函数的签名如下:

function (data, textStatus) {
 // data could be xmlDoc, jsonObj, html, text, etc...
 this; // the options for this ajax request
}

其中data是返回的数据, testStatus表示状态码, 可能是如下值:

"timeout","error","notmodified","success","parsererror"
在回调函数中的this是获取options对象的引用.有关options的各种说明, 请参见:
http://docs.jquery.com/Ajax/jQuery.ajax#options
 
type参数是指data数据的类型, 可能是下面的值:
"xml", "html", "script", "json", "jsonp", "text".

默认为"html".

jQuery.getJSON( url, [data], [callback] ) 方法就相当于 jQuery.get(url, [data],[callback], "json")

 

3. jQuery.getJSON( url,  [data], [callback] )

Returns: XMLHttpRequest

相当于:   jQuery.get(url, [data],[callback], "json")

说明:

通过 HTTP GET 请求载入 JSON 数据。

在 jQuery 1.2 中,您可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?"。jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。

注意:此行以后的代码将在这个回调函数执行前执行。

讲解:

getJSON函数仅仅将get函数的type参数设置为"JSON"而已. 在回调函数中获取的数据已经是按照JSON格式解析后的对象了:

$.getJSON("../data/AjaxGetCityInfo.aspx", { "resultType": "json" }, function(data, textStatus)
{
   alert(data.length);
   alert(data[0].CityName);
});

 

服务器端返回的字符串如下:

[{""pkid"":""0997"",""ProvinceId"":""XJ"",""CityName"":""阿克苏"",""CityNameEn"":""Akesu"",""PostCode"":""843000"",""isHotCity"":false},
 {""pkid"":""0412"",""ProvinceId"":""LN"",""CityName"":""鞍山"",""CityNameEn"":""Anshan"",""PostCode"":""114000"",""isHotCity"":false}]

示例中我返回的饿是一个数组, 使用data.length可以获取数组的元素个数,  data[0]访问第一个元素, data[0].CityName访问第一个元素的CityName属性.

 

4.jQuery.getScript( url, [callback] )

Returns: XMLHttpRequest

相当于:   jQuery.get(url, null, [callback], "script")

说明:

通过 HTTP GET 请求载入并执行一个 JavaScript 文件。

jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。

讲解:

以前我使用dojo类库时官方默认的文件不支持跨域最后导致我放弃使用dojo(虽然在网上找到了可以跨域的版本, 但是感觉不够完美).  所以我特别对这个函数的核心实现和使用做了研究.

首先了解此函数的jQuery内部实现, 仍然使用get函数, jQuery所有的Ajax函数包括get最后都是用的是jQuery.ajax(), getScript将传入值为"script"的type参数,  最后在Ajax函数中对type为script的请求做了如下处理:

var head = document.getElementsByTagName("head")[0];      
var script = document.createElement("script");
script.src = s.url;

上面的代码动态建立了一个script语句块, 并且将其加入到head中:

head.appendChild(script);


当脚本加载完毕后, 再从head中删除:

// Handle Script loading
      if ( !jsonp ) {
        var done = false;

        // Attach handlers for all browsers
        script.onload = script.onreadystatechange = function(){
          if ( !done && (!this.readyState ||
              this.readyState == "loaded" || this.readyState == "complete") ) {
            done = true;
            success();
            complete();

            // Handle memory leak in IE
            script.onload = script.onreadystatechange = null;
            head.removeChild( script );
          }
        };
      }

我主要测试了此函数的跨域访问和多浏览器支持.下面是结果:

IE6 FireFox 注意事项
非跨域引用js 通过 通过 回调函数中的data和textStatus均可用
跨域引用js 通过 通过 回调函数中的data和textStatus均为undifined

 

下面是我关键的测试语句, 也用来演示如何使用getScript函数:

$("#btnAjaxGetScript").click(function(event)
      {
        $.getScript("../scripts/getScript.js", function(data, textStatus)
        {
          alert(data);
          alert(textStatus);
          alert(this.url);
        });
      });

      $("#btnAjaxGetScriptCross").click(function(event)
      {
        $.getScript("http://resource.elong.com/getScript.js", function(data, textStatus)
        {
          alert(data);
          alert(textStatus);
          alert(this.url);
        });
      });
 

 

5. jQuery.post( url, [data], [callback], [type] )

Returns: XMLHttpRequest

说明:

通过远程 HTTP POST 请求载入信息。

这是一个简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。

讲解:

具体用法和get相同, 只是提交方式由"GET"改为"POST".


6. jQuery.ajax( options )

Returns: XMLHttpRequest

说明:

通过 HTTP 请求加载远程数据。

jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。

$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。

$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。

注意: 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml")。错误的 MIME 类型可能导致不可预知的错误。见 Specifying the Data Type for AJAX Requests 。

注意:如果dataType设置为"script",那么所有的远程(不在同一域名下)的POST请求都将转化为GET请求。(因为将使用DOM的script标签来加载)

jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 "jsonp" 时,jQuery 将自动调用回调函数。

讲解:

这是jQuery中Ajax的核心函数, 上面所有的发送Ajax请求的函数内部最后都会调用此函数.options参数支持很多参数, 使用这些参数可以完全控制ajax请求. 在Ajax回调函数中的this对象也是options对象.

因为平时使用最多的还是简化了的get和post函数, 所以在此不对options参数做详细讲解了. options参数文档请见:

Javascript 相关文章推荐
解决自定义$(id)的方法与jquery选择器$冲突的问题
Jun 14 Javascript
js星星评分效果
Jul 24 Javascript
基于jQuery实现网页打印功能
Dec 01 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
Jul 06 Javascript
浅谈sass在vue注意的地方
Aug 10 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
Dec 05 Javascript
node.js使用yargs处理命令行参数操作示例
Feb 11 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
echarts饼图各个板块之间的空隙如何实现
Dec 01 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
Feb 23 #Javascript
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 #Javascript
jQuery的学习步骤
Feb 23 #Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
Feb 23 #Javascript
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 #Javascript
js操作textarea方法集合封装(兼容IE,firefox)
Feb 22 #Javascript
快速排序 php与javascript的不同之处
Feb 22 #Javascript
You might like
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP 验证登陆类分享
2015/03/13 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
广告显示判断
2006/08/31 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
js实现图片轮播效果
2015/12/19 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
python进阶教程之循环对象
2014/08/30 Python
Python中优化NumPy包使用性能的教程
2015/04/23 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Python 查看文件的读写权限方法
2018/01/23 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python turtle库的画笔控制说明
2020/06/28 Python
在线服装零售商:SheIn
2016/07/22 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
结婚周年感言
2014/02/24 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
2014年党支部工作总结
2014/11/13 职场文书
投标承诺函范文
2015/01/21 职场文书
庆七一活动简报
2015/07/20 职场文书
业务员管理制度范本
2015/08/06 职场文书
高二化学教学反思
2016/02/22 职场文书