15、JavaScript-Ajax

每天一句:因为有了因为,所以有了所以。既然已成既然,何必再说何必。

一、服务器搭建(php+apache)

http://www.php100.com/html/plugin/ser/2013/0905/91.html

二、什么是Ajax(阿贾克斯)

Asynchronous JavaScript and XML(异步JavaScript和XML,即用JavaScript异步形式去操作xml)

- 节省用户操作时间,提高用户体验,减少数据请求;
- 传输获取数据;
- 无需用户刷新,动态请求网络数据;

三、Ajax作用

异步获取数据,即是数据交互(通过ajax获取某一文本文件的内容);

四、Ajax过程

注: 如果直接以文件形式打开,是会出错的,所以一定要搭建服务器!!!

  • 创建对象XMLHttpRequest()
  • open()方法
  • send()
  • request.onreadystatechange = function(){}
// 1、打开浏览器
// 创建一个ajax对象 ( ie6以下new ActiveXObject(‘Microsoft.XMLHTTP’) )
var request = null;
if (window.XMLHttpRequest) {
    request = new XMLHttpRequest();
} else {
    request = new ActiveXObject('Microsoft.XMLHTTP');
}

  // 2、在地址栏输入地址
  /*open方法
     参数一: 打开方法  get/post
     参数二: 请求地址
     参数三: 是否异步 (true异步: 非阻塞 / false同步: 阻塞)
  */
  request.open('get', '00-笔记.rtf', true);

  // 3、提交请求(回车)
  request.send();

  // 4、等待服务器返回内容
  /**
  responseText: ajax请求返回的数据即存放在该属性下(都为字符串):
        readyState属性: 请求状态
        0: (初始化)还没有调用open()方法
        1: (载入)已调用send()方法,正在放请求
        2: (载入完成)send()方法完成,已收到全部响应内容
        3: (解析)正在解析响应
        4: (完成)响应内容解析完成,可以在客户端调用

        on readystate change: 当readyState改变的时触发
        
        status: 服务器状态,http状态码
         1字开头:  消息类
         2字开头: 成功类
         3字开头: 重定向类
         4字开头: 请求错误类
         5字开头: 服务器错误类
    */
request.onreadystatechange = function(){
        if(request.readyState == 4){
            if(request.status == 200){
                // 请求到数据,显示
                var oP = document.createElement('p');
                document.body.appendChild(oP);
                oP.innerHTML = request.responseText;
             } else {
                alert('错误了');
             }
        }
    }

五、同步、异步

  • 同步:小店吃饭,小店老板厨师都是一个人
程序中:如果程序在下载数据,UI界面就无法响应;
  • 异步:饭堂吃饭,收银台,打饭的,厨师,各自互不影响
程序中:异步下载数据和UI界面两个线程;

六、JOSN数据解析

  • JSON.parse()将一个符合JSON语法的字符串解析成一个对应类型的值或对象
  var dataSource = JSON.parse(request.responseText);

在线解析:
http://json.cn
http://tool.oschina.net/codeformat/json

七、get和post请求

在http协议中定义了8种http请求的方法(get/post/options/head/put/delete/trace/connect/patch),但通常都是get和post,即常说的使用http的get或post请求。

  • get/post请求是跟服务器进行交互的;

  • 参数:是传递给服务器的具体数据,例如登陆的账号密码;

  • get请求:在请求URL后面以 ? 的形式跟上发给服务器的参数,多个参数之间用&隔开,例如:http://10.0.8.8/sns/my/login.php?username=erfangdong&password=123456 【注:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB】

  // get请求,参数直接拼接到url中
  request.open('get', './07-data.php?user=123@qq.com&password=123321', true);
  request.send();
  • post请求:发给服务器的参数全部放在请求体(URL中看不到)中【注:post传递的数据量没有显示,这具体还得看服务器的处理能力】
  // 请求头,传输的数据类型(post默认是没有设置的)
  request.setRequestHeader('content-type','application/x-www-form-urlencoded');
  // 请求参数
  request.send('userName=EndEvent&age=30');
  • get和post区别
1、post请求 请求地址和参数分离,比get更加安全   get请求的参数 直接暴漏在外面 不安全(相对而言)
2、get请求只能获取服务器的数据(下载数据/提交参数) 不能上传文件,而post两者都可以
3、get请求在浏览器中字符串长度最大限制为1024,post没有限制

八、ajax的封装

/*
 * metchod: 请求方式
 * url: 请求地址
 * data: 请求参数
 * successFn: 请求成功执行的函数
 */
function ajax(method, url, data, successFn){}

九、相关问题

  • 缓存问题
    问题: 发送同样的请求,因为存在有缓存,即当服务器内容发生改变后,会导致获取不了最新的数据。
    解决: 在url的后面再添加一个随机数/时间戳(其实就保证每次发起的请求是不一样的),这即可保证每次获取的数据都是最新的,而不是缓存数据。
// 添加一个时间戳
ajax('get','05-getData.php','userName=EndEvent&age=18&'+new Date().getTime(), function(response){
    alert(response);
});

注: get有缓存问题,而post是没有缓存问题的;

  • 中文乱码问题
    问题: 如果参数中有中文,即会出现乱码问题。
    解决: 将中文进行编码处理encodeURI。
ajax('get','05-getData.php','userName=' + encodeURI('啦啦') + '&age=18&'+new Date().getTime(),function(response){
     alert(response);
  });

十、跨域访问问题(浏览器安全限制所导致)

源文件与访问文件,不是在同一个目录下的,或者访问其他服务器的内容,这即是跨域访问,但是对于ajax是不支持跨域访问的。

  解决跨域访问方法:
    1、通过代理(即类似前面中的,获取JSON数据,那么就需要在后台服务器的php这个代理,来实现跨域访问)
        操作: 每需要获取数据,都要后台服务器添加对应的操作,实用性不高;
  2、XHR2(XMLHttpRequest level2是HTML5提供的方法)
        问题: IE10以下都不支持;
  3、flash
        操作: 在服务器端需要一个crossdomain.xml跨域文件,这里有对应的白名单;
  4、JSONP(JSON with Padding)
        操作: 因为script标签是没有跨域问题的,是可以获取到数据的(例如网络获取jquery.js)

十一、JSONP(JSON with Padding)

  • 通过script标签获取到对应的数据(即是包含在html文件中了)
  • 问题: 请求回来的数据没有变量,使用不了
  • 解决:
    方式一: 可以给整体数据添加一个变量名(但这会有整体设计问题)
    方式二: 通过函数调用,给函数传递参数的方式将整体数据传递过去
    a、在资源加载之前定义一个函数,在函数中接收一个参数,在函数中即是获取数据后的操作;
    b、需要时,通过script标签加载对应的远程文件数据,当数据加载进来的后,就会调用前面定义好的函数,并且将数据当做上函数的参数传入;
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容