AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:

  • 无法使用缓存文件(更新服务器上的文件或数据库)
  • 向服务器发送大量数据(POST 没有数据量限制)
  • 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

异步 - True 或 False?

  • XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true
  • 不推荐使用 async=false,但是对于一些小型的请求,也是可以的。
  • 请记住,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。
  • 注意:当您使用 async=false 时,请不要编写 onreadystatechange 函数 —— 把代码放到 send() 语句后面即可

每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。
下面是 XMLHttpRequest 对象的三个重要的属性:

属性 描述
onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
status 200: "OK"
404: 未找到页面

1.直接使用Javascript的Ajax简单示例:

 function showCustomer(str)
{
var xmlhttp;
if (str=="")
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","getcustomer.asp?q="+str,true);
xmlhttp.send();
}

showCustomer() 函数执行以下任务:

  • 检查是否已选择某个客户
  • 创建 XMLHttpRequest 对象
  • 当服务器响应就绪时执行所创建的函数
  • 把请求发送到服务器上的文件
  • 请注意我们向 URL 添加了一个参数 q (带有输入域中的内容)

2. 使用javascript对Ajax封装

此处参考了Snandy的比较成熟完整的封装,包含了超时检查、异常处理、新API解析JSON的特性,推荐

 /*******************************************************************************************************
*
* 对创建xhr对象可能出现的异常进行了处理
*
* 出现异常后failure的第二个参数msg被赋值为create xhr failed
*
*******************************************************************************************************/ /**
*
* 1,执行基本ajax请求,返回XMLHttpRequest
* Ajax.request(url,{
* async 是否异步 true(默认)
* method 请求方式 POST or GET(默认)
* type 数据格式 text(默认) or xml or json
* encode 请求的编码 UTF-8(默认)
* timeout 请求超时时间 0(默认)
* data 请求参数 (字符串或json)
* success 请求成功后响应函数 参数为text,json,xml数据
* failure 请求失败后响应函数 参数为xmlHttp, msg, exp
* });
*
* 2,执行ajax请求,返回纯文本
* Ajax.text(url,{
* ...
* });
*
* 3,执行ajax请求,返回JSON
* Ajax.json(url,{
* ...
* });
*
* 4,执行ajax请求,返回XML
* Ajax.xml(url,{
* ...
* });
*/ Ajax =
function(){
function request(url,opt){
function fn(){}
opt = opt || {};
var async = opt.async !== false,
method = opt.method || 'GET',
type = opt.type || 'text',
encode = opt.encode || 'UTF-8',
timeout = opt.timeout || 0,
data = opt.data || null,
success = opt.success || fn,
failure = opt.failure || fn;
method = method.toUpperCase();
if(data && typeof data == 'object'){//对象转换成字符串键值对
data = _serialize(data);
}
if(method == 'GET' && data){
url += (url.indexOf('?') == -1 ? '?' : '&') + data;
data = null;
}
var xhr = function(){
try{
return new XMLHttpRequest();
}catch(e){
try{
return new ActiveXObject('Msxml2.XMLHTTP');
}catch(e){
try{
return new ActiveXObject('Microsoft.XMLHTTP');
}catch(e){
failure(null,'create xhr failed',e);
}
}
}
}();
if(!xhr){return;}
var isTimeout = false, timer;
if(async && timeout>0){
timer = setTimeout(function(){
xhr.abort();
isTimeout = true;
},timeout);
}
xhr.onreadystatechange = function(){
if (xhr.readyState == 4 && !isTimeout){
_onStateChange(xhr, type, success, failure);
clearTimeout(timer);
}else{}
};
xhr.open(method,url,async);
if(method == 'POST'){
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=' + encode);
}
xhr.send(data);
return xhr;
}
function _serialize(obj){
var a = [];
for(var k in obj){
var val = obj[k];
if(val.constructor == Array){
for(var i=0,len=val.length;i<len;i++){
a.push(k + '=' + encodeURIComponent(val[i]));
}
}else{
a.push(k + '=' + encodeURIComponent(val));
}
}
return a.join('&');
}
function _onStateChange(xhr,type,success,failure){
var s = xhr.status, result;
if(s>= 200 && s < 300){
switch(type){
case 'text':
result = xhr.responseText;
break;
case 'json':
result = function(str){
return (new Function('return ' + str))();
}(xhr.responseText);
break;
case 'xml':
result = xhr.responseXML;
break;
}
success(result);
}else if(s===0){
failure(xhr,'request timeout');
}else{
failure(xhr,xhr.status);
}
xhr = null;
}
return (function(){
var Ajax = {request:request}, types = ['text','json','xml'];
for(var i=0,len=types.length;i<len;i++){
Ajax[types[i]] = function(i){
return function(url,opt){
opt = opt || {};
opt.type = types[i];
return request(url,opt);
}
}(i);
}
return Ajax;
})();
}();

