Web基础之Ajax

Ajax概述:

  • Ajax(Asynchronous JavaScript And Xml),异步的JavaScript和Xml。是一种用来改善用户体验的技术,其实质是利用浏览器内置的一个特殊对象(XMLHttpRequest,一般称之为Ajax对象)异步地(Ajax对象在向服务器发送请求时,浏览器并不会销毁当前页面,用户仍然可以对当前页面作其他的操作)向服务器发送请求,服务器送回部分数据(不是一个完整的新的页面,而是文本或者Xml文档),在浏览器端,可以利用这些数据部分更新当前页面。整个过程,页面无刷新,不打断用户的操作。
  • 优点:
  1. 页面无刷新,不打断用户的操作。
  2. 按需要获取数据,客户端(浏览器)与服务器端之间的数据传输量大大减少
  3. 是一种标准化的技术,不需要下载任何插件。
  • 获得Ajax对象:由于XMLHttpRequest(Ajax对象)没有标准化,所以要区分浏览器。
function getXhr(){
var xhr=null;
   if(window.XMLHttpRequest){
   xhr=new XMLHttpRequest();//非IE浏览器
}else{
   xhr=new ActiveXObject('Microsoft.XMLHttp');//IE浏览器
}
return xhr;
}

语句处理:

$(“id”) <—> document.getElementById(“id”);
$F(“id”) <—> document.getElementById(“id”).value;

  • Ajax对象属性:
    1)onreadystatechange:绑定一个事件处理函数(监听器),该函数用来处理readystatechange事件。Ajax对象的readyState属性发生改变,比如从0到1,则会产生onreadystatechange事件。
    2)responseText:获得服务器返回的文本数据。
    3)responseXML:获得服务器返回的Xml文档。
    4)status:获得状态码。
    5)readyStatue:返回Ajax对象与服务器通讯的状态,返回值是一个number类型的值。一共有5个值,分别是:
    ①0:(未初始化)对象已建立,但是尚未初始化(尚未调用open方法)。
    ②1:(初始化)对象已建立,尚未调用send方法。
    ③2:(发送数据)send方法已调用。
    ④3:(数据传送中)已接收部分数据。
    ⑤4:(响应结束)Ajax对象已经获得了服务器返回的所有的数据。
    if(xhr.readyState==4 && xhr.status == 200){…}
  • get请求:
    1)获得Ajax对象,比如:var xhr=getXhr();//调用之前定义的函数
    2)发送get请求:
    ① xhr.open(‘get’,check_username.do?username=chang&age=23,true);
    //参数依次为:请求方式、url、同步还是异步(true:异步,用户能对当前页面进行其他操作,不会销毁页面;false:同步,浏览器会锁定该页面,用户只能等待,不会销毁页面)
    ② xhr.onreadystatechange=func1();//绑定一个事件处理函数(监听器)
    ③ xhr.send(null);//送请求参数,因为参数已经写在了请求资源路径中,所以这里为null。
    ④事件处理函数func1():
    function f1(){
    if(xhr.readyState==4){
    var txt=xhr.responseText;
    dom操作……
    }
    }
  • post请求:

1)获得Ajax对象,比如:var xhr=getXhr();//调用之前定义的函数
2)使用Ajax对象发送post请求:
① xhr.open(“post”,”check.do”,true);//建立连接
② xhr.setRequestHeader(“content-type”,”application//x-www-form-urlencoded”);//发送一个content-type消息头, 必须设置
③ xhr.onreadystatechange=func1();//绑定一个事件处理函数(监听器)
④ xhr.send(“username=小红“);//发送请求参数
【注意:与get请求不同,请求参数要放到send方法里面;因为按照HTTP协议的要求,发送post请求时,应该发送一个content-type消息头,而Ajax对象在默认情况下,不会发送这个消息头,所以,需要调用setRequestHeader方法来添加。】
3)编写函数处理事件func1();

  • 乱码问题:
    1)get请求:
    —>乱码产生原因:IE浏览器内置的Ajax对象会使用“GBK”或“GB2312”对中文参数进行编码,而其他浏览器(Chrom、Firefox)内置的Ajax对象会使用“utf-8”对中文参数进行编码。服务器端,默认会使用“ISO-8859-1”去解码。因为编码与解码所使用的字符集(编码格式)不一致,所以,会出现乱码问题。
    —> 乱码解决:
    ① 设置服务器使用指定的字符集去解码。比如,可以修改Tomcat的server.xml配置(conf文件夹中),添加URIEncoding=“utf-8"(告诉服务器,对于所有的get请求,默认使用“utf-8”去解码),修改之后重新启动服务器。
    ② 使用encodeURI()函数(JS中内置函数)对请求地址进行编码。encodeURI()函数会使用“utf-8”进行编码。
xhr.open('get','check_username.do?username='+$F('username'),true);
var uir='check_username.do?username='+$F('username');
xhr.open('get',encodeURI(uri),true);

2)post请求:
—> 乱码产生原因:所有浏览器(一般指三大浏览器:Chrom、Firefox、IE)内置的Ajax对象都会使用“utf-8”对中文参数进行编码,而服务器默认情况下,会使用“ISO-8859-1”去解码。
【注意:Firefox特殊,本应是乱码,但能正常显示。通过截取消息头发现Firefox会在消息头中自动添加”charset=utf-8"。】
—> 乱码解决:服务器端添加:request.setCharacterEncoding("utf-8");

  • 缓存问题
    1)get请求:
    —> 缓存原因:IE浏览器(其他浏览器没这个问题)内置的Ajax对象会检查请求地址是否访问过,如果访问过,则不再向服务器发送请求。
    —> 解决方式:
    ① 在请求地址后面添加一个随机数,用于欺骗IE;如:xhr.open('get','getNumber.do?'+Math.random(),true);
    ② 使用post方式发请求。

【注意:】
1)href="javascript:;"相当于href="#",写成href="javascript:;"一般要和onclick事件一起使用,表示a元素不再指向一个地址,而是点击后触发一个事件。

  • 同步请求:
    1)什么是同步请求
    Ajax对象在向服务器发送请求时,浏览器会锁定当前页面,用户不能够对当前页面做任何的操作。
    2)如何发送同步请求
    open(请求方式,请求地址,false)
    3)优先使用异步,因为同步会影响性能,当服务器端处理比较慢的时候,浏览器会锁定当前页面(“假死”)。
    4)只有当客户端需要等待服务器的响应之后,才能继续向下执行时,应该使用同步。
    【注意:Firefox的某些版本(低版本,如3、4)对于同步的支持比较特殊:
    不能使用xhr.onreadystatechange来绑定一个事件处理函数,而应该在send方法执行之后,才调用xhr.responseText方法来获得服务器返回的数据。】

  • 跨域
    当协议、子域名、主域名、端口号中任意一个不相同时的接口访问即是跨域。
    javaScript出于安全考虑,不允许跨域调用其他页面的对象。如a.com下的js不能调用b.com下的js对象。
    *处理方法
    1)代理方式JSONP:需要与服务器端配合。
    —> 在服务器端的接口中添加jsonp;
    —> 在web端的ajax的参数:dataType:”jsonp”,jsonp:”callback自定义返回名”;
    2)在HTML5中已经提供了跨域支持。只需要在服务器添加header:”Access-Control-Allow”和“Access-Control-Allow-Methods:POST,GET”

博客地址:Web基础之Ajax

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容