Ajax的实现和jQuery下的Ajax

什么是Ajax呢?

AJAX即“ A synchronous J avascriptAnd X ML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
AJAX = 异步 JavaScriptXML标准通用标记语言的子集)。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可 以在不重新加载整个网页的情况下,对网页的某部分进行更新
传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面。
request.open("GET","get.php",true);
request.send();

AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。只要有js基础,完全就可以学习ajax的实现。

实现Ajax使用的js中的XMLHttpRequest对象(这里我们简称:XHR),创建XHR对象:

var request;
		if(window.XMLHttpRequest) {
			request = new XMLHttpRequest(); //IE7+,Firefox,Chrome,Opera,Safari...
		} else {
			request = new ActiveXObject("Microsoft.XMLHTTP"); // IE6,IE5
		}

使用XHR对象发送get请求:

request.open("GET",true);
request.send();
这里是true表示进行异步请求。get请求发送数据可以将数据放在URL中。

使用XHR对象发送post请求:

request.open("POST","post.php",true);
		//一定要设置   以URL方式发送POST数据请求
		request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		request.send("name=小明&sex=男");

XHR取得响应:

responseText :获得字符串形式的响应数据

responseXML :获取XML形式的响应数据

status和statusText :以数字和文本形式返回HTTP状态码

getAllResponseHeader() :获取所有的响应报头

getResponseHeader() :查询响应中的某个字段的值

XHR对象需要监听响应是否返回?

readyState属性

0:请求未初始化,open还没有调用

1:服务器连接已建立,open已经调用了

2:请求已接受,也就是接收到头信息了

3:请求处理中,也就是接收到响应主体了

4:请求已完成,且响应已就绪,也就是响应完成了

现在我们关心的是readyState属性的值是否为4(即已响应),XHR对象提供了 onreadystatechange 方法监听readyState属性值的变化。使用如下:

var request = new XMLHttpRequest();
		request.open("GET",true);
		request.send();
		request.onreadystatechange = function() {
			if(request.readyState === 4 && request.status === 200) {
				//do something
				//可以使用request.responseText获取响应数据
			}
		}

案例1:

Demo.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Demo</title>
	<style>
		body,input,button,select,h1 {
			font-size: 30px;
			line-height: 1.8;
		}
	</style>
</head>
<body>
	<h1>员工查询</h1>
	<label>请输入员工编号:</label>
	<input type="text" id="keyword">
	<button id="search">查询</button>
	<p id="searchResult"></p>

	<h1>员工创建</h1>
	<label>请输入员工姓名:</label>
	<input type="text" id="staffName"><br/><br/>
	<label>请输入员工编号:</label>
	<input type="text" id="staffNumber"><br/><br/>
	<label>请选择员工性别:</label>
	<select id="staffSex">
		<option>男</option>
		<option>女</option>
	</select>
	<label>请输入员工职位:</label>
	<input type="text" id="staffJob">
	<button id="save">保存</button>
	<p id="createResult"></p>

	<script>
		document.getElementById("search").onclick = function() {
			//发送Ajax查询请求并处理
			var request = new XMLHttpRequest();
			request.open("GET","service.php?number=" + document.getElementById("keyword").value);
			request.send();
			request.onreadystatechange = function() {
				if(request.readyState === 4) {
					if(request.status === 200) {
						//判断请求是否成功
						document.getElementById("searchResult").innerHTML = request.responseText;
					} else {
						alert("发生错误:" + request.status);
					}
				}
			}
		}

		document.getElementById("save").onclick = function() {
			//发送Ajax请求并处理
			var request = new XMLHttpRequest();
			request.open("POST","service.php");

			//一定要设置   以URL方式发送数据请求
			request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			var data = "name=" + document.getElementById("staffName").value + "&number=" + document.getElementById("staffNumber").value + "&sex=" + document.getElementById("staffSex").value + "&job=" + document.getElementById("staffJob").value;
			request.send(data);
			request.onreadystatechange = function() {
				if(request.readyState === 4) {
					if(request.status === 200) {
						document.getElementById("createResult").innerHTML = request.responseText;
					} else {
						alert("发生错误:" + request.status);
					}
				}
			}
		}
	</script>
</body>
</html>

service.php