3. ASP.NET中的Ajax控件:

微软很贴心地为开发者封装了一套傻瓜化的Ajax控件,拖拖控件就可以实现Ajax

 <form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<p>
<asp:Label ID="lblNonAjax" runat="server" Text="No Ajax"></asp:Label>
</p>
<hr />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="lblText" runat="server"></asp:Label>
<p>
<asp:Button ID="btnAjax" runat="server" Text="Ajax Event"
onclick="btnAjax_Click"/>
<asp:Button ID="btnNonAjax" runat="server" Text="Post Black Event"
onclick="btnNonAjax_Click"/>
</p>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnNonAjax"/>
</Triggers>
</asp:UpdatePanel>
</div>
</form>

用法:

  ①一个页面只能有一个ScriptManager(脚本控制器)控件,并且放在其他Ajax控件的前面,它是ASP.NET Ajax的基础,用来处理页面上的所有Ajax组件以及页面局部更新,生成相应的客户端代理脚本

  ②在ScriptManager还可以设置超时处理、异常处理等属性,详见MSDN

  ③具体实现Ajax的部分放在UpdatePanel控件,可以在该控件里指定事件需要局部刷新还是整页刷新,默认是异步的局部刷新。如果要想实现整页刷新提交,像平时不用Ajax控件的效果,只需在<Triggers>标签里面指定<asp:PostBackTrigger ControlID="btnNonAjax" />,ControlID就是不需要异步提交的控件,如此指定后该控件的任何事件都是整页刷新提交

接下来是对应的页面后台代码:

 public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
//因为以下控件不在Update内,所以触发Ajax事件时无法对其进行更新
lblNonAjax.Text = "触发了回发事件!";
}
} protected void btnAjax_Click(object sender, EventArgs e)
{
this.lblText.Text = "这是一个Ajax事件的触发"; //Response.Write("<script>alert('这是一个Ajax事件的触发')</script>");
//触发AJAX事件,不能使用该方式或其他方式向页面输出,除非使用下面的方式 //触发的是UpdatePanel里的控件的事件,输出脚本必须使用以下方式
ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "ajaxScript", "alert('这是一个Ajax事件的触发');", true);
} protected void btnNonAjax_Click(object sender, EventArgs e)
{
this.lblText.Text = "这是一个页面回发刷新事件的触发";
Response.Write("<script>alert('这是一个页面回发刷新事件的触发')</script>");
}
}

注意:

  ①由于这种类似于拖控件的方式生成的HTML代码量巨大,不灵活也不好控制细节,故现在基本上较少采用了

  ②如果需要实现回调功能,可以使用ClientScriptManager.GetCallbackEventReference方法配合javascript实现,详见MSDN

4. JQuery 实现Ajax

4.1 jQuery.get()

语法:$(selector).get(url,data,success(response,status,xhr),dataType)

参数url是必须的,其他可选

示例:

 $.get("test.php", function(data){
alert("Data Loaded: " + data);
});

4.2 jQuery.post()

语法:jQuery.post(url,data,success(data, textStatus, jqXHR),dataType)

参数url是必须的,其他可选

示例:

 $.post("test.php", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
});

4.3 jQuery.ajax()

语法:jQuery.ajax([settings])

上面两个get()和post()方法都是ajax()方法的简化写法;参数settings是集合,可选

