Ajax

0.什么是Ajax
1.php基础
2.表单提交
3.后端获取
4.使用Ajax
5.ajax在IE浏览器的使用问题:
6.GET封装
7.POST封装
8.POST和GET封装
9.向jQuery的ajax改进:传递参数顺序不受影响
10.Ajax.XML
11.Ajax.json
12.Ajax.cookie
13.cooki封装
14.hash
15.Ajax的限制及其解决方法

0.什么是Ajax
用脚本发起http请求与服务器进行交互,能够不重新加载页面的情况下,完成与服务器进行交互,Ajax可用于异步请求,这样的好处就是可以活动XMLhttpRequest对象获得服务器的数据,通过Dom操作将新的数据插入文档中,减少客户端等待的时间

1.php基础
$ 变量名
输出echo,不能打印对象,数组,字
定义数组:$arr = array(1,2,3,4) ,输出数组,对象,字典要用:printf_r($arr)

获取本地xml文件:file_get_contents(“xxxx.xml”)
切记:要加上$运行代码要在服务器对应文件夹。

2.表单提交
在要提交的input 加上个name,表示提交的内容

3.后端获取
POST请求:printf_r($_POST)
GET请求:printf_r($_GET)
上传文件:print_r($_FilES),
前端要加上: enctype:“multipart/form-data”,后端会将文件保存到临时路径
获取上传文件对应的字典:$fileInfo = $_FILES[‘input_Name’];
获取文件名称:$fileInfo [‘name’]
获取上传文件临时路径:$fileInfo [‘tmp_name’]
移动文件,保存被上传的文件:move_uploaded_file(file,newloc)//写路径拼接的时候用点. 若成功,则返回 true,否则返回 false。

上传大文件=>需要修改服务器的配置文件,再重启服务器。

4.使用Ajax:在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页。

(1)创建一个异步对象

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)设置请求方式和请求地址
GET:
xmlhttp.open(“GET”,“test1.txt”,true);

或者
POST:
xmlhttp.open(“POST”,“ajax_test.asp”,true);

(2.5)设置指定请求头部
xmlhttp.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);

(3)发送请求

GET:xmlhttp.send();
POST:xmlhttp.send("fname=Bill&lname=Gates");

(4)监听状态的变化onreadystatechange(xmlhttp的属性),判断状态码
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪

xmlhttp.onreadystatechange = function(ev2){
if(xmlhttp.readyState === 4){
//判断是否请求成功
if(xmlhttp.status >= 200 && xmlhttp.status <300 || xmlhttp.status  === 304)
   }else{
   }
}

(5)处理返回的结果

xmlhttp.onreadystatechange = function(ev2){
if(xmlhttp.readyState === 4){
//判断是否请求成功
if(xmlhttp.status >= 200 && xmlhttp.status >300 ||xmlhttp.status = 304)
  alert(xmlhttp.responseText)
   }else{
     ........
   }
}

5.ajax在IE浏览器的使用问题:
(1)创建异步对象:
老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:
(2)缓存问题:发送get请求,IE认为每一个url只有1个结果。如果url没被修改了,文件修改之后不会实时(解决方法:访问的文件url要加Math.random()||new Date().get\Time参数,保证每次请求的时候url都不一样)

6.GET封装
思路:解决ie兼容问题,超时问题,ulr不能出现中文问题,参数问题
在js文件中:

function objToString(obj){
        obj.t = new Date().getTime();
        var res = [];
        for(var key in obj){
            //解决中文问题encodeURIComponent
            res.push(encodeURIComponent(key)+"="+encodeURIComponent(obj[key]))
          }
          return res.join("&")
        }
        function ajax(url,obj,timeOut,success,error){
        //0.将对象转为字符串
        var str = objToString(obj)
        //1.创建异步对象
        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.设置请求方式和url
        xmlhttp.open("GET",url+"?"+str,true);
        //3.发送请求
           xmlhttp.send();

           //4.监听变化,判断请求成功与否
               xmlhttp.onreadystatechange = function(ev2){
            if(xmlhttp.readyState === 4){
            //响应清除定时器
            clearInterval(timer)
            //判断是否请求成功
            if(xmlhttp.status >= 200 && xmlhttp.status >300 ||xmlhttp.status == 304)
            //5.处理响应结果
             success(xmlhttp)
               }else{
                 error(xmlhttp)
               }
            }
            //判断外界传入的超时时间
            if(timeOut){
                console.log('中断请求');
                timer = setInterval(function(){
                    xmlhttp.abort();
                    clearInterval(timer)
                },timeOut)
            }
          }

