从零开始学习jQuery (六) AJAX快餐

本系列文章导航

从零开始学习jQuery (一) 开天辟地入门篇

从零开始学习jQuery (二) 万能的选择器

从零开始学习jQuery (三) 管理jQuery包装集

从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

从零开始学习jQuery (五) 事件与事件对象

从零开始学习jQuery (六) jQuery中的Ajax

从零开始学习jQuery (七) jQuery动画-让页面动起来!

从零开始学习jQuery (八) 插播:jQuery实施方案

从零开始学习jQuery (九) jQuery工具函数

从零开始学习jQuery (十) jQueryUI常用功能实战

从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件

 

 

一.摘要

本系列文章将带您进入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" + "&timestamp=" + (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" + "&timestamp=" + (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参数文档请见:

http://docs.jquery.com/Ajax/jQuery.ajax#options

 

五.Ajax相关函数.

jQuery提供了一些相关函数能够辅助Ajax函数.

1. jQuery.ajaxSetup( options )

无返回值

说明:

设置全局 AJAX 默认options选项。

讲解:

有时我们的希望设置页面上所有Ajax属性的默认行为.那么就可以使用此函数设置options选项, 此后所有的Ajax请求的默认options将被更改.

options是一个对象, 可以设置的属性请此连接:http://docs.jquery.com/Ajax/jQuery.ajax#toptions

比如在页面加载时, 我使用下面的代码设置Ajax的默认option选项:

            $.ajaxSetup({
                url: "../data/AjaxGetMethod.aspx",
                data: { "param": "ziqiu.zhang" },
                global: false,
                type: "POST",
                success: function(data, textStatus) { $("#divResult").html(data); }
            });

上面的代码设置了一个Ajax请求需要的基本数据: 请求url, 参数, 请求类型, 成功后的回调函数.

此后我们可以使用无参数的get(), post()或者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 - Load</title>

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

    <script type="text/javascript">
        $(document).ready(function()
        {
            $.ajaxSetup({
                url: "../data/AjaxGetMethod.aspx",
                data: { "param": "ziqiu.zhang" },
                global: false,
                type: "POST",
                success: function(data, textStatus) { $("#divResult").html(data); }
            });

            $("#btnAjax").click(function(event) { $.ajax(); });
            $("#btnGet").click(function(event) { $.get(); });
            $("#btnPost").click(function(event) { $.post(); });
            $("#btnGet2").click(function(event) { $.get("../data/AjaxGetMethod.aspx",{ "param": "other" }); });

        });

    </script>

</head>  
<body>    
    <button id="btnAjax">不传递参数调用ajax()方法</button><br />
    <button id="btnGet">不传递参数调用get()方法</button><br />
    <button id="btnPost">不传递参数调用post()方法</button><br />
    <button id="btnGet2">传递参数调用get()方法, 使用全局的默认回调函数</button><br />
    <br />
    <div id="divResult"></div>
</body>
</html>

注意当使用get()或者post()方法时, 除了type参数将被重写为"GET"或者"POST"外, 其他参数只要不传递都是使用默认的全局option. 如果传递了某一个选项, 比如最后一个按钮传递了url和参数, 则本次调用会以传递的选项为准. 没有传递的选项比如回调函数还是会使用全局option设置值.

 

2.serialize( )

Returns: String

说明:

序列表表格内容为字符串,用于 Ajax 请求。

序列化最常用在将表单数据发送到服务器端时. 被序列化后的数据是标准格式, 可以被几乎所有的而服务器端支持.

为了尽可能正常工作, 要求被序列化的表单字段都有name属性, 只有一个eid是无法工作的.

像这样写name属性:

<input id="email" name="email" type="text" /> 


讲解:

serialize()函数将要发送给服务器的form中的表单对象拼接成一个字符串. 便于我们使用Ajax发送时获取表单数据. 这和一个From按照Get方式提交时, 自动将表单对象的名/值放到url上提交差不多.

比如这样一个表单:

image

生成的字符串为:single=Single&param=Multiple&param=Multiple3&check=check2&radio=radio1

提示:代码见 chapter6\7-serialize.htm

3.serializeArray( )

Returns: Array<Object>

说明:

序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。

注意,此方法返回的是JSON对象而非JSON字符串。需要使用插件或者第三方库进行字符串化操作。

讲解:

看说明文档让我有所失望, 使用此函数获取到的是JSON对象, 但是jQuery中没有提供将JSON对象转化为JSON字符串的方法.

在JSON官网上没有找到合适的JSON编译器, 最后选用了jquery.json这个jQuery插件:

http://code.google.com/p/jquery-json/

使用起来异常简单:

var thing = {plugin: 'jquery-json', version: 1.3};
var encoded = $.toJSON(thing);              //'{"plugin": "jquery-json", "version": 1.3}'
var name = $.evalJSON(encoded).plugin;      //"jquery-json"
var version = $.evalJSON(encoded).version;  // 1.3

 

使用serializeArray( ) 再配合 $.toJSON 方法, 我们可以很方便的获取表单对象的JSON, 并且转换为JSON字符串:

$("#results").html( $.toJSON( $("form").serializeArray() ));


结果为:

[{"name": "single", "value": "Single"}, {"name": "param", "value": "Multiple"}, {"name": "param", "value": "Multiple3"}, {"name": "check", "value": "check2"}, {"name": "radio", "value": "radio1"}]

 

 

六.全局Ajax事件

jQuery.ajaxSetup( options ) 中的options参数属性中, 有一个global属性:

global

类型:布尔值

默认值: true

说明:是否触发全局的Ajax事件.

这个属性用来设置是否触发全局的Ajax事件. 全局Ajax事件是一系列伴随Ajax请求发生的事件.主要有如下事件:

名称 说明
ajaxComplete( callback ) AJAX 请求完成时执行函数
ajaxError( callback ) AJAX 请求发生错误时执行函数
ajaxSend( callback ) AJAX 请求发送前执行函数
ajaxStart( callback ) AJAX 请求开始时执行函数
ajaxStop( callback ) AJAX 请求结束时执行函数
ajaxSuccess( callback ) 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 - AjaxEvent</title>

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

    <script type="text/javascript">
        $(document).ready(function()
        {

            $("#btnAjax").bind("click", function(event)
            {
                $.get("../data/AjaxGetMethod.aspx");
            })

            $("#divResult").ajaxComplete(function(evt, request, settings) { $(this).append('<div>ajaxComplete</div>'); })
            $("#divResult").ajaxError(function(evt, request, settings) { $(this).append('<div>ajaxError</div>'); })
            $("#divResult").ajaxSend(function(evt, request, settings) { $(this).append('<div>ajaxSend</div>'); })
            $("#divResult").ajaxStart(function() { $(this).append('<div>ajaxStart</div>'); })
            $("#divResult").ajaxStop(function() { $(this).append('<div>ajaxStop</div>'); })
            $("#divResult").ajaxSuccess(function(evt, request, settings) { $(this).append('<div>ajaxSuccess</div>'); })

        });

    </script>

</head>
<body>    
  <br /><button id="btnAjax">发送Ajax请求</button><br/>
  <div id="divResult"></div>
</body>
</html>


结果如图:

image

我们可以通过将默认options的global属性设置为false来取消全局Ajax事件的触发.

 

七.注意事项

如果在Get请求发送的url中有两个同名参数, 比如两个param参数:

http://localhost/AjaxGetMethod.aspx?param=Multiple&param=Multiple3

使用服务器端方法获取param参数:

        if (!String.IsNullOrEmpty(HttpContext.Current.Request["Param"]))
        {
            param = HttpContext.Current.Request["Param"];
        }

此时获取到得param是一个用","分隔多个值的字符串:

Multiple,Multiple3

 

八.总结

本文介绍如何使用jquery实现Ajax功能.  用于发送Ajax请求的相关函数如load, get, getJSON和post这些渐变Ajax方法, 对于核心的ajax 方法没有过多介绍, 主要是通过配置复杂的参数实现完全控制Ajax请求. 另外讲解了ajax的辅助函数比如用于序列化表单对象为字符串的serialize()方法, 用于将表单对象序列化为JSON对象的serializeArray()方法. 这些在使用脚本获取数据实现与服务器端交互是很有用, JSON格式的数据在处理大对象编程时将我们从混乱的属性字符串中解放出来.

jQuery还提供录入全局ajax事件这一个特殊的事件, 并且可以在一个对象上设置这些事件, 在发送Ajax请求的各个生命周期上会调用这些事件, 可以通过修改默认的options对象的global属性打开或关闭全局事件.

目前本系列文章在加紧创作阶段. 所以代码和文章示例都没有来得及重新整理. 下面是本章的代码下载, 但是含有所有以前未整理的示例,请大家下载后看chapter6文件夹, 里面是本章的所有示例:

http://files.cnblogs.com/zhangziqiu/Code-jQueryStudy.rar

作者:张子秋
出处:http://www.cnblogs.com/zhangziqiu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2009-05-08 00:52 ziqiu.zhang 阅读(34666) 评论(67) 编辑 收藏

 回复 引用   
#1楼 2009-05-08 07:40 zl2000a[未注册用户]
子秋兄,要继续啊,昨天晚上等你的文章,等得好辛苦,居然没出来。跟着你一起学jquery,我也看一些jquery,学到不少东西,真是太谢谢你了。
 回复 引用 查看   
#2楼 2009-05-08 08:31 沉默杨仔      
好文好文!!!ajax部分正是我所关注的。
希望楼主可以针对这部分结合asp.net来几个实例!!

 回复 引用 查看   
#3楼[楼主] 2009-05-08 08:44 ziqiu.zhang      
@zl2000a
已经开足马力在写了, 但是有些内容的细节点研究起来是要花时间的, 甚至有的时候要去看核心类库的实现. 所以我会尽量快的, 谢谢理解和支持!:-)

 回复 引用 查看   