<?php 
	//设置页面内容是html编码格式是utf-8
	header("Content-Type: text/plain;charset=utf-8");
	//header("Content-Type: application/json;charset=utf-8");
	//header("Content-Type: text/xml;charset=utf-8");
	//header("Content-Type: text/html;charset=utf-8");
	//header("Content-Type: application/javascript;charset=utf-8");

	//定义一个多维数组,包含员工信息,每条员工信息为一个数组
	$staff = array(
		array("name" => "洪七","number" => "101","sex" => "男","job" => "总经理"),array("name" => "郭靖","number" => "102","job" => "开发工程师"),array("name" => "黄蓉","number" => "103","sex" => "女","job" => "产品经理")
		);

	//判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
	//$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
	//$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
	if($_SERVER["REQUEST_METHOD"] == "GET") {
		search();
	} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
		create();
	}

	//通过员工编号搜索员工
	function search() {
		//检查是否有员工编号的参数
		//isset检测变量是否设置;empty判断值为不为空
		//超全局变量 $_GET 和 $_POST 用于收集表单数据
		if(!isset($_GET["number"]) ||
			empty($_GET["number"])) {
			echo "参数错误";
			return;
		}
		//函数之外声明的变量拥有Global作用域,只能在函数以外进行访问
		//global关键词用于访问函数内的全局变量
		global $staff;
		//获取number参数
		$number = $_GET["number"];
		$result = "没有找到员工。";

		//遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
		foreach ($staff as $key=>$value) {
			if($value["number"] == $number) {
				$result = "找到员工:员工编号:".$value["number"].",员工姓名:".$value["name"].",员工性别:".$value["sex"].",员工职位:".$value["job"];
				break;
			}
		}
		echo $result;
	}

	//创建员工
	function create() {
		//判断信息是否填写完全
		if(!isset($_POST["name"]) ||
			empty($_POST["name"]) ||
			!isset($_POST["number"]) ||
			empty($_POST["number"]) ||
			!isset($_POST["sex"]) ||
			empty($_POST["sex"]) ||
			!isset($_POST["job"]) ||
			empty($_POST["job"])
			) {
			echo "参数错误,员工信息填写不全";
			return;
		}

		//获取POST表单数据并保存到数据库
		
		//提示保存成功
		echo "员工:".$_POST["name"]." 信息保存成功!";
	}
 ?>

改:服务器返回的是json数据

Demo2.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Demo2</title>
	<style>
		body,"service2.php?number=" + document.getElementById("keyword").value);
			request.send();
			request.onreadystatechange = function() {
				if(request.readyState === 4) {
					if(request.status === 200) {
						//判断请求是否成功
						
						var data = JSON.parse(request.responseText);
						if(data.success) {
							document.getElementById("searchResult").innerHTML = data.msg;
						} else {
							document.getElementById("searchResult").innerHTML = "出现错误:" + data.msg;
						}
						
					} else {
						alert("发生错误:" + request.status);
					}
				}
			}
		}

		document.getElementById("save").onclick = function() {
			//发送Ajax请求并处理
			var request = new XMLHttpRequest();
			request.open("POST","service2.php");

			//一定要设置   以URL方式发送POST数据请求
			request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			var data = "name=" + document.getElementById("staffName").value + "&number=" + document.getElementById("staffNumber").value + "&sex=" + document.getElementById("staffSex").value + "&job=" + document.getElementById("staffJob").value;
			request.send(data);
			request.onreadystatechange = function() {
				if(request.readyState === 4) {
					if(request.status === 200) {

						var data = JSON.parse(request.responseText);
						if(data.success) {
							document.getElementById("createResult").innerHTML = data.msg;
						} else {
							document.getElementById("createResult").innerHTML = "出现错误:" + data.msg;
						}
						
					} else {
						alert("发生错误:" + request.status);
					}
				}
			}
		}
	</script>
</body>
</html>

service2.php