7.POST封装
在js文件中:

 function objToString(obj){
            obj.t = new Date().getTime();
            var res = [];
            for(var key in obj){
                //解决中文问题encodeURIComponent
                res.push(encodeURIComponent(key)+"="+encodeURIComponent(obj[key]))
              }
              return res.join("&")
            }
            function ajax(url,obj,timeOut,success,error){
            //0.将对象转为字符串
            var str = objToString(obj)
            //1.创建异步对象
            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.设置请求方式和url
            xmlhttp.open("POST",url+str,true);
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

            //3.发送请求
               xmlhttp.send(str);
    
               //4.监听变化,判断请求成功与否
                   xmlhttp.onreadystatechange = function(ev2){
                if(xmlhttp.readyState === 4){
                //响应清除定时器
                clearInterval(timer)
                //判断是否请求成功
                if(xmlhttp.status >= 200 && xmlhttp.status >300 ||xmlhttp.status == 304)
                //5.处理响应结果
                 success(xmlhttp)
                   }else{
                     error(xmlhttp)
                   }
                }
                //判断外界传入的超时时间
                if(timeOut){
                    console.log('中断请求');
                    timer = setInterval(function(){
                        xmlhttp.abort();
                        clearInterval(timer)
                    },timeOut)
                }
              }

8.POST和GET封装

function objToString(obj) {
        obj.t = new Date().getTime();
        var res = [];
        for (var key in obj) {
            //解决中文问题encodeURIComponent
            res.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]))
        }
        return res.join("&")
    }

    function ajax(type, url, obj, timeOut, success, error) {
        //0.将对象转为字符串
        var str = objToString(obj)
        //1.创建异步对象
        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");
        }

        if (type.toLowerCase() == 'get') {
            //2.设置请求方式和url
            xmlhttp.open("GET", url + "?" + str, true);
            //3.发送请求
            xmlhttp.send();
        } else {
            //2.设置请求方式和url
            xmlhttp.open("POST", url + str, true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

            //3.发送请求
            xmlhttp.send(str);
        }

        //4.监听变化,判断请求成功与否
        xmlhttp.onreadystatechange = function (ev2) {
            if (xmlhttp.readyState === 4) {
                //响应清除定时器
                clearInterval(timer)
                //判断是否请求成功
                if (xmlhttp.status >= 200 && xmlhttp.status > 300 || xmlhttp.status == 304)
                    //5.处理响应结果
                    success(xmlhttp)
            } else {
                error(xmlhttp)
            }
        }
        //判断外界传入的超时时间
        if (timeOut) {
            console.log('中断请求');
            timer = setInterval(function () {
                xmlhttp.abort();
                clearInterval(timer)
            }, timeOut)
        }
    }

9.向jQuery的ajax改进:传递参数顺序不受影响
将传入的参数变为对象的形式

function objToString(data) {
        data.t = new Date().getTime();
        var res = [];
        for (var key in data) {
            //解决中文问题encodeURIComponent
            res.push(encodeURIComponent(key) + "=" + encodeURIComponent(data[key]))
        }
        return res.join("&")
    }
function ajax(option) {
    //0.将对象转为字符串
    var str = objToString(option.data)
    //1.创建异步对象
    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");
    }

    if (option.type.toLowerCase() === 'get') {
        //2.设置请求方式和url
        xmlhttp.open(option.type, option.url + "?" + str, true);
        //3.发送请求
        xmlhttp.send();
    } else {
        //2.设置请求方式和url
        xmlhttp.open(option.type, option.url + str, true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        //3.发送请求
        xmlhttp.send(str);
    }

    //4.监听变化,判断请求成功与否
    xmlhttp.onreadystatechange = function (ev2) {
        if (xmlhttp.readyState === 4) {
            //响应清除定时器
            clearInterval(timer)
            //判断是否请求成功
            if (xmlhttp.status >= 200 && xmlhttp.status > 300 || xmlhttp.status == 304)
                //5.处理响应结果
                option.success(xmlhttp)
        } else {
            option.error(xmlhttp)
        }
    }
    //判断外界传入的超时时间
    if (option.timeOut) {
        console.log('中断请求');
        timer = setInterval(function () {
            xmlhttp.abort();
            clearInterval(timer)
        }, option.timeOut)
    }
}

