以前公司的ajax学习分享,作一点总结,加深记忆php
异步的的js和xml,用js异步形式操做xml,工做主要是数据交互html
oBtn.onclick = function () { // 打开浏览器 var xhr = new XMLHttpRequest(); // 打开地址 xhr.open('get', './1.txt', true); // 提交 xhr.send(); // 等待服务器返回内容 xhr.onreadystatechange = function () { if(xhr.readyState === 4) { alert(xhr.responseText); } } }
不兼容ie6一下,须要写判断 window.XMLHttpRequestajax
try { } catch(e) { } // 代码尝试执行这个`try`块中的内容,若是有错误,则会执行catch{}不会影响程序执行
xhr = new XMLHttpRequest();
参数 打开的方式,数据地址,是否异步json
异步: 非阻塞 前面的代码不会影响后面代码的执行 setTimeout true 通常用异步的形式
同步: 阻塞 当前面的工做没有作完,后面会阻塞 好比jq库的加载 false 后续的内容须要前面挂钩,后端
action: 数据提交的地址,默认的当前页面
method: 数据提交的方式,默认get方式跨域
get
把数据名称和数据值用=链接,若是有多个数据,会用&进行链接,而后把数据放到url?后面
不要经过get传递过多的数据,数据多少根据各个浏览器决定浏览器
post
数据在请求头,发送数据是串联形式,可是位置不同,理论上没有限制
enctype: 提交的数据格式,默认application/x-www-form-urlencoded
须要在表格中 method="post"
缓存
get请求和post通常用于何种需求安全
get 方式的历史记录会被记录,影响用户隐私,不太安全,只能传字符串服务器
post 经过请求头,能够用于多种数据类型
怎么获得ajax 返回的数据
xhr.responseText
: 返回的数据会放在这个属性,类型是字符串类型
readyState
: ajax工做状态 0 1 2 3 4
xhr.send()
onreadychange
当状态值改变的时候触发
xhr.onreadystatechange = function() { if(xhr.readyState = 4) { // code } }
请求资源的时候,服务器会返回一个状态值
能够作更好的容错处理
xhr.onreadystatechange = function() { if(xhr.readyState = 4) { if(xhr.status === 200) { // 请求正确 } else { alert('error'); } } }
var oBtn = document.getElementById('btn'); oBtn.onclick = function () { var xhr = new XMLHttpRequest(); xhr.open('get','form.get.php?username=may&age=30',true); xhr.send(); xhr.onreadystatechange = function () { if(xhr.readyState === 4) { if (xhr.status === 200) { alert(xhr.responseText) } else { alert('error') } } } }
注意:
1 若是不想存在缓存问题 能够给请求后面加随机数或者时间戳
xhr.open('get','form.get.php?username=may&age=30&' + new Date(),true);
2 中文乱码问题,能够用编码 encodeURI
xhr.open('get','form.get.php?username='+encodeURI('文件') +'&age=30&' + new Date(),true);
数据做为参数放在send方法里面,而且设置请求头
var oBtn = document.getElementById('btn'); oBtn.onclick = function (){ var xhr = new XMLHttpRequest(); xhr.open('post', 'form.post.php', true); xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); // 须要告诉后端发送数据的类型 xhr.send('username=may&age=30'); xhr.onreadystatechange = function () { if(xhr.readyState === 4) { if(xhr.status = 200) { alert(xhr.responseText); } } } }
post没有缓存问题,它自己就是提交数据
post没有转码的问题
var oBtn = document.getElementById('btn'); var oul = document.getElementById('ul'); oBtn.onclick = function () { var xhr = new XMLHttpRequest(); xhr.open('get', 'getNew.php', true); xhr.send(); xhr.onreadystatechange = function () { if(xhr.readyState === 4) { if(xhr.status === 200) { var data = JSON.parse(xhr.responseText); var html = ''; for (var i = 0; i < data.length; i++) { html += '<li><a href="">' + data[i].title + '</a><span>' + data[i].date+ '</span></li>' } oul.innerHTML = html; } } } }
计算最短的li的高度 + top值 < 可视区的高度 + 滚动条的高度 document.documentElement.scrollTop || document.body.scrollTop
数据加载完的时候
应该对每次取到的数据进行判断,若是没有数据, return 出去
后端传值宽高 若是宽度肯定 200 高度就是
element.height * (200/element.width) document.createElement('li');
一个域名的文件去请求和它不同的域名下的资源文件,就会产生跨域请求
浏览器由于安全问题不容许跨域请求,能够采用
从另外的域名,把资源拿取过来
在资源加载进来以前定义好一个函数,这个函数接收一个参数(数据),函数利用这个参数作一些事情
而后须要的时候经过script标签加载对应远程文件资源,当远程的问价资源被加载进来的时候,就会去执行咱们前面定义好的函数,而且把数据当作这个函数的参数传入进来
若是想实现按需加载,好比当用户点击的时候?
当用户点击的时候建立 script
标签,加载到 body
标签后面,从而实现按需加载