<?php 
	//以json字符串进行返回
	//设置页面内容是html编码格式是utf-8
	//header("Content-Type: text/plain;charset=utf-8");
	header("Content-Type: application/json;charset=utf-8"); //好像不声明响应头为json字符串也没事,用默认响应头或上面的响应头即可(这可能是js接收json字符串可以直接解析的缘故,所以最好声明)
	//header("Content-Type: text/xml;charset=utf-8");
	//header("Content-Type: text/html;charset=utf-8");
	//header("Content-Type: application/javascript;charset=utf-8");

	//定义一个多维数组,包含员工信息,每条员工信息为一个数组
	$staff = array(
		array("name" => "洪七","job" => "产品经理")
		);

	//判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
	//$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
	//$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
	if($_SERVER["REQUEST_METHOD"] == "GET") {
		search();
	} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
		create();
	}

	//通过员工编号搜索员工
	function search() {
		//检查是否有员工编号的参数
		//isset检测变量是否设置;empty判断值为不为空
		//超全局变量 $_GET 和 $_POST 用于收集表单数据
		if(!isset($_GET["number"]) ||
			empty($_GET["number"])) {
			//echo "参数错误";
			echo '{"success":false,"msg":"参数错误"}';
			return;
		}
		//函数之外声明的变量拥有Global作用域,只能在函数以外进行访问
		//global关键词用于访问函数内的全局变量
		global $staff;
		//获取number参数
		$number = $_GET["number"];
		//$result = "没有找到员工。";
		$result = '{"success":false,"msg":"没有找到员工。"}';

		//遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
		foreach ($staff as $value) {
			if($value["number"] == $number) {
				//$result = "找到员工:员工编号:".$value["number"].",员工姓名:".$value["name"].",员工性别:".$value["sex"].",员工职位:".$value["job"];
				$result = '{"success":true,"msg":"找到员工:员工编号:'.$value["number"].',员工姓名:'.$value["name"].',员工性别:'.$value["sex"].',员工职位:'.$value["job"].'"}';
				break;
			}
		}
		echo $result;
	}

	//创建员工
	function create() {
		//判断信息是否填写完全
		if(!isset($_POST["name"]) ||
			empty($_POST["name"]) ||
			!isset($_POST["number"]) ||
			empty($_POST["number"]) ||
			!isset($_POST["sex"]) ||
			empty($_POST["sex"]) ||
			!isset($_POST["job"]) ||
			empty($_POST["job"])
			) {
			//echo "参数错误,员工信息填写不全";
			echo '{"success":false,"msg":"参数错误,员工信息填写不全"}';
			return;
		}

		//获取POST表单数据并保存到数据库
		
		//提示保存成功
		//echo "员工:".$_POST["name"]." 信息保存成功!";
		echo '{"success":true,"msg":"员工:'.$_POST["name"].'信息保存成功!"}';
	}
 ?>

用jQuery实现Ajax

jQuery.ajax([settings])

settings中参数解释:

type : 类型,“POST”或“GET”,默认为“GET”

url :发送请求的地址

data :是一个对象,连同请求发送到服务器的数据(一般用在POST请求中发送数据)

dataType :预期服务器返回的数据类型。如果不指定,jQuery将自动根据HTTP包MIME信息来只能判断,一般我们采用json格式,可以设置为“json”

success :是一个方法,请求成功后的回调函数。传入返回后的数据,以及包含成功代码的字符串

error :是一个方法,请求失败时调用此函数。传入XHR对象


使用jQuery中的$.ajax方法对上面的Demo进行修改:

Demo3.html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Demo3</title>
	<style>
		body,h1 {
			font-size: 30px;
			line-height: 1.8;
		}
	</style>
</head>
<body>
	<h1>员工查询</h1>
	<label>请输入员工编号:</label>
	<input type="text" id="keyword">
	<button id="search">查询</button>
	<p id="searchResult"></p>

	<h1>员工创建</h1>
	<label>请输入员工姓名:</label>
	<input type="text" id="staffName"><br/><br/>
	<label>请输入员工编号:</label>
	<input type="text" id="staffNumber"><br/><br/>
	<label>请选择员工性别:</label>
	<select id="staffSex">
		<option>男</option>
		<option>女</option>
	</select>
	<label>请输入员工职位:</label>
	<input type="text" id="staffJob">
	<button id="save">保存</button>
	<p id="createResult"></p>
	
	<script src="http://apps.bdimg.com/libs/jquery/1.11.1/jquery.js"></script>
	<script>
		$(document).ready(function() {
			$("#search").click(function() {
				$.ajax({
					type: "GET",url: "service2.php?number=" + $("#keyword").val(),dataType: "json",success: function(data) {
						if(data.success) {
							$("#searchResult").html(data.msg);
						} else {
							$("#searchResult").html(data.msg);
						}
					},error: function(jqXHR) {
						alert("发生错误:"+jqXHR.status);
					}
				});
			});

			$("#save").click(function() {
				$.ajax({
					type: "POST",url: "service2.php",data: {
						name: $("#staffName").val(),number: $("#staffNumber").val(),sex: $("#staffSex").val(),job: $("#staffJob").val()
					},success: function(data) {
						if(data.success) {
								$("#createResult").html(data.msg);
							} else {
								$("#createResult").html(data.msg);
							}
					},error: function(jqXHR) {
						alert("发生错误:" + jqXHR.status);
					}
				});
			});
		});
	</script>