10.Ajax.XML
XML:可扩展的标记语言,
格式:开头=><?xml version ='1.0' encoding="UTF-8" ?>
什么标签都可以,数据必须写在双标签里面。

<name>dalin</name>   //name:dalin

后端返回xml文件:header(“content-type:text/xml;charset-utf-8”) //防止乱码,一定要写在顶部
echo file_get_contents(“xxx.xml”);
前端获取XML:console.log(xmlhttp.responseXML)
返回的是document:<name>dalin</name>,
和html拿内容一样。

11.Ajax.json
json:固定的数据格式,实际是字符串,体积小,传输快,用户体验好
格式:{“”:“”}
后端读取json文件:echo file_get_contents(“xxx.txt”);
前端拿json:var str = xml.responseText;
将拿到的字符串转 为对象:JSON.pase(str)
注意:在低版本浏览器不可以 用原生的json.pase.得下载json2.js进行转化

12.Ajax.cookie
session: 服务器的会话跟踪技术
cookie:客户端会话跟踪技术,作用:将网页中的数据保存在浏览器中,默认不会保留任何数据,
保存数据:document.cookie = "name = dalin "
获取cookie保存数据:document.cookie;
cookie的生命周期=>默认:一次会话结束,关闭浏览器就没有了,不然就是过期日期

设置过期日期:
var date = new Date();
date.setDate(date.getDate()+过期天数)
 document.cookie = "name=dalin;expires="+date.toGMTString()+";";

document.cookie = “name:12;age:22”;

作用范围:在同一浏览器,默认情况下,上一级不能访问、下一级路径可以访问
如果要所以级也可以访问的,在保存的时候路径要为根路径(“/”)
document.cookie= “name:dalin;path=/;”;

注意:
cookie默认不会保留任何数据,
不能一次性保存多个数据,
有不同的个数和大小限制(4kb)
不同浏览器cookie保存数据不一样;
在同一浏览器,默认情况下,上一级不能访问、下一级路径可以访问
域名级数不同,访问不到,需要设置domin=根域名

完整的保存cookie:document.cookie=“name:dalin;path:’/;domin=根域名;”;

13.cooki封装

//增加
function addCookie(key,value,timeOut,path,domain){
//预处理path=>获取当前路径
var lastIndex = window.location.pathname.lastIndexOf("/");
var currentPath = window.location.pathname.split(0,lastIndex);
path = path||currentPath;
console.log( path);

//预处理domain=>获取当前域名
domain = domain|| window.domain;

//预处理过timeout
if(!timeOut){
    document.cookie = key+'='+value+';path='+path+';domain='+domain+';'
}else{
    var date = new Date();
    date.setDate(date.getDate+timeOut);
    document.cookie = key+'='+value+';expires='+date.toGMTString()+';path='+path+';domain='+domain+';'
}

}
//删除
function delCookie(key,path){
addCookie(key,getCookie(key),-1,path)
}
//查询

function getCookie(key){
var cooArr = document.cookie.split(";");
cooArr.some(item=>{
var temp = item.split("=")
if(temp[0].trim() == key){
console.log(temp[1])
return
}
})
}

14.hash
设置hash:window.location.hash = ;
获取hash:window.location.hash.subString(1)

15.Ajax的限制及其解决方法
由于浏览器同源策略的规则,Ajax只能访问同个域中的接口
解决办法:(1)CORS:跨源资源共享,在服务端的响应报文中指定一个跨源首部(*或者指定源信息),绕过同源限制。
(2)JSONP:借助<sc/ript>特点:src熟悉能访问任何资源,不受同源限制,访问的资源写在js中,所以下载后自动执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值