javascript --- XHR(XMLHttpRequet)对象

XHR:

// XHR(XMLHttpRequest):为向服务器发送请求和解析服务器响应提供了流畅的接口
// 能够以异步方式从服务器取得更多信息,意味着用户点击后,可以不必刷新页面也能取得新数据
// 换句话说,可以使用XHR对象获取新数据,然后再通过DOM将新数据插入到页面中.

XMLHttpRequest对象:

// IE5是第一款引入XHR对象的浏览器.再IE5中,XHR对象是通过MSXML库中的一个ActiveX对象实现的.
// 因此,在IE中可能会遇到三种不同版本的XHR对象:
// IE7之前的生成xhr对象
function createXHR() {if(typeof arguments.callee.activeXString != "string") {var version = ["XSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0","XSXML2.XMLHttp"],i, len;for (i=0, len = versions.length; i < len; i++) {try {new activeXObject(versions[i]);arguments.callee.activeXString = versions[i];} catch (ex) {// jump this}}return new ActiveXObject( arguments.callee.activeXString);}
}// 支持IE7及更高的版本,生成xhr对象
function createXHR() {if (typeof XMLHttpRequest != "undefined") {return new XMLHttpRequest();} else if (typeof ActiveXObject != "undefined") {if (typeof arguments.callee.activeXString != "string") {var versions = [ "MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i, len;for( i =0, len =versions.length;  i< len; i++) {try {new ActiveXObject(versions[i]);arguments.callee.activeXString = versions[i];break;} catct(ex) {// 跳过}}return new ActiveXObject(arguments.callee.activeXString);} else {throw new Error("No XHR object avilable.");}
}

XHR.open()创建一个待发送的请求:

// open():它接受3个参数:要发送的请求的类型("get","post"等)、请求的URL和是否异步发送请求的布尔值
// 利用上面定义的方法
var xhr = createXHR();
xhr.open("get", "example.php", false);// 以上代码会启动一个针对example.php的GET请求.
// 注1:以上的URL是相对于执行代码的当前页面
// 注2:open方法并不会真正发送请求,而只是启动一个请求以备发送
// 注3:只能像同一个域中使用相同端口和协议的URL发送请求.

XHR.send()发送待发送请求:

// send():接收一个参数,即要作为请求主体发送的数据.如果不需要通过请求主体发送数据,则必须传入null.
// 利用上面创建的待发送请求
xhr.send(null);

服务器响应的几个XHR属性:

// responseText: 作为响应主体被返回的文本
// responseXML: 如果响应的内容类型是"text/xml" 或”application/xml",这个属性中将保存包含着响应数据的XML DOM文档
// status: 响应的HTTP状态
// statusText: HTTP状态的说明// 可以像下面这样检测返回的status
xhr.open("get", url, false);   // 同步方式
xhr.send(null);if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304) {alert(xhr.responseText);  // 响应主体
} else {alert("Request was unsuccessful: " + xhr.status);
}
// 注1:状态码304,代表请求资源未修改

XHR异步发送请求的readyState属性:

// 该属性表示请求 / 响应过程的当前活动阶段
// xhr.readyState == 0:未初始化,尚未调用open方法
// xhr.readyState == 1: 启动,调用了open方法,但未调用send方法
// xhr.readyState == 2: 发送,已经调用了send方法,但并未收到响应
// xhr.readyState == 3: 接收,已经接收到部分响应数据
// xhr.readyState == 4: 完成,已经接收到全部响应数据,而且已经可以在客户端使用了// 看下面一个例子:
var xhr = createXHR();
xhr.onreadystatechange = function () {if ( xhr.readyState == 4) {if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.stauts);}}
};
xhr.open("get", url, true);    // 异步发送请求
xhr.send(null);// 注1:每次readyState改变时,都会触发一次onreadystatuschange事件
// 注2:以上onreadystatuschange事件是通过DOM0级方法添加的(原因,DOM2级添加方法仅支持部分浏览器)// xhr.abort():用于在接收到响应前,取消异步请求
xhr.abort();

HTTP头部信息:

// Accept: 浏览器能够处理的内容类型
// Accept-Charset: 浏览器能够显示的字符集
// Accept-Encoding: 浏览器能够处理的压缩编码
// Accept-Language: 浏览器当前设置的语言
// Connection: 浏览器域服务器之间连接的类型
// Cookie: 当前页面设置的任何Cookie
// Host: 发出请求的页面所在的域
// Referer: 发出请求的页面的URI
// User-Agent: 浏览器的用户代理// 使用xhr.setRequestHeader发送请求头部信息.必须位于xhr.open和xhr.send之间
var xhr = createXHR();
xhr.onreadystatechange = function () {if ( xhr.readyState ==4 ){if(( xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert( xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}}
}
xhr.open("get", url, true);
xhr.setRequestHeader("MyHeader", "MyValue");
xhr.send(null);// xhr.getResponseHeader():可以取得响应的响应头部信息
// xhr.getAllResponseHeaders():可以取得一个包含所有头部信息的长字符串
var myHeader = xhr.getResponseHeader("MyHeader");
var allHeaders = xhr.getAllResponseHeaders();

GET请求:

// 用于向服务器查询某些信息,可以将查询字符串参数追加到URL的末尾
// 查询字符串中的每个参数的名称和值都必须使用encodeURIComponent()进行编码,然后才能放到URL的末尾// addURLParam
function addURLParam(url, name, value) {url += (url.indexOf("?") == -1 ? "?" : "&");url += encodeURIComponent(name) + "=" + encodeURIComponent(value);return url;
}// use
var url = "example.php";
url = addURLParam(url, "name", "Nicholas");   // example.php?name=Nicholas
url = addURLParam(url, "book", "Professional JavaScript"); // example.php?name=Nicholas&book=Professional%JavaScriptxhr.open("get", url, false);

POST请求:

// 通常用于向服务器发送应该被保存的数据// 使用XHR来模仿表单提交
function submitData() {var xhr = createXHR();xhr.onreadystatechange = function () {if ( xhr.readyState == 4) {if (( xhr.status >=200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}}};xhr.open("post", "postexample.php", ture);xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");var form = document.getElementById("user-info");xhr.send(serialize(form));   // serialize是标准化表单元素的函数
}// 附:serialize()
function serialize (form) {var parts = [],i,len,j,optLen,option,optValue;for( i =0, len = form.elments.length; i< len; i ++) {filed = form.ekenebts[i];switch(field.type) {case "select-one":case "select-multiple":if(field.name.length) {for(j = 0, optLen = field.options.length; j < optLen; j++) {option = field.options[j];if(option.selected) {optValue = "";if ( option.hasAttribute) {optValue = (option.hasAttribute("value") ?option.value : option.text);} else {optValue = (option.attribute["value"].specified ?option.value : option.text);}parts.push(encodeURIComponent(field.name) + "=" +encodeURIComponent(optValue));}}}break;case undefined:case "file":case "submit":case "reset":case "button":break;case "radio":case "checkbox":if(!field.checked) {break;}default:if(field.name.length) {parts.push(encodeURIComponent (field.name) + "=" +encodeURIComponent (field.value));}}}return parts.join("&");
}// 注:在发送相同大小数据的时候,GET请求的速度最多可达POST请求速度的2倍

参考《JavaScript高级程序设计》(第3版)P436~P437 、P571~P578

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOM-8 【兼容】冒泡捕获流、事件与事件源对象、事件委托

事件流 1. 含义 描述从页面中接收事件的顺序 2. 分类 IE提出的 事件冒泡流 Event BubblingNetscape提出的 事件捕获流 Event Capturing 3. 阶段 事件捕获阶段 处于目标阶段 事件冒泡阶段 事件捕获先于事件冒泡执行 dom dom0&#xff1a;定义句柄方式&#xff0c;兼…

IIS6.0,Apache低版本,PHP CGI 解析漏洞

IIS6.0解析漏洞 在IIS6.0下存在这样的文件“名字.asp;名字.jpg” 代表了jpg文件可以以asp脚本类型的文件执行。 根据这个解析漏洞我们可以上传这种名字类型的图片&#xff0c;比如 1.asp;xxx.jpg 他会忽略;后边的内容&#xff0c;所以文件相当于1.asp asp一句话木马 <%eval …

UVA 3485 Bridge

题目大意 你的任务是修建一座大桥。桥上等距地摆放着若干个塔&#xff0c;塔高为H&#xff0c;宽度忽略不计。相邻两座塔之间的距离不能超过D。塔之间的绳索形成全等的对称抛物线。桥长度为B&#xff0c;绳索总长为L&#xff0c;如下图所示求建最少的塔时绳索的最下端离地的高度…

javascript --- XMLHttp2级、CORS(跨域资源共享)

FormData: // 为序列化表单以及创建与表单格式相同的数据提供了便利 var data new FromData(); data.append("name", "Nicholas");// 使用FormData标准化数据后,发送到服务器 var xhr createXHR(); xhr.onreadystatechange function () {if ( xhr.read…

ES5-拓展 this指向的总结

每个函数在执行时都有自己的this指向 1. 默认绑定规则&#xff1a; 全局中&#xff0c;this指向window this window函数的独立调用&#xff0c;this默认指向window &#xff08;不要把独立调用理解成window调用&#xff09; // 函数在全局中调用&#xff0c;也就是被window调…

Applet

Applets用于为Web应用程序提供交互功能&#xff0c;这些功能无法单独由HTML提供。它们可以捕获鼠标输入&#xff0c;并且还具有按钮或复选框等控件。响应于用户动作&#xff0c;小应用程序可以改变提供的图形内容。这使得小程序非常适合演示&#xff0c;可视化和教学。 一个app…

国内初创企业选择云计算服务器价格对比

假设我们是一家初创企业&#xff0c;现在要选择第一台服务器。业务还未确定&#xff0c;只知道是互联网业务 要求&#xff1a; 至少2核&#xff0c;否则多线程的软件都跑不了至少4G内存&#xff0c;这样可以运行数据库或者elasticsearch这种比较吃内存的东西。或者说&#xff0…

javascript --- 几个其他的跨域技术(图像Ping、JSONP、Comet)

在CORS(Cross-Origin Resource Sharing,跨域资源共享)出现以前,要实现跨域Ajax通信是很难的. 可以利用DOM中能够执行跨域请求的功能,来实现跨域通信: 浏览器到服务器的单向通信: 此项技术称为图像Ping,利用的是img.src的跨域事件 img.src只能通过侦听load和error事件来确定浏览…

ES5-拓展 箭头函数的this、this的优先级

让内部函数的this指向和父函数的this&#xff0c;可以显示改变this指向&#xff0c;也可以使用箭头函数 箭头代替了function关键字 箭头函数内部没有this指向&#xff0c;箭头函数的this是稳定引用父作用域的。因为它的存在就是要稳定this指向。 适用于普通函数的所有绑定规则…

java 实现压缩单个文件

先来实现一个简单的单文件压缩&#xff0c;主要是为了解一下压缩需要使用到的流。。 效果&#xff1a; 说明&#xff1a;压缩实现使用ZipOutputStream 代码&#xff1a; package com.gx.compress;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im…

jekins构建触发器详解

jenkins版本&#xff1a;2.89.2 1、触发远程构建 (例如,使用脚本)&#xff1a;通过一个网址的访问来触发构建&#xff0c;这样就不需要登录jenkins系统也能触发构建了。 示例地址&#xff1a; http://localhost:8848/job/FlashRegistration/build??token口令&cause书写构…

http --- 前端的缓存

前端的缓存分为: http缓存 和 浏览器缓存 http缓存: // 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有"要请求资源"的副本 // 就会从浏览器缓存中提取而不是从原始服务器中提取这个资源// 常见的http缓存,只能缓存get请求响应的资源,对于其他类型的响…

ES5-拓展 隐式数据类型转换

Boolean转换原则&#xff1a;非假即真 6种虚值 原始值转换为原始值 对象转换为原始值 Date()和new Date() new Date可以不写括号(new方式返回的一定是对象)&#xff0c;返回Date对象Date()返回函数执行&#xff0c;返回时间字符串 引用值转原始值 先找valueOf方法(一般…

Swagger的简单入门【转载】

一、Swagger简介 上一篇文章中我们介绍了Spring Boot对Restful的支持&#xff0c;这篇文章我们继续讨论这个话题&#xff0c;不过&#xff0c;我们这里不再讨论Restful API如何实现&#xff0c;而是讨论Restful API文档的维护问题。 在日常的工作中&#xff0c;我们往往需要给前…

visual studio code搭建本地服务器(node.js+express)

一、安装node.js&#xff08;常规软件安装流程&#xff0c;比较简单&#xff0c;不用赘述&#xff09; 二、安装express框架 1. 打开Windows命令提示符&#xff0c;输入&#xff1a; npm install express -g&#xff0c;等待&#xff0c;安装好如下所示&#xff1a; npm instal…

es6 --- 手写一个promise

一个promise实例: var getJSON function(url) {var promise new Promise(function(resolve, reject) {// XHR对象发现ajax请求var client new XMLHttpReqeust();client.open("GET", url);client.onreadystatechange handler;client.responseType "json&qu…

最大流模版 EK

EK算法基于增广路的思想,易于理解,但由于低效并不被经常使用 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> using namespace std; const int MAXN10005,MAXM100005…

Restrictions查询用法

Restrictions查询用法 HQL运算符 QBC运算符 含义 Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictions.gt() 大于greater than > Restrictions.ge() 大于等于greater than or equal < Restrictions.lt() 小…

chrome调试

技术拓展直播课8 按chrome的官方文档 长按刷新 清除缓存&#xff08;不一定好使&#xff09; Ctrl f 查找类 console控制台见b站 bilibili source面板直接打断点 效果和debugger一样 单步调试 进入到函数的下一步 网速 no throttling 是否需要过滤 domcontentloaded d…

es6 --- promise和async/await的区别

首先需要了解async函数: async是Generator函数的语法糖: // 使用Generator依次读取两个文件 var fs require(fs); var readFile function (fileName) {return new Promise(function (resolve, reject) {fs.readFile(filename, function(error, data) {if (error) return re…