</body>
</html>
此时服务器端的php文件仍用service2.php不用做修改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


$.AJAX()方法中的PROCESSDATA参数 在使用jQuery的$.ajax()方法的时候参数processData默认为true(该方法为jQuery独有的) 默认情况下会将发送的数据序列化以适应默认的内容类型application/x-www-form-urlencoded 如果想发送不
form表单提交的几种方式 表单提交方式一:直接利用form表单提交 html页面代码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot; /&gt; &lt;title&gt;Ins
文章浏览阅读1.3k次。AJAX的无刷新机制使得在注册系统中对于注册名称的检测能即时显示。常见的用户注册是用户输入用户名,后台程序检测数据库中用户名是否重复而做出注册的成功与失败之提示(当用户注册重名时将返回重新注册),或者稍微人性化一点就是在用户名文本框后添加一个检测按钮,让用户检测后再做注册。以上操作,对于用户体验方面来说是比较“差劲”的,一个很好的用户体验就是:当用户输入完注册用户名后,Web系统应能即时检查并即时_用户注册 实时异步检测
文章浏览阅读1.2k次。 本文将解释如何使用AJAX和JSON分析器在客户端和服务器之间创建复杂的JSON数据传输层。一、 引言毫无疑问,AJAX已经成为当今Web开发中一种强有力的用户交互技术,但是它的许多可能性应用仍然鲜为人知。在本文中,我们将来共同探讨如何 使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将_ajax技术可行性
文章浏览阅读2.2k次。/************************** 创建XMLHttpRequest对象 **************************/function CreateRequest(){ var xmlObj = null; try { xmlObj = new XMLHttpRequest(); } catch(e) {
文章浏览阅读3.7k次。在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖 掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有 空闲的对象,则使用此对象,否则将创建一个新的对象。下面是我最近写的一个简单的类:* XMLHttpReques_xmlhttprequest发送多个请求
文章浏览阅读3.1k次。Ajax 同一页面如何同时执行多个 XMLHTTP 呢,比如博客页,需要同时利用 Ajax 读取作者信息、文章信息、评论信息……我们的第一反应可能是创建多个全局 XMLHTTP 对象,但这并不现实。其实实现方式非常简单,就是给 onreadystatechange 对应的回调函数加上参数,以下代码是解决方案中一个函数中的一段代码。xmlhttp.open("GET", "ajax_proc_ajax响应多个mxl文件
文章浏览阅读1.5k次。数据岛指的是存在Html网页中的xml代码段,它在Html中形成了一个数据的集合,数据岛允许我们在Html网页中集成xml,对xml编写脚本.数据岛有它特有的形式,由标记xml开始,在开始标记中要有一个ID属性,用于指定该指定数据岛的名称。 (当然要以/xml结束).元素xml包含的内容就是xml代码。数据岛也分为2种:1)内嵌的数据岛形式2)外嵌的数据岛形式说了那么多废话,还_数据中岛计算模式
文章浏览阅读2.1k次。AJAX 流行之后,总想好好学习一下。但是众多的框架实在难以选择。说明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。刚开始学了 JQuqery, 众多的 $get(),...等等符号早已把我搞晕了。暂时就放弃了。后来学习 ASP.NET AJAX ,在微软的领导下,逐渐由服务器端转向客户端编程。 激起我客户端编程的兴趣,才想起学习一下了 Jquery. 随着WEB2._jquery ajax asp.net 认证
文章浏览阅读1.7k次。前段时间在用google map api的函数库的时候,发现里面的downloadUrl函数非常好用,所以自己写了一个。用腻了那些什么框架什么池,到头来发现越简单的东西越是适合我这种懒人。downloadUrl(url, callback, data);参数说明: url不用说了; callback是回调函数,函数调用的时候会有两个参数:data, responseCode,data就_xmlhttprequest downloadurl
文章浏览阅读956次。前些时间写了几篇关于XMLHTTP运用的实例.(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)近来看论坛上经常有人提问关于如何无刷新,自动更新数据.传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.我们可以让程序自动刷新.定时_后端xml怎么实现数据有救新增,没有就更新
文章浏览阅读3.3k次。 XMLHttpRequest调用XMLHttpRequest Call ●●●调用,回调,下载,抓取,实时,查询,远程通信(Remoting),远程通信脚本(RemoteScripting),同步,上传,XMLHttpRequest图6-2:XMLHttpRequest调用 目标故事Reta正在一个批发商网站上购买商品。每次她添加一个商品到购物车时,web站点发出_createxmlhttpre
文章浏览阅读1.3k次。function clearitem(){ var drp1 = document.getElementById("drp1"); while(drp1.options.length>0) { drp1.options.remove(0); } }//动态更改方法(根据城市代码取得该市商业区并添加到DropDownList中_dropdownlist根據動態變化
文章浏览阅读1.9k次。因為 Json.net 是有附原始碼的,他也附了單元測試的專案,底下是我額外增加的UnitTest,我的目標就是讓底下的測試可以pass,而且原來的Test 也要都能通過。 ValueTypeTest.csusing System;using NUnit.Framework;namespace Newtonsoft.Json.Test { [TestFixture] public cl_vb 無效的 json 基本型別
文章浏览阅读844次。利用XMLHTTP无刷新获取数据. 客户端和服务器端数据的交互有几种方法.1.提交,通过提交到服务器端.也称"有刷新"吧.2.通过XMLHTTP无刷新提交到服务器端,并返回数据.也称"无刷新"吧.利用XMLHTTP我们可以实现很多很强大的应用.这文章主要介绍它的一些简单的应用.附:因为XMLHTTP是IE5.0+支持的对象.所以你必须要有IE5.0+才能看到效果.client.htm_xmlhttp取源码没有更新
文章浏览阅读1.8k次。Json.Net 無法序列基本型別(string, int),Asp.Net Ajax 無法正確序列日期,AjaxPro序列出我不想要的_type字串 1. Json.Net 是我最常使用的序列/反序列json套件,標榜速度快,對於一對多關係的object 也都能正常運作, 己能滿足我平日的需要,但前幾天突然有個情況,我要序列的是一個泛型參數,該參數不一定是物object型別,有可能是st_token string in state start
文章浏览阅读1.3k次。转载自:http://www.cnblogs.com/JeffreyZhao/archive/2007/01/31/update_the_updatepanels_by_js.html众 所周知,UpdatePanel是通过Trigger来更新的。被设定为Trigger的控件在PostBack之后会被客户端所截获,并且使用 XMLHttpRequest对象发送内容,然后服务器端由ScriptMan_web.ui.updatepanel 和 updatepanel 的区别
文章浏览阅读1.9k次。有些时候,只是需要更新页面的一个部分甚至只是更新中间的几个数据却需要从服务器DOWN整个页面,导致各种资源的浪费。使用数据岛技术可以很好的解决这个问题:通过定时器或用户事件触发数据岛(XML对象)象服务器获取数据,在数据获取完成后,适时更新相关数据。示例HTML部分:http://localhost/WebService/LoadData/FeaturedService.asmx/GetScore_web数据岛
文章浏览阅读1k次。在页面上使用ActiveXObject的代价是很大的,如果我们的无刷新页面使用xmlhttp技术,我们或许需要频繁的建立xmlhttp对象,当然 我们也可以使用全局变量来cache一个xmlhttp对象实例。但是这样的方法适合于同步方式xmlhttp通信,而对于异步方式xmlhttp通信将 会出现问题。由于没有了进程的堵塞,用户可能再次调用同一个xmlhttp实例,如果这时前一个通信未完成,那么就
文章浏览阅读998次。 by Lokesh Dhakar 译: croc查看原文概要:Lightbox JS 是一个简单而又谦恭的用来把图片覆盖在当前页面上的脚本. 它能被快速安装并且运作于所有流行的浏览器.最新更新 Version 2.0 图片集: 分组相关的图片并且能轻松的导航它们 视觉特效: 奇特的自适应调整 向后兼容: yes! 点击这里查看实例_on lightbox 2 by lokesh dhakar