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中,所以下载后自动执行