常用参数列表:(详见http://www.w3school.com.cn/jquery/ajax_ajax.asp

参数名 类型 描述
url String (默认值: 当前页地址)发送请求的地址。
type String (默认值: "GET")请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
timeout Number 设置请求超时时间(毫秒)。此设置将覆盖全局设置。
async Boolean (默认值: true)默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
beforeSend Function 发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。如果返回 false 可以取消本次 ajax 请求。
complete Function 请求完成后回调函数 (请求成功或失败之后均调用)。参数: XMLHttpRequest 对象和一个描述请求类型的字符串。 
data String 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。
dataType String

预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

  • "xml": 返回 XML 文档,可用 jQuery 处理。
  • "html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
  • "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
  • "json": 返回 JSON 数据 。
  • "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
  • "text": 返回纯文本字符串
success Function 请求成功后的回调函数。参数:由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。
error Function (默认值: 自动判断 (xml 或 html))请求失败时调用此函数。有以下三个参数:XMLHttpRequest 对象、错误信息、(可选)捕获的异常对象。如果发生了错误,错误信息(第二个参数)除了得到 null 之外,还可能是 "timeout", "error", "notmodified" 和 "parsererror"。
cache Boolean

(默认值: true,dataType 为 script 和 jsonp 时默认为 false)设置为 false 将不缓存此页面。

jQuery 1.2 新功能。

contentType String (默认值: "application/x-www-form-urlencoded")发送信息至服务器时内容编码类型。默认值适合大多数情况。如果你明确地传递了一个 content-type 给 $.ajax() 那么它必定会发送给服务器(即使没有数据要发送)。
global Boolean 是否触发全局 AJAX 事件。默认值: true。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 可用于控制不同的 Ajax 事件。
ifModified Boolean (默认值: false)仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。在 jQuery 1.4 中,它也会检查服务器指定的 'etag' 来确定数据没有被修改过。
processData Boolean (默认值: true)默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。

5. 总结:

方便实用选JQuery,性能优先选javascript封装。UpdatePanel?算了吧。。。

本文待补充

参考文档:

Ajax 基本封装

jQuery Ajax 实例 全解析

基于.NET三种Ajax技术的运用——原生js、ASP.NET Ajax和.NET回调技术

【整理】Ajax异步实现的几种方式总结的更多相关文章

  1. Java 异步编程的几种方式

    前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...

  2. 总结ASP.NET MVC视图页使用jQuery传递异步数据的几种方式

    在ASP.NET MVC的视图页向控制器传递异步数据,可能是数组,JavaScript对象,json,表单数据,等等. 关于数据,JavaScript对象有时候和json长得一模一样,有么有? var ...

  3. JavaScript处理异步请求的几种方式(取异步函数返回值)

    JavaScript处理异步的几种方式 Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个 ...

  4. ajax异步提交的两种方法

    第一种是原始的ajax,第二种是在jQuery中使用ajax.这是我为测试两种提交方法而写的一段代码. 1.struts.xml <package name="json" e ...

  5. Ajax请求数据的两种方式

    ajax 请求数据的两种方法,有需要的朋友可以参考下. 实现ajax 异步访问网络的方法有两个.第一个是原始的方法,第二个是利用jquery包的 原始的方法不用引入jquery包,只需在html中编写 ...

  6. java ajax返回 Json 的 几种方式

    原文:https://blog.csdn.net/qq_26289533/article/details/78749057 方式 1. : 自写代码转 Json 需要  HttpHttpServlet ...

  7. vue 异步提交php 两种方式传值

    1.首先要在php的入口文件写上一条代码,允许异步提交 header("ACCESS-CONTROL-ALLOW-ORIGIN:*"); 2.在vue有两种方式将数据异步提交到ph ...

  8. ajax异步请求的三种常见方式

    首先先介绍下ajax,ajax(ASynchronous JavaScript And XML)为异步的javascript和xml.所谓的异步和同步是指: 同步:客户端必须等待服务器的响应,在等待期 ...

  9. SpringMVC异步处理的 5 种方式

    作者:丁仪 来源:https://chengxuzhixin.com/blog/post/SpringMVC-yi-bu-chu-li-de-5-zhong-fang-shi.html 前段时间研究了 ...

随机推荐

  1. Java中的import

    有些人写了一阵子 Java,可是对于 Java的 package 跟 import 还是不太了解.很多人以为原始码 .java 文件中的 import 会让编译器把所 import 的程序通通写到编译 ...

  2. nyoj 43 24 Point game(dfs暴力)

    描述 There Point game. In .The expression mustn't have any other operator except plus,minus,multiply,d ...

  3. Python OpenGL学习(1): 环境配置及错误篇

    系统环境是:Ubuntu 14.04 个人首次接触OpenGL,学到哪就写到哪. 1.模块安装: sudo apt-get install python-openglpip install PyOpe ...

  4. [置顶] 深入浅出Spring(三) AOP详解

    上次的博文深入浅出Spring(二) IoC详解中,我为大家简单介绍了一下Spring框架核心内容中的IoC,接下来我们继续讲解另一个核心AOP(Aspect Oriented Programming ...

  5. mysql 主从不同步处理--数据库初始化

    问题处理借鉴至网上的内容 又一次做主从,全然同步 在主库新建一张表后.在slave 段发现数据没有同步过去. mysql version:5.6.10 os :rhel 5.6 解决过程例如以下: 1 ...

  6. 【LeetCode】 Populating Next Right Pointers in Each Node 全然二叉树

    题目:Populating Next Right Pointers in Each Node <span style="font-size:18px;">/* * Le ...

  7. Flash Recovery Area 的备份

    Flash Recovery Area 的备份 备份命令是Flash recovery Area,该命令是Oracle 10g以后才有的.10g引进了flash recovery area,同时在rm ...

  8. ZOJ 1530 - Find The Multiple

    Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal repr ...

  9. Servlet 浅谈(一)

    Servlet 的生命周期 类加载.实例化,init方法,service方法,destroy方法.关于这点,后面会有详细介绍. 什么是容器? 因为Servlet没有main方法,所以它受控于另一个Ja ...

  10. spring集成mongodb jar包版本问题

    在开发过程中,spring集成mongodb的jar包. 如果需要使用排序功能. spring-data-mongodb-1.4.1.RELEASE.jar 的版本为1.4.1,如果使用如下代码: Q ...