同步与异步请求、混编、AJAX、原生AJAX封装

一、同步与异步请求

(1)前言

浏览器与服务器之间的通信基础是HTTP协议
用户通过网址或表单向服务器提交请求,服务器向浏览器发送相应的响应

如何通过点击能获取数据并展示在页面上?(不用AJAX)
1.混编模式
2.调用接口

如果不是异步请求会导致页面刷新

二、混编

(1)什么是混编?

服务端代码和客户端代码写在一起(php,jsp,asp,python)
  php                html

混编模式文件要使用后端语言所支持的格式

(2)脚本编程方式

php虽然是一门后端语言,但也是一门脚本语言,因为它是可以嵌入到html中进行编写的,这种编写的方式叫做脚本的编写方式

脚本:驱动HTML运用数据显示出来

(3)缺点

1.不好维护
2.前后端分类难

三、AJAX

(1)AJAX

AJAX:Asyncchronous JavaScript and XML 异步的JavaScript和XML

(2)历史

1999:IE5.0                   允许JS脚本向服务器单独发起HTTP请求的新功能
2004:Gmail                  推出异步邮件更新服务
2005:Google Map        异步更新地图服务
2005:AJAX                   被大厂公认命名
2006:W3C                    发布AJAX国际标准

(3)总结

AJAX是JavaScript脚本发起HTTP通信

JavaScript异步通信:请求服务器返回JSON/XML文档,前端从JSON/XML文档中提取数据,在不刷新整个网页的基础上,渲染到网页相应的位置

(4)获取XML数据的方式

<script type="text/javascript">
    $.ajax({
        url:"xxxx", 			 			 //数据url地址
        type:"GET", 			 			 //请求方式
        dataType:"XML", 				 //数据类型
        success:function(data){  //请求成功的回调函数
            var oList = document.getElementsByTagName('ul')[0];
            var res = data.getElementsByTagName('course'),
                id,
               cname,
               list = "";
           for(var i = 0; i < res.length; i++){
               id = res[i].getElementsByTagName('id')[0].innerHTML;
               cname = res[i].getElementsByTagName('cname')[0].innerHTML;
               list += "<li>" + cname + "</li>"
           }  
           oList.innerHTML = list;   
        }
    })
</script>

四、原生AJAX

(1)原生AJAX

原生XMLHttpRequest对象与ActiveX对象

作用: JS脚本发起HTTP请求必须通过XMLHttpRequest对象
           也是通过AJAX进行浏览器与服务器通信的接口
           不限于XML,可以发送任何格式的数据

XMLHttpRequest本身是一个js引擎内置的构造函数
所有XMLHttpRequest对象都需要被实例化 var xhr = new XMLHttpRequest();

兼容性: IE5/IE6使用ActiveX对象
var xhr = new ActiveXObject(‘Microsoft.XMLHTTP’);

var xhr;
if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
}else{
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
}

(2)open/send方法

open方法(发送设置)
参数列表
1.method:请求方式
2.url:请求发送的地址
3.async:true异步 false同步

send(发送请求)
参数
发送POST请求体数据用,GET不填写

(3)请求/响应状态

onreadystatechange事件: 挂载到XMLHttpRequest对象上的事件
readyState状态: 通过XMLHttpRequest对象发送HTTP请求的各阶段状态码(0-4)
status状态: 服务器响应的状态码(200 OK、404 未找到页面)

当readyState变化时,将触发onreadystatechange事件执行其回调函数

0:请求未初始化(还未建立请求)
1:服务器连接已建立(TCP连接已建立)
2:请求已接收(服务端已经接收到请求)
3:请求处理中(服务端正在处理请求)
4:请求已完成,且响应已就绪(响应已传达)

注意: readyState仅仅是针对请求的状态码,获取资源是否成功取决于status的状态(200 OK)

(4)接收数据

responseText:获取字符串数据
responseXML:获取XML数据