#4楼[楼主] 2009-05-08 08:48 ziqiu.zhang      
@沉默杨仔
在实际项目中我用很简单, 列举出来怕大家笑话, 偷懒的做法让后台生成HTML,一次load全部搞定..... 不过效果还是不错的. 就是城市输入框联动. 现在还是写后续文章为主, 杨仔兄也可以做几个例子出来, 让大家学习!

 回复 引用 查看   
#5楼 2009-05-08 09:00 姜敏      
自己手写ajax的经验正好是你真正用好jquery的捷径,只有明白ajax的真正原理后,才能真正用好jquery,或者是其它js类库,试想如果不懂原理,那扩展就成问题 ,我从来不排斥用公共类库,但反对那些从来不自己写类库的开发人员,他们过分依赖第三方产品,任何扩展性的东西都不会.
 回复 引用 查看   
#6楼 2009-05-08 09:06 vincent_赵      
使用了Jquery很久,一直想深入学习一下,跟着楼主学习了~
 回复 引用 查看   
#7楼 2009-05-08 09:20 戏水      
@子秋

受益良多,子秋兄辛苦了。

 回复 引用   
#8楼 2009-05-08 09:34 jackson2009[未注册用户]
楼主写的很棒啊,但我发现这些全是在html上面的操作,如何在asp.net上面发挥他的作用呢?希望能有点这样的例子,也许对我这样的初学者有帮助,在此感谢楼主出的好文章!
 回复 引用 查看   
