一些XMLHttpRequest的例子代码
以下例子摘录自:javascript权威指南
//异步请求(事件监听请求是否返回)
function getText(url,callback){
var request = new XMLHttpRequest();
request.open('GET',url);
request.onreadystatechange = function () {
if(request.readyState === 4 && request.status === 200){
var type = request.getResponseHeader('Conten-Type');
if(type.match(/^text/)){
callback(request.responseText);
}
}
};
request.send(null);
}
//同步请求(会阻塞页面)
function getTextSync(url){
var request = new XMLHttpRequest();
request.open('GET',url,false); //false表示同步请求
request.send(null);
if(request.status !== 200){
throw new Error('..');
}
var type = request.getResponseHeader('Conten-Type');
if(!type.match(/^text/)){
throw new Error('....');
}
return request.responseText;
}
//解析HTTP请求响应
function get(url,callback){
var request = new XMLHttpRequest();
request.open('GET',url);
request.onreadystatechange = function(){
if(request.readyState === 4 && request.status === 200){
var type = request.getResponseHeader('Content-Type');
if(type.indexOf('xml') !== -1 && request.responseXML){
callback(request.responseXML);
}else if(type === 'application/json'){
callback(JSON.parse(request.responseText));
}else{
callback(request.responseText);
}
}
};
request.send(null);
}
非表单数据形式的表单编码的请求GET和提交POST(如data对象)
//1.将保存有(名:值)对属性的data对象转化为整个字符串
function encodeFormData(data){
if(!data){return ''}
var pairs = []; //保存名=值对
for(var name in data){
if(data.hasOwnProperty(name) && typeof data[name] !== 'function'){
var value = data[name].toString();
name = encodeURIComponent(name.replace('%20','+'));
value = encodeURIComponent(value.replace('%20','+'));
pairs.push(name+'='+value);
}
}
return pairs.join('&');
}
//2.直接发送data对象的HTTP POST请求工具函数
function postData(url,data,callback){
var request = new XMLHttpRequest();
request.open('POST',url);
request.onreadystatechange = function () {
if(request.readyState === 4 && callback){
callback(request); //将request对象传递给callback处理
}
};
request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
request.send(encodeFormData(data));
}
//3.若表单数据只是为了只读查询,则最好用GET方法,在url+'?'+查询字符串
function getData(url,data,callback){
var request = new XMLHttpRequest();
request.open('GET',url+'?'+encodeFormData(data));
request.onreadystatechange = function(){
if(request.readyState === 4 && callback){
callback(request);
}
};
request.send(null);
}
//4.使用JSON编码主体来发起HTTP POST请求
function postJSON(url,data,callback){
var request = new XMLHttpRequest();
request.open('POST',url);
request.onreadystatechange = function () {
if(request.readyState === 4 && callback){
callback(request);
}
};
request.setRequestHeader('Content-Type','application/json');
request.send(JSON.stringify(data));
}
//5.使用POST发送multipart/form-data请求主体
function postFormData(url,data,callback){
if(FormData){throw new Error('FormData is not implemented')}
var request = new XMLHttpRequest();
request.open('POST',url);
request.onreadystatechange = function () {
if(request.readyState === 4 && callback){
callback(request);
}
};
//创建一个FormData对象的实例
var formdata = new FormData();
for(var name in data){
if(data.hasOwnProperty(name) && typeof data[name] !== 'function'){
formdata.append(name,data[name]);
}
}
request.send(formdata);
}
//6.终止请求和超时(在文本输入域请求推荐内容时,如果用户在服务器的建议达到之前输入了新的字符,则应该终止请求)
function timedGetText(url,delay,callback){
var request = new XMLHttpRequest();
var timedOut = false;
//启动计时器,在delay时间到后将终止请求
var id = setTimeout(function () {
timedOut = true;
request.abort();
},delay);
request.open('GET',url);
request.onreadystatechange = function () {
if(timedOut||request.readyState !== 4){return}
clearTimeout(id);
if(request.status === 200){
callback(request.responseText);
}
};
request.send(null);
}
7.HTTP进度事件
XMLHttpRequest对象在请求的不同阶段触发不同类型的事件,所以它不需要检查readyState属性。
当调用send()时,触发单个loadstart事件。当正在加载服务器的响应时,XMLHttpRequest对象会发生progress事件,通常每隔50毫秒左右,所以可以使用这些事件给用户反馈请求的进度
如果请求快速完成,它可能从不会触发progress事件。当事件完成,会触发load事件。
HTTP请求无法完成有3种情况,对应3种事件。如果请求超时,会触发timeout事件。如果请求中止,会触发abort事件。像太多重定向这样的网络错误会阻止请求完成,但这些情况发生时会触发error事件。
对于任何具体请求,浏览器将只会触发load、abort、timeout和error事件中的一个。
progress事件属性:loaded目前传输的字节数值,total是自“Content-Length”头传输的数据的整体长度(字节),如果未知长度则为0,若知道长度则lengthComputable属性为true
if('onprogress' in (new XMLHttpRequest())){ //检测是否支持progress事件
var request = new XMLHttpRequest();
request.onprogress = function (e) {
if(e.lengthComputable){
progress.innerHTML = Math.round(100* e.loaded/ e.total) + '%';
}
}
}
对于XMLHttpRequest对象x,设置x.onprogress以监控响应的下载进度,并且设置x.upload.onprogress以监控请求的上传进度。
8.跨域HTTP请求
//XMLHttpRequest对象通常仅可以发起和文档具有相同服务器的HTTP请求。
//XHR2通过在HTTP响应中选择发送合适的CORS( Cross- Origin Resource Sharing, 跨域资源共享)允许跨域访问网站。
//而IE8通过这里没有列出的专用XDomainRequest对象支持它。
//如果给XMLHttpRequest的open()方法传入用户名和密码,那么它们绝对不会通过跨域请求发送
//除外,跨域请求通常也不会包含其他任何的用户证书:cookie和HTTP身份验证令牌( token)通常不会作为请求的内容部分发送且任何作为跨域响应来接收的cookie都会丢弃。
//如果跨域请求需要这几种凭证才能成功,那么必须在用send()发送请求前设置XMLHttpRequest的withCredentials属性为true。这样做不常见,但测试withCredentials的存在性是测试浏览器是否支持CORS的方法
whenReady(
function () {
var supportsCORS = (new XMLHttpRequest()).withCredentials !== (void 0);
var links = document.getElementsByTagName('a');
for(var i=0;i<links.length;i++){
var link = links[i];
if(!link.href || link.title){continue;}
//如果是跨域链接
if(link.host !== location.host || link.protocol !== location.protocol){
link.title = '这是站外链接';
if(!supportsCORS){continue;} //不支持CORS就退出
}
if(link.addEventListener){
link.addEventListener('mouseover',mouseoverHandler,false);
}else{
link.attachEvent('onmouseover',mouseoverHandler);
}
}
function mouseoverHandler(event){
var e = event||window.event;
var link = e.target|| e.srcElement;
var url = link.href;
var request = new XMLHttpRequest();
request.open('HEAD',url);
request.onreadystatechange = function () {
if(request.readyState === 4 || request.status === 200){
var type = request.getResponseHeader('Content-Type');
var size = request.getResponseHeader('Content-Length');
var date = request.getResponseHeader('Last-Modified');
link.title = '类型: '+type+' \n'+'大小: '+size+' \ n'+'时间: '+date;
}else if(!link.title){
link.title = "Couldn't fetch details:\n"+request.status+" "+request.statusText;
}
};
request.send(null);
if(link.removeEventListener){
link.removeEventListener('mouseover',mouseoverHandler,false);
}else{
link.detachEvent('onmouseover',mouseoverHandler);
}
}
}
);
一些XMLHttpRequest的例子代码的更多相关文章
- <<精通iOS开发>>第14章例子代码彻底清除警告
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们解决了<<精通iOS开发>> ...
- golang json 处理的一些例子代码
json 处理的例子代码, 解析结果看后面注释. package main import "encoding/json" import "fmt" impo ...
- 易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码
易盛信息9.0外盘期货行情数据API接口公共授权开发包例子代码 怎么才能获取到外盘期货行情数据API接口呢?不少朋友就会考虑到易盛9.0行情API接口,本身易盛就是一个软件提供商,提供行 ...
- OpenCV 例子代码的讲解、简介及库的安装 .
转载请标明是引用于 http://blog.csdn.net/chenyujing1234 欢迎大家提出意见,一起讨论! 一.OpenCV介绍: OpenCV是由Intel性能基元(IPP)团队主持, ...
- Spring基础学习,附例子代码讲解
什么是Spring.IOC.AOP.DI? Spring是一个基于IOC和AOP的结构J2EE系统的框架. IOC(Inversion Of Control)控制反转(Spring的基 ...
- (二)区块链的共识算法:PoS 及其 例子 代码 实现
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- Spring笔记 #01# 一个小而生动的IOC例子代码
索引 Spring容器的最小可用依赖 用XML定义元数据 实例化容器&使用容器 例子中仅包含两种类:英雄类Hero和武器类Weapon. 演示DI:给Hero初始化Weapon 演示AOP:法 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - .NET商业化成品成熟各种数据权限的需求对应例子代码
还是我上次提出的那个问题问题:假设一个订单表,1.角色A可以看自己的2.角色B可以看工作组的3.角色C可以看金额是1000元以下的(自定义条件是否可行?如果可以,请详细说明)4.角色D可以看整个部门的 ...
- <<精通iOS开发>>第14章例子代码小缺陷的修复
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先推荐大家看这本书,整本书逻辑非常清晰,代码如何从无到有,到 ...
随机推荐
- 轻松自动化---selenium-webdriver(python) (三)
本节重点: 简单对象的定位 -----自动化测试的核心 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象.一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一 ...
- js cookie存储方法
/*! * jQuery Cookie Plugin v1.4.0 * https://github.com/carhartl/jquery-cookie * * Copyright 2013 Kla ...
- 如何用Ajax加载服务器的图片
用Ajax请求服务器的图片,并显示在浏览器中 前言 一直在数据库里面存的都是图片在服务器的地址,然后再到浏览器中显示,但是发现两个问题 第一:为了安全起见,js是无法读取本地的图片的,不然你写一个js ...
- HT for Web基于HTML5的图像操作(二)
上篇介绍了HT for Web采用HTML5 Canvas的getImageData和setImageData函数,通过颜色乘积实现的染色效果,本文将再次介绍另一种更为高效的实现方式,当然要实现的功能 ...
- JavaScript基础插曲---apply,call和URL编码等方法
Js基础学习 Js的压缩: 就是利用js的语法格式通过缩短变量名,去掉空格等来进行压缩. Apply和call的使用 1:apply方法:应用某一对象的方法,用于一个对象替换当前对象.主要是改变thi ...
- 设置与获取Cookie
自己编写的一个Cookie设置与获取函数,大家有什么感觉需要改进的地方,请告知与我,我一定虚心接受. JavaScript - Code: function setCookie(name,value, ...
- 【原创】Kakfa api包源代码分析
既然包名是api,说明里面肯定都是一些常用的Kafka API了. 一.ApiUtils.scala 顾名思义,就是一些常见的api辅助类,定义的方法包括: 1. readShortString: 从 ...
- 获取DataTable选择第一行某一列值
数据源是一个DataTable,现在我们需要获取这个DataTable的第一行第一列的值.先准备一个数据集,创建一个DataTable,并填充数据: source code: using System ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- 【iOS】配置和使用静态库
上一篇 我们演示了了如何创建自己的静态库,最终生成多个.a文件,根据需要引用工程就可以直接使用静态库了,但是有个很麻烦的问题,模拟器用的库和真机的不是同一个,当我们切换的时候需要更换静态库,有两种方式 ...