[导读] 一 摘要本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍 本篇文章讲解如何使用jQuery方便快捷的实现Ajax功能 统一所有开发人员使
一.摘要
本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍.
本篇文章讲解如何使用jQuery方便快捷的实现Ajax功能.统一所有开发人员使用Ajax的方式.
二.前言
Ajax让用户页面丰富起来, 增强了用户体验. 使用Ajax是所有Web开发的必修课. 虽然Ajax技术并不复杂, 但是实现方式还是会因为每个开发人员的而有所差异.jQuery提供了一系列Ajax函数来帮助我们统一这种差异, 并且让调用Ajax更加简单.
三.原始Ajax与jQuery中的Ajax
首先通过实例, 来看一下jQuery实现Ajax有多简单. 下面是一个使用原始Ajax的示例:
01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02.
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
03.
<
head
>
04.
<
title
>jQuery Ajax</
title
>
05.
<
script
type
=
"text/javascript"
>
06.
$(function()
07.
{
08.
var xhr = new AjaxXmlHttpRequest();
09.
$("#btnAjaxOld").click(function(event)
10.
{
11.
var xhr = new AjaxXmlHttpRequest();
12.
xhr.onreadystatechange = function()
13.
{
14.
if (xhr.readyState == 4)
15.
{
16.
document.getElementById("divResult").innerHTML = xhr.responseText;
17.
}
18.
}
19.
xhr.open("GET", "data/AjaxGetCityInfo.aspx?resultType=html", true);
20.
xhr.send(null);
21.
});
22.
})
23.
24.
//跨浏览器获取XmlHttpRequest对象
25.
function AjaxXmlHttpRequest()
26.
{
27.
var xmlHttp;
28.
try
29.
{
30.
// Firefox, Opera 8.0+, Safari
31.
xmlHttp = new XMLHttpRequest();
32.
}
33.
catch (e)
34.
{
35.
36.
// Internet Explorer
37.
try
38.
{
39.
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
40.
}
41.
catch (e)
42.
{
43.
44.
try
45.
{
46.
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
47.
}
48.
catch (e)
49.
{
50.
alert("您的浏览器不支持AJAX!");
51.
return false;
52.
}
53.
}
54.
}
55.
return xmlHttp;
56.
}
57.
</
script
>
58.
59.
</
head
>
60.
<
body
>
61.
<
button
id
=
"btnAjaxOld"
>原始Ajax调用</
button
><
br
/>
62.
<
br
/>
63.
<
div
id
=
"divResult"
></
div
>
64.
</
body
>
65.
</
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函数, 我的页面变得简洁了:
01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02.
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
03.
<
head
>
04.
<
title
>jQuery Ajax</
title
>
05.
<
script
type
=
"text/javascript"
src
=
"scripts/jquery-1.3.2-vsdoc2.js"
></
script
>
06.
<
script
type
=
"text/javascript"
>
07.
$(function()
08.
{
09.
$("#btnAjaxJquery").click(function(event)
10.
{
11.
$("#divResult").load("data/AjaxGetCityInfo.aspx", { "resultType": "html" });
12.
});
13.
})
14.
</
script
>
15.
</
head
>
16.
<
body
>
17.
<
button
id
=
"btnAjaxJquery"
>使用jQuery的load方法</
button
>
18.
<
br
/>
19.
<
div
id
=
"divResult"
></
div
>
20.
</
body
>
21.
</
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函数, 但是使用具有局限性:
- 它主要用于直接返回HTML的Ajax接口
- load是一个jQuery包装集方法,需要在jQuery包装集上调用,并且会将返回的HTML加载到对象中, 即使设置了回调函数也还是会加载.
不过不可否认load接口设计巧妙并且使用简单.下面通过示例来演示Load接口的使用:
01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02.
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
03.
<
head
>
04.
<
title
>jQuery Ajax - Load</
title
>
05.
06.
<
script
type
=
"text/javascript"
src
=
"../scripts/jquery-1.3.2-vsdoc2.js"
></
script
>
07.
08.
<
script
type
=
"text/javascript"
>
09.
$(function()
10.
{
11.
$("#btnAjaxGet").click(function(event)
12.
{
13.
//发送Get请求
14.
$("#divResult").load("../data/AjaxGetMethod.aspx?param=btnAjaxGet_click" + "×tamp=" + (new Date()).getTime());
15.
});
16.
17.
$("#btnAjaxPost").click(function(event)
18.
{
19.
//发送Post请求
20.
$("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxPost_click" });
21.
});
22.
23.
$("#btnAjaxCallBack").click(function(event)
24.
{
25.
//发送Post请求, 返回后执行回调函数.
26.
$("#divResult").load("../data/AjaxGetMethod.aspx", { "param": "btnAjaxCallBack_click" }, function(responseText, textStatus, XMLHttpRequest)
27.
{
28.
responseText = " Add in the CallBack Function! <
br
/>" + responseText
29.
$("#divResult").html(responseText); //或者: $(this).html(responseText);
30.
});
31.
});
32.
33.
$("#btnAjaxFiltHtml").click(function(event)
34.
{
35.
//发送Get请求, 从结果中过滤掉 "鞍山" 这一项
36.
$("#divResult").load("../data/AjaxGetCityInfo.aspx?resultType=html" + "×tamp=" + (new Date()).getTime() + " ul>li:not(:contains('鞍山'))");
37.
});
38.
39.
})
40.
</
script
>
41.
42.
</
head
>
43.
<
body
>
44.
<
button
id
=
"btnAjaxGet"
>使用Load执行Get请求</
button
><
br
/>
45.
<
button
id
=
"btnAjaxPost"
>使用Load执行Post请求</
button
><
br
/>
46.
<
button
id
=
"btnAjaxCallBack"
>使用带有回调函数的Load方法</
button
><
br
/>
47.
<
button
id
=
"btnAjaxFiltHtml"
>使用selector过滤返回的HTML内容</
button
>
48.
<
br
/>
49.
<
div
id
=
"divResult"
></
div
>
50.
</
body
>
51.
</
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中删除:
01.
// Handle Script loading
02.
if
( !jsonp ) {
03.
var
done =
false
;
04.
05.
// Attach handlers for all browsers
06.
script.onload = script.onreadystatechange =
function
(){
07.
if
( !done && (!
this
.readyState ||
08.
this
.readyState ==
"loaded"
||
this
.readyState ==
"complete"
) ) {
09.
done =
true
;
10.
success();
11.
complete();
12.
13.
// Handle memory leak in IE
14.
script.onload = script.onreadystatechange =
null
;
15.
head.removeChild( script );
16.
}
17.
};
18.
}
我主要测试了此函数的跨域访问和多浏览器支持.下面是结果:
IE6 | FireFox | 注意事项 | |
非跨域引用js | 通过 | 通过 | 回调函数中的data和textStatus均可用 |
跨域引用js | 通过 | 通过 | 回调函数中的data和textStatus均为undifined |
下面是我关键的测试语句, 也用来演示如何使用getScript函数:
01.
$(
"#btnAjaxGetScript"
).click(
function
(event)
02.
{
03.
$.getScript(
"../scripts/getScript.js"
,
function
(data, textStatus)
04.
{
05.
alert(data);
06.
alert(textStatus);
07.
alert(
this
.url);
08.
});
09.
});
10.
11.
$(
"#btnAjaxGetScriptCross"
).click(
function
(event)
12.
{
13.
$.getScript(
"http://resource.elong.com/getScript.js"
,
function
(data, textStatus)
14.
{
15.
alert(data);
16.
alert(textStatus);
17.
alert(
this
.url);
18.
});
19.
});
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选项:
1.
$.ajaxSetup({
2.
url: "../data/AjaxGetMethod.aspx",
3.
data: { "param": "ziqiu.zhang" },
4.
global: false,
5.
type: "POST",
6.
success: function(data, textStatus) { $("#divResult").html(data); }
7.
});
上面的代码设置了一个Ajax请求需要的基本数据: 请求url, 参数, 请求类型, 成功后的回调函数.
此后我们可以使用无参数的get(), post()或者ajax()方法发送ajax请求.完整的示例代码如下:
01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02.
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
03.
<
head
>
04.
<
title
>jQuery Ajax - Load</
title
>
05.
06.
<
script
type
=
"text/javascript"
src
=
"../scripts/jquery-1.3.2-vsdoc2.js"
></
script
>
07.
08.
<
script
type
=
"text/javascript"
>
09.
$(document).ready(function()
10.
{
11.
$.ajaxSetup({
12.
url: "../data/AjaxGetMethod.aspx",
13.
data: { "param": "ziqiu.zhang" },
14.
global: false,
15.
type: "POST",
16.
success: function(data, textStatus) { $("#divResult").html(data); }
17.
});
18.
19.
$("#btnAjax").click(function(event) { $.ajax(); });
20.
$("#btnGet").click(function(event) { $.get(); });
21.
$("#btnPost").click(function(event) { $.post(); });
22.
$("#btnGet2").click(function(event) { $.get("../data/AjaxGetMethod.aspx",{ "param": "other" }); });
23.
24.
});
25.
26.
</
script
>
27.
28.
</
head
>
29.
<
body
>
30.
<
button
id
=
"btnAjax"
>不传递参数调用ajax()方法</
button
><
br
/>
31.
<
button
id
=
"btnGet"
>不传递参数调用get()方法</
button
><
br
/>
32.
<
button
id
=
"btnPost"
>不传递参数调用post()方法</
button
><
br
/>
33.
<
button
id
=
"btnGet2"
>传递参数调用get()方法, 使用全局的默认回调函数</
button
><
br
/>
34.
<
br
/>
35.
<
div
id
=
"divResult"
></
div
>
36.
</
body
>
37.
</
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上提交差不多.
比如这样一个表单:
生成的字符串为:single=Single¶m=Multiple¶m=Multiple3&check=check2&radio=radio1
提示:代码见 chapter6\7-serialize.htm
3.serializeArray( )
说明:
序列化表格元素 (类似 '.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 请求成功时执行函数 |
用一个示例讲解各个事件的触发顺序:
01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02.
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
03.
<
head
>
04.
<
title
>jQuery Ajax - AjaxEvent</
title
>
05.
06.
<
script
type
=
"text/javascript"
src
=
"../scripts/jquery-1.3.2.min.js"
></
script
>
07.
08.
<
script
type
=
"text/javascript"
>
09.
$(document).ready(function()
10.
{
11.
12.
$("#btnAjax").bind("click", function(event)
13.
{
14.
$.get("../data/AjaxGetMethod.aspx");
15.
})
16.
17.
$("#divResult").ajaxComplete(function(evt, request, settings) { $(this).append('<
div
>ajaxComplete</
div
>'); })
18.
$("#divResult").ajaxError(function(evt, request, settings) { $(this).append('<
div
>ajaxError</
div
>'); })
19.
$("#divResult").ajaxSend(function(evt, request, settings) { $(this).append('<
div
>ajaxSend</
div
>'); })
20.
$("#divResult").ajaxStart(function() { $(this).append('<
div
>ajaxStart</
div
>'); })
21.
$("#divResult").ajaxStop(function() { $(this).append('<
div
>ajaxStop</
div
>'); })
22.
$("#divResult").ajaxSuccess(function(evt, request, settings) { $(this).append('<
div
>ajaxSuccess</
div
>'); })
23.
24.
});
25.
26.
</
script
>
27.
28.
</
head
>
29.
<
body
>
30.
<
br
/><
button
id
=
"btnAjax"
>发送Ajax请求</
button
><
br
/>
31.
<
div
id
=
"divResult"
></
div
>
32.
</
body
>
33.
</
html
>
结果如图:
我们可以通过将默认options的global属性设置为false来取消全局Ajax事件的触发.
七.注意事项
如果在Get请求发送的url中有两个同名参数, 比如两个param参数:
http://localhost/AjaxGetMethod.aspx?param=Multiple¶m=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文件夹, 里面是本章的所有示例:
相关推荐
从零开始学习jQuery (一) ...从零开始学习jQuery (六) AJAX快餐 59 一.摘要 59 二.前言 59 三.原始Ajax与jQuery中的Ajax 59 四.jQuery Ajax详解 63 五.Ajax相关函数. 70 六.全局Ajax事件 74 七.注意事项 76 八.总结 76
《从零开始学习jQuery (六) AJAX快餐》深入讲解jQuery的Ajax功能,`.load()`、`.get()`和`.post()`等方法让数据交换变得简单易行,实现页面的无刷新更新。 九、jQueryUI常用功能实战 在《从零开始学习jQuery (十) ...
本系列教程将通过从零开始的学习路径,深入浅出地探讨jQuery的核心概念和技术。 1. **开天辟地入门篇**: jQuery的初识始于它的核心概念,包括如何引入jQuery库,以及使用 `$` 符号作为入口开始编写jQuery代码。这...
雷达驱动 rplidar-ros 与建图算法 hector-slam 资源包
内容概要:本文详细介绍了威纶通触摸屏与汇川SV660P伺服之间的Modbus RTU通讯实现方法,涵盖硬件接线、通讯参数配置、控制逻辑脚本编写以及状态监控等方面的内容。具体来说,文章首先讲解了硬件接线注意事项,如终端电阻设置和双绞线连接方式;接着深入探讨了通讯参数配置,包括波特率、数据位、停止位和校验方式等;然后展示了如何通过宏指令和Lua脚本实现正反转控制、速度设定等功能;最后讨论了状态监控部分,如母线电压和温度监测,并提供了相应的代码示例。此外,还分享了一些调试经验和常见问题解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对Modbus RTU通讯有一定了解的人群。 使用场景及目标:适用于需要通过触摸屏控制多台伺服电机并进行实时数据监控的场合,旨在帮助技术人员快速掌握具体的实现步骤和技巧,提高工作效率。 其他说明:文中提供的代码片段可以直接应用于实际项目中,但需要注意根据实际情况调整相关参数。同时,在调试过程中可能会遇到一些问题,如通讯不稳定或数据异常等,此时可以根据文中提到的经验进行排查和解决。
矢量边界,行政区域边界,精确到区县,可直接导入arcgis使用
内容概要:本文详细探讨了利用机器学习技术进行锂离子电池容量估计和健康状态预测的方法。首先介绍了充电数据的获取和预处理步骤,包括电压、电流、温度等多通道时序数据的采集和归一化处理。接着分别尝试了三种不同的神经网络模型:前馈神经网络(FNN)、卷积神经网络(CNN)和长短时记忆网络(LSTM),并分析了各自的优缺点。实验结果显示,FNN适用于结构化特征,CNN擅长捕捉局部模式,LSTM则在处理时序依赖方面表现出色。最终提出了一种融合模型,结合CNN和LSTM的优势,实现了更高的预测精度。此外,文中还讨论了数据预处理、模型优化以及实际应用中的注意事项。 适合人群:从事电池管理系统、机器学习、数据分析等相关领域的研究人员和技术人员。 使用场景及目标:①用于电池健康状态监测系统的设计与开发;②提高电池容量估计的准确性,延长设备使用寿命;③优化电池管理系统的性能,确保设备安全运行。 其他说明:文中提供了详细的代码示例,帮助读者更好地理解和复现实验结果。同时强调了数据预处理和特征工程的重要性,指出合理的数据处理方式能够显著提升模型的表现。
本研究利用Sen+MK方法分析了特定区域内的ET(蒸散发)趋势,重点评估了使用遥感数据的ET空间变化。该方法结合了Sen斜率估算器和Mann-Kendall(MK)检验,为评估长期趋势提供了稳健的框架,同时考虑了时间变化和统计显著性。 主要过程与结果: 1.ET趋势可视化:研究利用ET数据,通过ET-MK和ET趋势图展示了蒸散发在不同区域的空间和时间变化。这些图通过颜色渐变表示不同的ET水平及其趋势。 2.Mann-Kendall检验:应用MK检验来评估ET趋势的统计显著性。检验结果以二元分类图呈现,标明ET变化的显著性,帮助识别出有显著变化的区域。 3.重分类结果:通过重分类处理,将区域根据ET变化的显著性进行分类,从而聚焦于具有显著变化的区域。这一过程确保分析集中在具有实际意义的发现上。 4.最终输出:最终结果以栅格图和png图的形式呈现,支持各种应用,包括政策规划、水资源管理和土地利用变化分析,这些都是基于详细的时空分析。 ------------------------------------------------------------------- 文件夹构造: data文件夹:原始数据,支持分析的基础数据(MOD16A2H ET数据 宁夏部分)。 results文件夹:分析结果与可视化,展示研究成果。 Sen+MK_optimized.py:主分析脚本,适合批量数据处理和自动化分析。 Sen+MK.ipynb:Jupyter Notebook,复现可视化地图。
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!
内容概要:本文详细介绍了使用C#实现与三菱FX3U系列PLC基于以太网MC协议通信的客户端设计。首先,文中讲解了前期准备工作,如引入必要的网络通信库。接下来,深入探讨了关键代码,包括创建TCP连接、发送MC协议指令、构建命令帧、解析位元件状态等。此外,还提到了数据解析过程中的一些注意事项,如ASCII码转换和字节序处理。为了提高可靠性,实现了重试机制,采用指数退避算法应对网络波动。文中提供了开源的DLL文件,封装了所有协议细节,使调用方只需关注业务逻辑。同时,给出了打包好的安装包,便于快速部署。最后,强调了项目的实用性,展示了在工业自动化项目中的应用实例。 适合人群:从事工业自动化领域的研发人员,尤其是有一定C#编程基础并对PLC通信感兴趣的工程师。 使用场景及目标:适用于需要与三菱FX3U系列PLC进行以太网通信的工业自动化项目。主要目标是帮助开发者快速搭建稳定的通信客户端,减少重复开发的工作量,提升开发效率。 其他说明:项目已在GitHub上开源,包含详细的注释文档和应急调试手册,有助于开发者更好地理解和维护代码。
内容概要:本文详细介绍了基于Spring Boot框架构建的资源共享管理系统的用户端和管理端功能。用户端涵盖资源发布、评论、用户注册登录等功能,通过Spring MVC和Spring Security实现。管理端提供会员信息管理和资源信息管理等功能,采用Spring Data JPA、Redis、JPA Criteria API等技术实现动态查询和缓存优化。此外,文章还探讨了文件上传、异步通知、权限控制等具体技术实现细节,如使用UUID重命名文件、Redis存储关注关系、@Async实现异步任务等。 适合人群:具备一定Java开发经验,特别是熟悉Spring Boot框架的研发人员。 使用场景及目标:适用于需要构建资源共享管理系统的开发者,帮助他们理解和掌握Spring Boot在实际项目中的应用,包括前后端交互、安全管理、数据处理等方面的具体实现。 其他说明:文中提供了大量代码片段,展示了各个功能模块的具体实现方式,有助于读者深入理解Spring Boot的开发流程和技术细节。
少儿编程scratch项目源代码文件案例素材-海盗预告片.zip
内容概要:本文详细介绍了如何利用遗传算法(GA)和粒子群算法(PSO)对极限学习机(ELM)进行优化,以提高其预测性能。首先构建了一个基础ELM模型,然后分别实现了GA-ELM和PSO-ELM两个优化版本。文中不仅提供了完整的代码实现,还解释了各算法的工作原理及其在优化过程中所起的作用。通过实验对比,展示了不同优化方法在预测精度和收敛速度方面的差异,并给出了具体的应用建议。 适合人群:具有一定机器学习基础的研究人员和技术开发者,尤其是对进化算法和神经网络感兴趣的从业者。 使用场景及目标:适用于需要提升ELM预测能力的实际项目中,如金融预测、天气预报等领域。主要目标是通过引入GA和PSO优化ELM的连接权值与隐含层神经元阈值,从而获得更好的泛化能力和更高的预测准确性。 其他说明:文中提供的代码可以直接运行并用于测试不同的优化策略。对于特定应用,可以根据实际情况调整相关参数,如种群大小、最大迭代次数等。此外,作者还提到了一些调参技巧以及不同算法之间的优缺点对比,帮助读者更好地理解和应用这些优化方法。
内容概要:本文详细介绍了如何利用深度强化学习(特别是分布式近端策略优化,DPPO)来解决热电联产系统(CHP)中的经济调度难题。传统方法由于线性化处理,无法充分考虑设备之间的非线性关系,导致优化效果不佳。而采用马尔可夫决策过程(MDP)建模和DPPO算法,可以更好地适应复杂的调度环境,提高系统的经济性和效率。文中展示了具体的算法实现步骤,包括策略网络和价值网络的设计、训练过程以及最终的策略生成。此外,还讨论了实际应用中的挑战和解决方案,如设备安全限制、奖励函数设计等。 适合人群:从事热电联产系统研究的技术人员、研究人员以及对深度强化学习应用于工业控制系统感兴趣的开发者。 使用场景及目标:适用于需要优化热电联产系统经济调度的场合,旨在提高能源利用率、降低成本、提升系统响应速度。具体目标包括:① 实现高效的热电联产系统调度;② 提供快速响应机制以应对突发事件;③ 发现并利用非线性耦合效应带来的潜在效益。 其他说明:尽管深度强化学习带来了显著的优势,但在实际应用中仍需注意一些细节问题,如设备启停损耗、极端天气的影响等。通过不断迭代和优化,该方法有望在未来进一步改善能源领域的智能化水平。
内容概要:本文详细介绍了基于STM32F103C8T6的智能水位水温控制系统的设计与实现。系统集成了超声波模块用于精确测量水位,DS18B20传感器用于监测水温,并通过继电器控制水泵进行自动补水或排水。此外,系统还利用ESP8266将数据传输至阿里云,配合自定义的安卓APP实现远程监控和管理。文中不仅提供了详细的硬件搭建步骤,还分享了关键代码片段,如超声波模块的驱动、温度补偿算法以及水泵控制逻辑等。同时,作者针对调试过程中遇到的问题进行了深入探讨,提出了有效的解决方案。 适合人群:具有一定嵌入式开发经验的技术爱好者、电子工程师及物联网开发者。 使用场景及目标:适用于家庭鱼缸、农业灌溉等领域,旨在实现智能化的水位和水温管理,提高系统的可靠性和用户体验。 其他说明:文中提到的完整工程代码和PCB设计文件均已公开,方便读者进一步研究和改进。
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!
内容概要:本文详细介绍了使用Maxwell 16.0软件进行12槽11极永磁同步直线电机的仿真建模步骤和优化技巧。主要内容涵盖模型搭建、材料设置、网格划分、运动设置、激励源配置以及后处理分析等方面。文中提供了具体的参数设置和代码片段,帮助用户避免常见的错误并提高仿真效率。同时,针对可能出现的问题给出了详细的解决方案,如调整求解器参数、优化网格划分等。 适合人群:具有一定电磁仿真基础的技术人员,尤其是从事直线电机研究和开发的专业人士。 使用场景及目标:适用于需要精确仿真和优化永磁同步直线电机性能的研究项目,旨在降低推力波动、提高定位精度,并减少仿真时间和错误发生率。 其他说明:文中提到的一些技巧和经验来自于实际操作中的积累,能够有效提升仿真的稳定性和准确性。建议读者在实践中结合自身情况进行适当调整。
内容概要:本文详细介绍了基于LabVIEW的转子动平衡采集与分析系统的源码实现。该系统支持NI采集卡、串口采集卡及仿真信号源,涵盖了硬件配置、信号采集、数据处理、仿真功能、核心算法等多个方面。文中提供了具体的代码示例,如NI采集卡的模拟电压信号采集、串口采集卡的状态机处理、仿真信号生成等。此外,还讨论了滤波处理、动平衡计算方法、异常处理等内容,并分享了一些实践经验和技术细节。 适合人群:从事机械工程、自动化控制领域的工程师,尤其是那些需要进行转子动平衡采集与分析工作的技术人员。 使用场景及目标:适用于实验室研究、工业现场应用等多种场合,旨在帮助工程师实现高效稳定的转子动平衡数据采集与分析,优化机械设备性能,减少故障发生。 其他说明:文中提到的系统已经在实际工程项目中得到应用,经过长期测试和改进,能够应对复杂的工况环境。同时,作者也强调了在现场实施过程中需要注意的一些问题,如硬件接线、信号处理等。
少儿编程scratch项目源代码文件案例素材-厄运洞穴.zip
【云南省DEM(30米分辨率)】是一款地理信息数据产品,主要涵盖了云南省的地形高程信息。这款数据基于2019年8月5日发布的ASTER GDEM V3(Advanced Spaceborne Thermal Emission and Reflection Radiometer Global Digital Elevation Model Version 3)版本,是一个全球数字高程模型,提供的是30米的高分辨率。ASTER GDEM V3是通过日本航空航天探索局(JAXA)和美国国家航空航天局(NASA)合作的ASTER卫星获取的数据,它提供了全球范围内的高精度地表地形信息。 1. ASTER GDEM V3:ASTER GDEM V3是目前广泛使用的公开全球高程数据之一,其数据源自ASTER卫星的多光谱遥感图像。该数据集通过分析不同波段的反射和热发射来构建地表的三维模型,从而得出高程信息。V3版本是对之前版本的更新和改进,具有更高的数据质量和更少的错误。 2. GeoTIFF格式:这份数据采用GeoTIFF(Georeferenced Tagged Image File Format)格式,这是一种特殊的TIFF图像文件,包含了地理坐标系统信息。这意味着每张图像的每个像素都与地球表面的特定位置对应,方便在GIS软件中进行空间分析和地图制作。 3. WGS84坐标系:WGS84(World Geodetic System 1984)是全球最常用的地心地固坐标系统,广泛应用于GPS定位和其他全球导航系统。在云南省DEM数据中,使用WGS84坐标系可以确保与其他全球地理数据的一致性和兼容性。 4. DEM(Digital Elevation Model):DEM是一种表示地面高程信息的数字模型,由等间距的高程点构成,用于描述地表地形特征。它在地理信息系统