#9楼 2009-05-08 10:05 awp110      
好文好文!!!学习学习!!!
 回复 引用   
#10楼 2009-05-08 10:18 nono[未注册用户]
支持
 回复 引用 查看   
#11楼 2009-05-08 10:32 菌哥      
不错的文章!

 回复 引用   
#12楼 2009-05-08 10:47 aa1[未注册用户]
如果是有form验证的页面,Load的话,怎么解决身份验证的问题呀?
 回复 引用 查看   
#13楼 2009-05-08 11:47 cool-donet      
相信我们更多的支持,就是让你写出好文章的动力。 最近一直在看《JQuery基础教程》,感觉受益不大。看了你的文章收获不小,MVC的也多写点。嘻嘻!学习啦。 谢谢,子秋。
 回复 引用 查看   
#14楼 2009-05-08 13:12 Richet      
写的非常好,学习了,!

 回复 引用   
#15楼 2009-05-08 15:44 游客1[未注册用户]
在asp.net中能不能写个例子看看


 回复 引用 查看   
#16楼 2009-05-08 15:48 Selfocus      
very goooooooooooood!
 回复 引用   
#17楼 2009-05-08 22:31 andy222[未注册用户]
我顶你,多弄几个实例来讲一讲.
 回复 引用 查看   
#18楼 2009-05-09 00:25 bo工具网      
来学习,也请问楼主个问题,为什么使用animate时,在ie6会有些变样(比如字体,特别是数字,还有图片),这个是什么回事?
我做的jquery小站,与其说是jquery,不如说是jquery插件展示 呵呵 bo工具网

 回复 引用 查看   
