学习ajax总结
之前公司的ajax学习分享,做一点总结,加深记忆
什么是ajax?
异步的的js和xml,用js异步形式操作xml,工作主要是数据交互
- 借阅用户操作时间,减少数据请求,可以无刷新请求数据
创建一个对象
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.XMLHttpRequest
try {
} catch(e) {
}
// 代码尝试执行这个`try`块中的内容,如果有错误,则会执行catch{}不会影响程序执行
xhr = new XMLHttpRequest();
open 方法
参数 打开的方式,数据地址,是否异步
异步: 非阻塞 前面的代码不会影响后面代码的执行 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
- 0 初始化
- 1 调用
xhr.send() - 2 载入完成,请求已经发送,收到响应内容
- 3 解析 正在解析内容
- 4 解析完成
onreadychange 当状态值改变的时候触发
xhr.onreadystatechange = function() {
if(xhr.readyState = 4) {
// code
}
}
请求资源的时候,服务器会返回一个状态值
- 1 代表消息
- 2 成功类型
- 3 重定向 调到其他页面,缓存就是一种重定向
- 4 错误
- 5 服务器性错误
可以做更好的容错处理
xhr.onreadystatechange = function() {
if(xhr.readyState = 4) {
if(xhr.status === 200) {
// 请求正确
} else {
alert('error');
}
}
}
请求的处理
- get 请求文件,传输数据
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);
- post 方式请求文件
数据作为参数放在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没有转码的问题
数据获取的问题
- JSON.stringify(arr): 可以把一个对象转成对应字符串
- JSON.parse(str); key值必须是双引号才可以转为json
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;
}
}
}
}
瀑布流展示demo
瀑布流布局需求
- 每次最短的li,然后添加位置
- 需要知道图片的高度,否则图片加载还没有加载完成,就会自动计算那一列最短而去添加。可以有两种解决方案
- 拉到最底下加载
计算最短的li的高度 + top值 < 可视区的高度 + 滚动条的高度 document.documentElement.scrollTop || document.body.scrollTop
- 往下拉, 不仅仅加载一次,可能会触发 第二页 第三页,可以设置个标识位
数据加载完的时候
应该对每次取到的数据进行判断,如果没有数据, return 出去
后端传值宽高 如果宽度确定 200 高度就是
element.height * (200/element.width)
document.createElement('li');
- 预加载
跨域解决
一个域名的文件去请求和它不一样的域名下的资源文件,就会产生跨域请求
浏览器因为安全问题不允许跨域请求,可以采用
- 通过本地代理 本地建立一个代理,这个代理请求服务器,需要资源的时候,在请求服务器
- 通过flash flash请求资源,服务器端有xml文件,里面存一些资源域名,如果能找到允许你访问
- 通过jsonp (json with Padding)
从另外的域名,把资源拿取过来
- script标签, 可以加载.js以外的文件类型吗?文件的后缀名是辨识的不是文件类型决定, 跟根据文件里面的实质内容。只认内容,不认文件名字
- 用script标签加载资源没有跨域问题
在资源加载进来之前定义好一个函数,这个函数接收一个参数(数据),函数利用这个参数做一些事情
然后需要的时候通过script标签加载对应远程文件资源,当远程的问价资源被加载进来的时候,就会去执行我们前面定义好的函数,并且把数据当做这个函数的参数传入进来
如果想实现按需加载,比如当用户点击的时候?
当用户点击的时候创建 script 标签,加载到 body标签后面,从而实现按需加载
学习ajax总结的更多相关文章
- 学无止境,学习AJAX,跨域(三)
学习AJAX其实有个很重要的应用,就是为了执行另外几个站点的ASP,返回结果. 真正用起来,发现2个问题,>_> 不许笑,一向做DELPHI,接触ASP不多的我,的确问题大堆. 第一个问题 ...
- 由浅入深学习ajax跨域(JSONP)问题
什么是跨域?说直白点就是获取别人网站上的内容.但这么说貌似又有点混淆,因为通常我们用ajax+php就可以获取别人网站的内容,来看下面这个例子. 来看看跨域的例子,jquery+ajax是不能跨域请求 ...
- 学无止境,学习AJAX(一)
什么是AJAX?异步JavaScript和XML. AJAX是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的 ...
- 学习Ajax小结
Ajax 学习 1.ajax的概念 局部刷新技术,不是一门新技术,是多种技术的组合,是浏览器端技术 2.作用 可以实现 ...
- 学习ajax 总结
一.服务器客户端基础知识 通信是指不同计算机程序的通信,单单通过ip地址就能知道你找的是哪一台计算机,但是不知道是计算机上的哪个应用程序,要想知道是哪个程序就必须通过端口.这时候就可以问端口到底是什么 ...
- 学无止境,学习AJAX(二)
POST 请求 一个简单 POST 请求: xmlhttp.open("POST","demo_post.asp",true); xmlhttp.send(); ...
- 学习Ajax
1.XHR对象 IE7+.Firefox.Opera.Chrome和Safari都支持原生XMLHttpRequest对象,IE6不支持,只支持ActiveXObject对象,该对象在IE11中已经不 ...
- 对学习Ajax的知识总结
1.对Ajax的初步认识 1.1. Ajax 是一种网页开发技术,(Asynchronous Javascript + XML)异步 JavaScript 和 XML: 1.2.Ajax 是异步交互, ...
- [Django学习]Ajax访问静态页面
Web开发中常用的一种开发方式是:通过Ajax进行系统的交互,采用Ajax进行交互的时候,更多的时候传输的是JSON格式的数据. 所以开发中我们需要将数据格式转化成JSON,请参见:https://w ...
随机推荐
- Spring+Junit,测试事务时,一直回滚
研究了好长时间,都不知道原因,也不能解决. 控制台又没有报异常,但是就是一直回滚.注释掉spring声明式配置的代码,就能正确的更新数据. 从网上看了,别人的文章 http://blog.csdn.n ...
- python的算法:二分法查找(2)--bisect模块
Python 有一个 bisect 模块,用于维护有序列表.bisect 模块实现了一个算法用于插入元素到有序列表.在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高.Bisect 是二 ...
- C#在 64位系统下出现 “未能加载文件或程序集”错误
64位系统下,Build的时候,如果选择Any CPU,默认会按照64位进行编译,便无法加载某些旧的dll,这些dll可能是特定到X86 CPU的. 所以,把编译选项中改为 X86CPU,就可以运行了 ...
- 使用 gulp 压缩图片
请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 使用 gulp 压缩 JS 压缩 图片文件可降低文件大小,提高图片加载速度. 找到规律转换为 gulp 代码 规律 找到 images/ ...
- OfficeAddin基础
运行的机器制
- Nginx 的安装配置入门(mac)
1.安装Nginx服务器: 执行命令 brew install nginx 安装完以后,可以在终端输出的信息里看到一些配置路径: /usr/local/etc/nginx/nginx.conf (配置 ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...
- 洛谷——P1152 欢乐的跳
P1152 欢乐的跳 题目描述 一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数,则称之符合“欢乐的跳”,如数组1 4 2 3符合“欢乐的跳”,因为差的绝对 ...
- 日期 function
SELECT SYSDATE, ADD_MONTHS(SYSDATE,), ADD_MONTHS(SYSDATE,), LAST_DAY(SYSDATE), MONTHS_BETWEEN(SYSDAT ...
- JVM的内存布局
JVM的内存布局包括,其中: Java虚拟机在执行Java程序的过程中会把它所管理的内存(线程相关?)划分为若干个不同的数据区域.有些区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结 ...