ajax

1. ajax交互流程:

ajax数据交互流程

1、创建一个ajax对象
2、填写请求地址
3、发送请求
4、等待服务器响应
5、接收数据

1、创建一个ajax对象

var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
2、填写请求地址 3、发送请求
xmlhttp.open(method,url,async);
xmlhttp.send();
<pre>method:请求的类型;GET 或 POST
url:文件在服务器上的位置
async:true(异步)或 false(同步)</pre>

4、服务器响应
如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
responseText 获得字符串形式的响应数据。
responseXML 获得 XML 形式的响应数据。
如果来自服务器的响应并非 XML,请使用 responseText 属性。
如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性。

onreadystatechange 事件:
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。
下面是 XMLHttpRequest 对象的三个重要的属性:
1、onreadystatechange :存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
2、readyState:存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
3、status :
200: "OK" ;404: 未找到页面
当 readyState 等于 4 且状态为 200 时,表示响应已就绪:
<pre>xmlhttp.onreadystatechange=function()
{if (xmlhttp.readyState==4 && xmlhttp.status==200)
{document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}</pre>

<pre><script>
window.onload=function(){
var inputs=document.querySelectorAll("input");
inputs[2].onclick=function(){
var val=inputs[0].value;
//1、创建一个ajax对象
var ajax=new XMLHttpRequest;
//2、填写请求地址
ajax.open('get','php/get_json.php?user='+val,true);

                //3、发送请求
                ajax.send();
                //4、等待服务器响应
                ajax.onload=function(){
                    //5、接收数据
                    var span=document.querySelector("span");
                    //ajax请求过来的数据都是字符串,它不能用对象的操作方法 直接操作
                    //console.log(typeof ajax.responseText);            //string
                    
                    var result=JSON.parse(ajax.responseText);
                    //span.innerHTML=ajax.responseText;
                    
                    if(result.code==0){
                        alert('可以注册');
                    }else{
                        alert('请换一个');
                    }
                };
            };
        };
    </script>
</head>
<body>
    用户名:<input type="text" name="username" /><span></span>`<br /><br />`
    密码:<input type="password" name="password" />
    <input type="button" value="提交" />
</body></pre>               

2. get和post的区别

get方式:
1、通过地址栏信息进行数据传输,传输的大小有限制
2、不安全,用户的所有信息都会暴露出来
3、拼接数据的时候要用encodeURI转一下码,不然有中文就会乱码
4、不用设置请求头
5、数据拼接在open方法里
6、会有缓存问题
post方式:
1、通过send向服务器传输数据,理论上来说是没有长度或体积限制
2、相对来说安全,因为不直接暴露用户信息
3、不用转码,已经通过请求头设置了数据格式,不会有乱码
4、在send()的前面需要设置一个请求头(不设置要出错)
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
5、数据要拼接在send方法里
6、没有缓存问题

<pre><script>
window.onload=function(){
var inputs=document.getElementsByTagName("input");

            inputs[2].onclick=function(){
                //console.log(decodeURI('%E9%99%88%E5%AD%A6%E8%BE%89'))
                var val=inputs[0].value;
                
                //1、创建一个ajax对象
                var ajax=null;
                if(window.XMLHttpRequest){
                    ajax=new XMLHttpRequest;
                }else{
                    ajax=new ActiveXObject('Microsoft.XMLHTTP');
                }
                
                //2、填写请求地址
                ajax.open('get','php/get.php?user='+encodeURI(val),true);
                
                //ajax.open('post','php/post.php',true);
                //post发送请求的时候一定要在发送前设置一下请求头
                //ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                //ajax.send('user='+val);
                
                //3、发送请求
                ajax.send();
                
                //4、等待服务器响应
                ajax.onreadystatechange=function(){
                    //5、接收数据
                    var span=document.getElementsByTagName("span")[0];
                    span.innerHTML=ajax.responseText;
                };
            };
        };
    </script></pre>

3. onreadystatechange与onload

ajax.readyState AJAX运行步骤:
它的值为4的话说明AJAX已经运行完成
0 初始化 还没有调用open()方法
1 载入 已调用send()方法,正在发送请求
2 载入完成 send()方法完成,已收到全部响应内容
3 解析 正在解析响应内容
4 完成 响应内容解析完成,可以在客户端调用了
ajax.status服务器对请求的反馈(状态码),200就是成功的,404就是错误的。
onreadystatechange:
readyState的值发生改变时触发的事件,只要这个值有变化就会触发
onload:
所有请求成功完成后触发,此时readystate的值为4(IE678不支持)
(新的XMLHttpRequest不推荐用onreadystatechange,使用onload)

4. 封装ajax

<pre>
url 地址
method 请求方式get/post
dataType 返回什么数据类型srging/json/xml data 请求时候的传的数据(它是一个对象) succ 成功后的回调函数
fail 失败后的回调函数
function ajax(json){
var settings={
url:'',
method:'get',
data:{},
dataType:'json',
succ:function(){},
fail:function(){}
};

//用户传的参数覆盖默认参数
for(var attr in json){
    settings[attr]=json[attr];
}

//把数据拼成正确的格式
var arr=[];
for(var attr in settings.data){
    arr.push(attr+'='+settings.data[attr]);
}
settings.data=arr.join('&');

//声明一个ajax对象
var ajax=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');

//设置请求方式
if(settings.method.toLocaleLowerCase()==='get'){
    ajax.open(settings.method,settings.url+'?'+settings.data+'&'+new Date().getTime(),true);
    ajax.send();
}else{
    ajax.open(settings.method,settings.url,true);
    ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    ajax.send(settings.data);
}

//设置完成事件的兼容性
if(typeof ajax.onload==='undefined'){
    ajax.onreadystatechange=ready;
}else{
    ajax.onload=ready;
}

function ready(){
    if(ajax.readyState==4){
        if(ajax.status==200){
            switch(settings.dataType.toLocaleLowerCase()){
                case 'string':
                    settings.succ(ajax.responseText);
                    break;
                
                case 'json':
                    settings.succ(JSON.parse(ajax.responseText));
                    break;
                
                case 'xml':
                    settings.succ(ajax.responseXML);
            }
        }else{
            settings.fail(ajax.status);
        }
    }
};

}</pre>

5. 跨域

跨域:两个不同域名下的数据进行交互。Ajax之所以不能跨域其实是因为XMLHttpRequest受到同源策略的限制,只能让它访问同源下的数据,不能访问不同源下的数据

同源策略
每个网站只能读取同一来源的数据,这里的同一来源指的是主机名(域名)、协议(http/https)和端口号的组合。在没明确授权的情况下,不能读写对方的资源,它是浏览器最核心也最基本的安全功能
源:协议、端口、域名
只要不同源就跨域

协议
http 超文本协议
https HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比http协议安全
file 本地协议
ftp 文件共享协议

跨域解决办法
1、在标准浏览器下XMLHttpRequest配合后端设置一个请求权限
在php里写上 header('Access-Control-Allow-Origin:*');
这个是XMLHttpRequest 2级支持的,非标准浏览器不支持
2、服务器代理
服务器文件可以访问你想要的资源,而你又能访问服务器文件,所以你就可以访问想要的资源
缺点:如果想访问的资源需求有变,对于后端的开发成本就很大
3、iframe、flash、postMessage、WebSocket
http://www.freebuf.com/articles/web/65468.html

Jsonp:

ajax的核心是通过XmlHttpRequest获取非本页内容,
而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本
*带src属性的<script> < img > <iframe><link>等标签是不需要遵守同源策略的,但是通过src加载的资源,浏览器限制了javascript的权限,只能读不能写

*jsonp(json+padding)
1、通过script标签引入某些数据,是同步模式的,只有上面的代码加载完成才能继续加载下面的代码一般在用script标签做跨域的时候,不建议将数据提前加载,应该按需加载
2、当需要数据的时候创建一个script标签,将需要的数据放在src中,通过onload去监听是否请求过来,请求完毕就调用传回来的数据(异步加载)
3、jsonp不能用post请求只能用get方式请求

<pre><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button>点击1</button>
<button>点击2</button>
< ul >< /ul >
< ul >< /ul >
<script>
var buttons=document.querySelectorAll("button");
var uls=document.querySelectorAll("ul");

        buttons[0].onclick=function(){
            var script=document.createElement("script");
            script.src='http://localhost/php/jsonp_callBack.php?callback=fn1&num=number';
            document.getElementsByTagName('head')[0].appendChild(script);
        };
        
        function fn1(data){
            var str='';
            for(var i=0;i<data.length;i++){
                str+='<li>'+data[i]+'</li>';
            }
            
            uls[0].innerHTML=str;
        }
        buttons[1].onclick=function(){
            var script=document.createElement("script");
            script.src='http://localhost/php/jsonp_callBack.php?callback=fn2';
            document.getElementsByTagName('head')[0].appendChild(script);
        };
        function fn2(data){
            var str='';
            for(var i=0;i<data.length;i++){
                str+='<li>'+data[i]+'</li>';
            }
            uls[1].innerHTML=str;
        };
    </script>
</body>

</html>
</pre>

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

推荐阅读更多精彩内容

  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,159评论 0 7
  • 1. AJAX AJAX(Asynchronous JavaScript and XML),意思就是用JavaSc...
    公子七阅读 4,976评论 0 5
  • 原文出处 http://blog.poetries.top/2016/11/26/Ajax-summary 关注公...
    程序员poetry阅读 6,679评论 3 110
  • ajax作为前端开发必需的基础能力之一,你可能会使用它,但并不一定懂得其原理,以及更深入的服务器通信相关的知识。在...
    萧玄辞阅读 801评论 0 0
  • Ajax的基本概念及使用 同步&异步 同步:必须等待前面的任务完成,才能继续后面的任务; 异步:不受当前主要任务的...
    magic_pill阅读 1,934评论 0 5