#19楼 2009-05-09 08:28 沉默杨仔      
@沉默杨仔
在实际项目中我用很简单, 列举出来怕大家笑话, 偷懒的做法让后台生成HTML,一次load全部搞定..... 不过效果还是不错的. 就是城市输入框联动. 现在还是写后续文章为主, 杨仔兄也可以做几个例子出来, 让大家学习!
---------------------------------\
不好意思。我对jquery不太懂的,正在拜读您的文章。跟您前辈学习。

 回复 引用   
#20楼 2009-05-09 09:00 kuan[未注册用户]
终于抢一次沙发,楼主辛苦了!
 回复 引用   
#21楼 2009-05-09 09:01 kuan[未注册用户]
晕了,刚才还没有了,怎么怎么
 回复 引用 查看   
#22楼 2009-05-09 10:15 沉默杨仔      
楼主可以写比如的示例:
静态页刷新浏览次数。提交评论。动态加载之类的内容。

呵呵。说得有点自私了点。仅做参考。请原谅

 回复 引用   
#23楼 2009-05-09 15:55 xiaoiiii[未注册用户]
jquery-1.3.2.min.js
敢问楼主 这个版本的怎么不支持智能提示呢?

 回复 引用 查看   
#24楼 2009-05-10 16:51 技术拓荒者      
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxJquerySample3.aspx.cs" Inherits="AjaxJquerySample3" %>
<!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>
<script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="js/jquery-1.3.2-vsdoc2.js" type="text/javascript"></script>
<title>jQuery Ajax</title>
<script type="text/javascript">
$(
function()
{
$("#btnAjaxJqueryLoad1").click(function(event)
{
$("#divResult").load("DataProvider3.aspx?resultType=html")
}
);

$("#btnAjaxJqueryLoad2").click(function(event)
{
$("#divResult").load("DataProvider3.aspx",{ "resultType" :  "html" });
}
);

}
);
</script>
</head>
<body>
<button id="btnAjaxJqueryLoad1">使用jQuery的Get方式实现ajax</button>
<br />
<button id="btnAjaxJqueryLoad2">???使用jQuery的Post方式实现ajax</button>
<br />
<div id="divResult"></div>
</body>
</html>


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class DataProvider3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["resultType"] != null)
{
if (Request.QueryString["resultType"].ToString() == "html")
{
Response.Write("<table><tr><td>广州;深圳</td></tr></table>");
Response.End();
}
}

}
}

