AJAX全称是 Asynchronous JavaScript and XML,翻译过来就是异步的 JavaScript 和 XML。XMLHttpRequest 对象是 AJAX 的基础。所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject,是浏览器的对象,而不是JS的,JS只是调用)。XMLHttpRequest 对象用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
AJAX的大致流程是:先实例化XMLHttpRequest对象,然后再向服务器发送请求(get或post),之后将数据提交给服务器,再之后就等待服务器相应,相应成功获取数据。
1、创建XMLHttpRequest实例化对象(如果是IE5或IE6,就实例化ActiveXObject对象)。
var xmlhttp;
if (window.XMLHttpRequest)
{// 兼容 IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// 兼容 IE6, IE5
xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
2、向服务器发送请求
xmlhttp.open(“GET”,”test1.txt”,true);
参数说明:open(method,url,async):method:请求的类型;GET 或 POST;url:文件在服务器上的位置;async:true(异步)或 false(同步)
3、提交数据
xmlhttp.send();
4、获取服务器相应
发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态,XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能。这类似于回调函数的做法。服务器返回的状态有两种:readyState和status。
readyState的值表示了当前请求的状态,onreadyStateChange事件是在readyState属性发生改变时触发的,在事件处理程序中可以根据readyState的值来进行不同的处理。 readyState有五种可取值0:尚未初始化,1:正在加载,2:加载完毕,3:正在处理;4:处理完毕。一旦readyState属性的值变成了4,就可以从服务器返回的响应数据进行访问了。
Status存储了服务器端返回的Http请求响应代码,它表示请求的处理结果,常见响应代码的含义如:200 请求成功;202 请求被接受但处理未完成;400 错误请求;404 请求资源未找到;500 内部服务器错误。
只有当readyState处理完毕,即值为四并且Status的值为200时,才能表示服务器准确相应,才能获取数据。
5、获取服务器数据
如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。responseText 获得字符串形式的响应数据。responseXML 获得 XML 形式的响应数据。
通过以上五步,就可以实现AJAX,代码整理出来就是:
var xmlhttp;
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
xmlhttp.open(“GET/POST”,url,true);
xmlhttp.send();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
}
}
}
下面说说GET和POST的区别。
GET跟POST并不是属于ajax的方法,而是HTTP协议里的。
HTTP请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
而GET和POST是最常用的。
Ajax中,用GET方式可传送简单数据,但大小一般限制在1KB下,数据追加到url中发送(http的header传送),也就是说,浏览器将各个表单字段元素及其数据按照URL参数的格式附加在请求行中的资源路径后面。另外最重要的一点是,它会被客户端的浏览器缓存起来,那么,别人就可以从浏览器的历史记录中,读取到此客户的数据,比如帐号和密码等。因此,在某些情况下,get方法会带来严重的安全性问题。当使用POST方式时,浏览器把各表单字段元素及其数据作为HTTP消息的实体内容发送给Web服务器,而不是作为URL地址的参数进行传递,使用POST方式传递的数据量要比使用GET方式传送的数据量大的多。
总之,GET方式传送数据量小,处理效率高,安全性低,会被缓存,而POST反之。
关于GET方法安全性:
因为GET方法提交的时候数据是追加到url中提交的,那么在我们知道数据文件如***.php的路径的情况下,就可以通过在url中设置相关的变量来获取数据了。
比如我们的ajax.php文件代码为:
<?php
header(“Content-Type:text/html; charset=UTF-8”) ;
$name=$_GET[‘name’];
$sex=$_GET[‘sex’];
if($name!=null&&$sex!=null){
echo “姓名:”.$name.” 性别:”.$sex;
}else{
echo ‘请求非法’;
}
?>
那么我们只要在url中输入ajax.php?name=bill&sex=man就可以访问了。
如果用post提交,就在url中添加参数就访问不到相关内容。确保了ajax.php文件基本的安全性。
这也只是最基本的安全保护,想要突破ajax的方法有很多,需要好好研究下ajax的安全性,在此先不多说。
使用get方式需要注意:
1 对于get请求(或凡涉及到url传递参数的),被传递的参数都要先经encodeURIComponent方法处理.例:var url = “update.php?username=” +encodeURIComponent(username) + “&content=” +encodeURIComponent
(content)+”&id=1″ ;
使用Post方式需注意:
1.设置header的Context-Type为application/x-www-form-urlencode确保服务器知道实体中有参数变量. 通常使用XmlHttpRequest对象的SetRequestHeader(“Context-Type”,”application/x-www- form-urlencoded;”)。例:
xmlHttp.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
2.参数是名/值一一对应的键值对,每对值用&号隔开.如 var name=abc&sex=man&age=18,注意var name=update.php?
abc&sex=man&age=18以及var name=?abc&sex=man&age=18的写法都是错误的;
3.参数在Send(参数)方法中发送,例: xmlHttp.send(name); 如果是get方式,直接 xmlHttp.send(null);
4.服务器端请求参数区分Get与Post。如果是get方式则$username = $_GET[“username”]; 如果是post方式,则$username = $_POST[“username”];
再来说说AJAX乱码问题。
AJAX产生乱码的原因:
1、xtmlhttp 返回的数据默认的字符编码是utf-8,如果客户端页面是gb2312或者其它编码数据就会产生乱码
2、post方法提交数据默认的字符编码是utf-8,如果服务器端是gb2312或其他编码数据就会产生乱码
解决办法有:
1、若客户端是gb2312编码,则在服务器指定输出流编码
2、服务器端和客户端都使用utf-8编码
gb2312:header(‘Content-Type:text/html;charset=GB2312’);
utf8:header(‘Content-Type:text/html;charset=utf-8’);
注意:如果你已经按上面的方法做了,还是返回乱码的话,检查你的方式是否为get,对于get请求(或凡涉及到url传递参数的),被传递的参数都要先经 encodeURIComponent方法处理.如果没有用encodeURIComponent处理的话,也会产生乱码.
未经允许不得转载:前端撸码笔记 » AJAX内容整理外加自己的解读