var xhr;
//兼容性 
if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
}else{
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
 
//配置请求 readyState=0
xhr.open('GET','http://localhost/network/class7/server/get_courses.php?status=1',true);
xhr.send();
//发送请求 readyState=1
xhr.onreadystatechange = function(){
  	//获取状态 readyState=2,3,4
    if(xhr.readyState ===4 && xhr.status === 200){
        console.log(Json.parse(xhr.responseText))
    }
}

(5)post与get的不同

  1. POST请求方式下,请求体数据要写在send参数里面(参数格式:‘a=1&b=2&c=3’)
  2. 需要设置Content-type: appliction/x-www-form-urlencoded的字段
    (设置请求头在.open()之后,.send之前)
xhr.open('POST','http://localhost/network/class7/server/get_courses.php',true);
xhr.setRequestHeader('Content-type', 'appliction/x-www-form-urlencoded');
xhr.send('status=1&flag=1');

POST请求方式必须设置这个头信息,目的是将请求体中的数据转换为键值对,这样后端接收到参数后才知道这是一个POST方式传来的数据

五、原生AJAX封装

(1)JQ三种请求方式

$.ajax({
    url:'xxx',
    type:'POST',
    dataType:'JSON',
    data:{
        status:1
    },
    sucess:function(){
        
    }
})
 
$.post('xxx',{status:1},function(){})
$.get('xxx?status=1',function(){})

(2)封装方式

方法一:老写法

var $ = {
    ajax:function(opt){

    },
     post:function(opt){

    },
     get:function(opt){

    },
}
$.xxx

方法二:模块写法

var $ = (function(){
    return {
        ajax:function(){
        
        },
      	post:function(){
        
        },
      	get:function(){
        
        }
    }
})();
$.xxx

(3)开始封装

var $ = (function(){
    //兼容性
    var o = window.XMLHttpRequest ? new XMLHttpRequest 
                                  : new ActiveXObject('Micorsoft.XMLHTTP');
    //错误处理
    if(!o){
        throw new Error('您的浏览器不支持发起异步')
    }
    //内部实现
    function _doAjax(opt){
        var opt = opt || {},
            type = (opt.type || 'GET').toUpperCase(),
            async = opt.async || true,
            url = opt.url,
            data = opt.data || null,
            error = opt.error || function(){},
            success= opt.success|| function(){},
            complete= opt.complete|| function(){};
        if(!url) {
         throw new Error('请填写URL')
        }
        o.open(type,url,async)
        //做get/post判断
        type === 'POST' && o.setRequestHeader('Content-type',
        'appliction/x-wwww-form-urlencoded');
        o.send(type === 'GET'? null : formatDatas(data));
        o.onreadystatechange = function(){
            if(o.readStatus === 4 && o.status === 200){
                sucess(JSON.parse(o.responseText));
            }
            if( o.status === 404){
                error();
            }
            complete();
        }
    }
    //处理参数的纯函数
    function formatDatas(obj){
        var str = '';
        for(var key in obj){
            str += key + '=' +obj[key] + '&';
        }
        //处理结尾&并返回
        return str.replace(/&$/, '');
    }                              
    return {
        ajax:function(opt){
            _doAjax(opt);
        },
        get:function(url,callback){
            _doAjax({
                type : 'GET',
                url: url,
                sucess: callback
            });
        },
        post:function(url,data,callback){
             _doAjax({
                type : 'POST',
                data: data,
                url: url,
                sucess: callback
            });
        }
    }
})()
调用:
$.ajax({
	type: 'POST',
  url: 'http://localhost/network/class7/server/get_courses.php',
  data: {
  	status: 1,
    flag: 2
  },
  success: function(data){
  	console.log(data)
  }
});

$.post('http://localhost/network/class7/server/get_courses.php', 
       {status: 1, flag: 2}, 
       function(data){console.log(data);}
      );

$.get('http://localhost/network/class7/server/get_courses.php?status=1&flag=2',  
       function(data){console.log(data);}
      );

如果引入了JQ,就肯定不能用$了,把$改成xhr就行了

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值