上面的第二个按钮执行不了,没见到预期效果,估计是
$("#btnAjaxJqueryLoad2").click(function(event)
{
$("#divResult").load("DataProvider3.aspx",{ "resultType" :  "html" });
的问题,有什么不对么????

 回复 引用 查看   
#25楼 2009-05-10 23:43 music000      
说来惭愧,2006年底接触Jquery,现在也没什么大的进步...

就像你最开始一样,自己也一直用原生的XmlHttpRequest,总不能为了一个简单的异步加载而引用几十K的脚本吧!(一个版本比一个版本大)

现在还在感叹选择器功能的强大呢!当然还有丰富的plugin...

看看Jquery的源码,除了佩服还是佩服...

都已经1.3.2了,我还在用1.2.3呢,落伍了...

还有:Jquery 官方首页上的 "Write less, do more"什么时候不见的?

 回复 引用   
#26楼 2009-05-11 17:12 chrisss[未注册用户]
博主,最近一直在追看你这系列文章,谢谢了.
这一节我遇到个问题,就是load不生效? 用你的范例代码,每次点击之后,divresult没有变化.试了很久,不清楚这是为什么?

 回复 引用 查看   
#27楼[楼主] 2009-05-11 22:06 ziqiu.zhang      
@技术拓荒者
你问问题出现在第二个按钮传递了data参数, 那么回事用Post方法提交参数.
在服务器端应该使用Request.Form而不是Request.QueryString获取参数.

 回复 引用 查看   
#28楼[楼主] 2009-05-11 22:08 ziqiu.zhang      
@chrisss
示例的ID写错了, 我今天重新修正了本章所有的示例, 请重新下载示例代码看看.

 回复 引用 查看   
#29楼[楼主] 2009-05-11 22:09 ziqiu.zhang      
@music000
"Write less, do more"还存在. 看官网, 无论是logo还是页面title都有.

 回复 引用 查看   
#30楼 2009-05-12 12:53 技术拓荒者      
@ziqiu.zhang
if (Request.Form["resultType"] != null)
{
if (Request.Form["resultType"].ToString() == "html")
{
Response.Write("<table><tr><td>广州深圳</td></tr></table>");
Response.End();
}
}

OK
XIEXIE

 回复 引用 查看   
#31楼 2009-05-15 17:31 阿牛      
好文 ,谢谢
 回复 引用 查看   
#32楼 2009-05-19 17:43 ilwzx      
我用load在fx下好像不行!
 回复 引用   
#33楼 2009-05-23 12:04 二十年[未注册用户]
很好的系列文章,支持你继续写好
 回复 引用   
#34楼 2009-05-26 17:05 二爷[未注册用户]
.net的??????????不要
 回复 引用   
#35楼 2009-06-10 21:47 cyanfang[未注册用户]
谢谢
 回复 引用 查看   
#36楼 2009-06-17 14:40 Ame      
学习了,谢谢
 回复 引用 查看   
#37楼 2009-06-29 23:35 Alone      
先睡觉了。明天继续看。子秋大人,能否深入研究?
这东西潜力无限啊。

 回复 引用   
#38楼 2009-07-07 15:55 hellojph[未注册用户]
长见识了
 回复 引用 查看   
#39楼 2009-07-21 12:07 细粒细      
谢谢博主的文章了,一直跟着学jQuery...

jQuery详解 的 load方面下面:

(net Date()).getTime() ??
(new Date()).getTime() ??

呵呵.

 回复 引用 查看   
#40楼 2009-08-14 07:30 DJ尐舞      
奇怪·发现这个源代码在IE8运行起来,所有AJAX的方法调用都不行:

比如:start.htm里面的两个按钮,点击都是这个错误
=======================================================


“/jQuery系列教程代码”应用程序中的服务器错误。
--------------------------------------------------------------------------------

HTTP 错误 404 - Not Found。

--------------------------------------------------------------------------------
版本信息: ASP.NET Development Server 9.0.0.0

=====================================================




发现在chrome下就没问题

 回复 引用   
#41楼 2009-08-24 16:46 .net初学者2[未注册用户]
你那个时间戳写错了 (net Date()).getTime() 应该是 (new Date()).getTime() 呵呵 小错误 看你的文章获益匪浅
 回复 引用 查看   
#42楼 2009-09-29 12:13 virus      
老兄,你看一下我的这段代码,目的是定时从webservice获取数据,如果有数据就变化字体颜色,没有就停止变换。是加到sharepoint的masterpage中的,可是没有运行,你帮我看看结构对不

<script>
function todayReminderColor(){

//变换颜色
}
var timerReminder;
var timerReminderColor;
function todayReminder(){
$.get("test.ashx",function(data){

if(data=="{contains:'true'}")
{
timerReminderColor=setInterval(" todayReminderColor()",500);
}else
{
clearTimeout(timerReminderColor);
}
});
}
$(document).ready(function(){
timerReminder=setInterval("todayReminder()",6000);
});
function stopTimer()
{
clearTimeout(timerReminder);
clearTimeout(timerReminderColor);
}

</script>

 回复 引用 查看   
#43楼 2009-10-08 19:59 传说中的祥哥      
在用.ajaxComplete时,如果引用jquery-1.3.2-vsdoc2.js版本,会出现“f is undefined”的错误,为什么啊!
 回复 引用 查看   
#44楼 2009-10-29 17:51 独修      
请楼主解决,楼主的例子只能IE6下运行正常。但是在IE7与IE8不正常!
感问jQuery不是支持不同版本的IE嘛

1-start.htm 中的

使用jQuery的load方法 修改第13行代
$("#divResult").load("../data/AjaxGetCityInfo.aspx", { "resultType": "html" });

改为
$("#divResult").load("http://www.baidu.com");
可看到效果;

 回复 引用 查看   
#45楼 2009-11-16 14:13 彦斌      
下载运行了1-start.htm
在IE8下是可以正常运行的。

但是使用jQuery的load方法感觉效率差很多。有明显的“加载”时间。
而原始Ajax调用,一下子就显示出结果。

是有这个情况吗?

 回复 引用 查看   
#46楼 2009-12-18 14:30 混世者      
辛苦辛苦,写了这么多,文章很好,表扬表扬
 回复 引用 查看   
#47楼 2010-05-03 00:47 Y2012      
写的真不错,我从这里学到了很多。
Jquery in action不知道为什么使用Jsp和Php做的后台,看到Ajax这一章就看不下去了,所以就转到你这里来了。

 回复 引用 查看   
#48楼 2010-05-25 11:22 冰の酷龙      
这一章讲解非常犀利,胜读一本书。
 回复 引用 查看   
#49楼 2010-07-06 17:14 _冻结_      
楼主辛苦了,
 回复 引用 查看   
#50楼 2010-07-09 21:25 木由水      
楼主可以出本书了
 回复 引用 查看   
#51楼 2010-09-18 16:23 xiao_huan_0606      
发现这个源代码在IE8运行起来,所有AJAX的方法调用都不行:在Mozilla Firefox 4.0 Beta 4下也不执行啊!是怎么一回事呢?

比如:start.htm里面的两个按钮,点击都是这个错误
=======================================================


“/jQuery系列教程代码”应用程序中的服务器错误。
--------------------------------------------------------------------------------

HTTP 错误 404 - Not Found。

--------------------------------------------------------------------------------
版本信息: ASP.NET Development Server 9.0.0.0

=====================================================

 回复 引用 查看   
#52楼 2010-12-15 14:03 悟空,跟着我唱      
来的好像还不算晚..顶你,张兄!!!
 回复 引用 查看   
#53楼 2011-02-24 10:53 cs_clinging      
mark!不错!谢谢
 回复 引用 查看   
#54楼 2011-04-12 10:03 finesite      
serialize()函数将要发送给服务器的form中的表单对象拼接成一个字符串. 便于我们使用Ajax发送时获取表单数据. 这和一个From按照Get方式提交时, 自动将表单对象的名/值放到url上提交差不多.

这句话太给力了! 谢谢 初入门jquery

 回复 引用   
#55楼 2011-04-28 17:46 ruler_kafei[未注册用户]
写的挺好,逻辑清晰,赞一个
 回复 引用 查看   
#56楼 2011-04-28 23:37 xiao_huan_0606      
写的很,首先看了你推荐的这本书,再回过头来看你写的文章感觉你的很详细,更进一步加深我的对这一章节的理解!顶你!
 回复 引用 查看   
#57楼 2011-07-03 17:27 目标RE      
好文要顶.
 回复 引用 查看   
#58楼 2011-07-28 15:36 曲达子      
我一向看了都不回复的,
但是这次我表示我也要顶下~
写的不错。

 回复 引用   
#59楼 2011-07-29 14:52 xyzmer[未注册用户]
看过好多遍了,感觉真不错
 回复 引用 查看   
#60楼 2011-09-19 17:51 蝶语山庄      
楼主 您好 我想问问为啥我的 都无法加载啊 页面 都没有反应 也不知道是什么错
 回复 引用 查看   
#61楼 2011-09-21 20:40 Wang_xiao_cheng      
楼主 你写的太好了 。。真的 你应该出本书啊
 回复 引用 查看   
#62楼 2011-11-29 19:40 灰色十一月      
我是jQuery的初学者,买了这本书,想得到源代码,可是从你博客下的源代码我不知道怎么打开使用?怎么是CS格式的?
 回复 引用 查看   
#63楼 2012-01-12 17:21 nd      
@技术拓荒者
楼上正解,

还有必须在vs里面点F5,才能看到结果,直接从IE里面打开这个html是会出现
错误:拒绝访问

这个是个什么道理,求楼主解释!!

 回复 引用 查看   
#64楼 2012-01-12 17:24 nd      
Attach to Process然后打开这个html也是不行的,必须F5 求解!!
 回复 引用 查看   
#65楼 2012-01-12 18:04 nd      
楼主把AjaxGetMethod.aspx代码贴出吧??多谢
 回复 引用 查看   
#66楼 2012-01-13 15:37 nd      
问下楼主
使用jQuery.getScript载入并执行JavaScript文件的时候,为什么没有按照顺序来执行呢?
$.getScript("getScript.js" , function(data,textStatus)
{
alert(this.url);
alert(data);
alert(textStatus);
alert("执行此JavaScript");
data;
});

会先执行最后一句data;,然后弹出URL,弹出语句,弹出状态,弹出:“执行此JavaScript”
不是这样调用data的么?

 回复 引用   
#67楼 2012-01-19 11:49 hejianbao1[未注册用户]
内容很全,原理解释的很清楚,顶起
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1452314 iHYjz+8/XLs=