所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下对网页的某部分进行更新。

一、XMLHttpRequest 对象的属性

1、onreadystatechange 属性

onreadystatechange 属性保存有处理服务器响应的函数。

请求状态改变的事件触发器(readyState变化时会调用这个属性上注册的 javascript 函数)。

下面的代码定义一个空的函数:

xmlhttp.onreadystatechange = function(){
   // 我们需要在这里写一些代码
}

2、readyState 属性

readyState 属性保存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会被执行。

readyState有五种可能的值

0 - (Uninitialized 未初始化)对象已创建,未调用open()方法
1 - (Loading 载入)open()方法成功调用,但send()方法未调用
2 - (Loaded 载入完成)send()方法已经调用,尚未开始接受数据
3 - (Interactive 交互)正在接受数据,Http响应头信息已经接受,但尚未接收完成
4 - (Completed 完成)响应数据接受完成,可以在客户端调用了

我们要向这个 onreadystatechange 函数添加一条 if 语句,来测试我们的响应是否已完成(意味着可获得响应数据):

 xmlhttp.onreadystatechange = function(){
  if(xmlhttp.readyState==4){
     // 从服务器的response获得数据
  }
}

3、responseText 属性

可以通过 responseText 属性来取回由服务器返回的数据,该属性代表的是从Server端返回的一个String格式的响应:

var str = xmlhttp.responseText;

4、responseXML 属性

代表从Server端传回的XML格式的数据,可以直接被当作DOM对象使用。(服务器响应的XML内容对应的DOM对象)

var obj = xmlhttp.responseXML;

5、status属性

这个在HTTP响应中的响应码。200代表响应成功,404表示“未找到”,500表示“服务器内部错误”等。

所以一般在status==200才进行响应数据的操作,如果不是200,那说明HTTP响应不正常,也就不用处理。

6、statusText属性

服务器返回状态的文本信息,即HTTP协议中跟在响应码后面的相应说明串。例如 200 后面就会跟着OK。

二、XMLHttpRequest 对象的方法

1、open()方法

open() 主要有三个参数需要设定,格式 open(String method, string url, boolean asynch, String username, String password)。

第一个参数method定义发送请求所使用的方法,一般使用"GET","POST"。

第二个参数url表示请求的服务器的地址。

第三个参数asynch表示是否采用异步方法,true为异步,false为同步。

后边两个参数可以不指定,username和password分别表示用户名和密码,提供http认证机制需要的用户名和密码。

xmlhttp.open("GET","/NewServlet",true);

2、send() 方法

send()有一个参数,参数为要发送的数据,send(content) 表示将请求送往服务器。content可以指定为null表示不发送数据,其内容也可以是DOM对象,输入流或字符串。

向服务器发出请求,如果采用异步方式,该方法会立即返回。

xmlhttp.send(null);

3、setRequestHeader(String header,String Value)

设置HTTP请求中的指定头部header的值为value,此方法需在open方法以后调用,一般在POST方式中使用。

4、getAllResponseHeaders()

返回包含HTTP的所有响应头信息,其中相应头包括Content-length,date,uri等内容。

返回值是一个字符串,包含所有头信息,其中每个键名和键值用冒号分开,每一组键之间用CR和LF(回车加换行符)来分隔!

5、getResponseHeader(String header)

返回HTTP响应头中指定的键名header对应的值

6、abort()

停止当前HTTP请求。对应的 XMLHttpRequest 对象会复位到未初始化的状态。

三、XMLHttpRequest对象进行Ajax操作

 var xmlhttp;
function loadAjax(url){
xmlhttp = null;
if (window.XMLHttpRequest){// code for all new browsers
xmlhttp = new XMLHttpRequest();
}else if (window.ActiveXObject){// code for IE5 and IE6
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp != null){
xmlhttp.onreadystatechange = state_Change;//定义回调函数
xmlhttp.open("POST",url,true);
xmlhttp.send(null);
}else{
   alert("你的浏览器不支持XMLHttpRequest对象!");
}
}
function state_Change(){
if (xmlhttp.readyState == 4){
if (xmlhttp.status == 200){// 200 = OK
var message = xmlhttp.responseText;//获取服务端响应的文本
//var domXml = xmlhttp.responseXML;//获取服务器响应的XML内容对应的DOM对象,服务器端需要设置content-type为text/xml
//其它代码
}else{
alert("响应出现问题");
}
}
}

 网上找的别人写的封装好的代码,感觉不错,贴在这:

 //类的构建定义,主要职责就是新建XMLHttpRequest对象
var MyXMLHttpRequest = function(){
var xmlhttprequest;
if(window.XMLHttpRequest){
xmlhttprequest = new XMLHttpRequest();
if(xmlhttprequest.overrideMimeType){
xmlhttprequest.overrideMimeType("text/xml");
}
}else if(window.ActiveXObject){
var activeName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for(var i=0; i<activeName.length; i++){
try{
xmlhttprequest = new ActiveXObject(activeName[i]);
break;
}catch(e){}
}
} if(xmlhttprequest == undefined || xmlhttprequest == null){
alert("XMLHttpRequest对象创建失败!!");
}else{
this.xmlhttp=xmlhttprequest;
} //用户发送请求的方法
MyXMLHttpRequest.prototype.send = function(method,url,data,callback,failback){
if(this.xmlhttp != undefined && this.xmlhttp != null){
method = method.toUpperCase();
if(method != "GET" && method != "POST"){
alert("HTTP的请求方法必须为GET或POST!!!");
return;
}
if(url == null || url == undefined){
alert("HTTP的请求地址必须设置!");
return ;
}
var tempxmlhttp = this.xmlhttp;
this.xmlhttp.onreadystatechange = function(){
if(tempxmlhttp.readyState == 4){
if(temxmlhttp.status == 200){
var responseText = temxmlhttp.responseText;
var responseXML = temxmlhttp.reponseXML;
if(callback==undefined || callback==null){
alert("没有设置处理数据正确返回的方法");
alert("返回的数据:" + responseText);
}else{
callback(responseText,responseXML);
}
}else{
if(failback == undefined || failback == null){
alert("没有设置处理数据返回失败的处理方法!");
alert("HTTP的响应码:" + tempxmlhttp.status + ",响应码的文本信息:" + tempxmlhttp.statusText);
}else{
failback(tempxmlhttp.status,tempxmlhttp.statusText);
}
}
}
} //解决缓存的转换
if(url.indexOf("?")>=0){
url=url + "&t=" + (new Date()).valueOf();
}else{
url=url+"?+="+(new Date()).valueOf();
} //解决跨域的问题
if(url.indexOf("http://") >= 0){
url.replace("?","&");
url = "Proxy?url=" + url;
}
this.xmlhttp.open(method,url,true); //如果是POST方式,需要设置请求头
if(method == "POST"){
this.xmlhttp.setRequestHeader("Content-type","application/x-www-four-urlencoded");
}
this.xmlhttp.send(data);
}else{
alert("XMLHttpRequest对象创建失败,无法发送数据!");
}
MyXMLHttpRequest.prototype.abort = function(){
this.xmlhttp.abort();
}
}
}

JavaScript使用浏览器内置XMLHttpRequest对象执行Ajax请求的更多相关文章

  1. JavaScript使用浏览器内置XML解析器解析DOM对象

    所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 (可通过 JavaScript 操作的对象). 一.获取DOM对象 XMLHttpReq ...

  2. javascript中的内置对象

    2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...

  3. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  4. javaScript中Math内置对象基本方法入门

    概念 Math 是javaScript的内置对象,包含了部分数学常数属性和数学函数方法. Math 不是一个函数对象,用户Number类型进行使用,不支持BigInt. Math 的所有属性与方法都是 ...

  5. 浏览器内置Console函数使用详解

    浏览器内置Console函数比较好用:Chrome 和 FireFox(Firebug插件) 利用此功能可以像直接在面板里面运行JS一样(写法不同而已) 一.显示信息的命令 Firebug内置一个co ...

  6. js中内置有对象

    statpot:使用mongo+bootstrap+highcharts做统计报表 最近做了一个统计项目,这个统计项目大致的需求是统计接口的访问速度.客户端会调用一个接口来记录接口的访问情况,我的需求 ...

  7. HTML5 使用浏览器内置数据库之 indexedDB

    indexedDB是H5规范里的浏览器内置数据库,是nosql数据库的一种.因为另一种数据库Web SQL不再受W3C支持,所以还得学习下这个. 基本情况 兼容性:ie11及以上都支持, W3C是这么 ...

  8. JavaScript中的内置函数

    JavaScript中的内置函数 制作人:全心全意 在使用JavaScript语言时,除了可以自定义函数之外,还可以使用JavaScript的内置函数,这些内置函数是由JavaScript语言自身提供 ...

  9. 浏览器内置的base64方法

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同(维基百科: ...

随机推荐

  1. C#使用反射获取对象变化的情况

    记录日志时, 经常需要描述对象的状态发生了怎样的变化, 以前处理的非常简单粗暴: a. 重写class的ToString()方法, 将重要的属性都输出来 b. 记录日志时:  谁谁谁  由  变更前实 ...

  2. Android接口Parcelable的使用

    注明:非原创,转载,原链接地址为:http://www.2cto.com/kf/201205/132814.html 和 http://www.blogjava.net/lincode/archive ...

  3. vue-cli 第二章 (常见问题修正)

    一.编译打包多出 *.map 文件处理   当执行 npm run build 后根目录下会编译出一个 dist 的文件夹,如下:     其中 css 和 js  文件夹下会多出一些 *.map 的 ...

  4. 如何选择合适的PHP版本

    PHP版本很多,包括32位64位以及线程安全与非线程安全在内的php版本多达几百个,应该如何选择PHP版本呢 PHP32和64的选择和区别 32bit的php的整型数据最大最小正负2GB左右(0x7F ...

  5. HDU6011

    巨香蕉牛奶猪皮怪的坑人,刚开始想错了,我先建了一个结构体储存每个字母的价值和数量,然后全部情况列出来进行计算,就是一次挪动一个字符看总之的变化,但是我原来错在了每次挪动的是全部相同的那一个字符,后来只 ...

  6. 【信号与线性系统】为什么求解零输入响应时转移算子H(p)不能约分,但计算单位冲激响应时却可以约分?

    为什么求零输入响应rZI时转移算子H(p)不能约分? . . . 我们知道,求零输入响应rZI的实质其实是求解微分方程 D(p)r(t) = N(p)e(t) 的解.由于这里 e(t)=0 ,所以这是 ...

  7. GitHub学习途径

    之前学习GitHub的一个pdf文件 作者是stormzhang 我觉得那个pdf教的很详细,我还没看完,正在学习中,学到了文件的clon和在本机如何更新GitHub的文件. 在此分享一下 下载链接h ...

  8. js unicode转中文 &#26041;&#26696;&#27010;&#36848;&#32852;&#32593;LED&#29031;&#26126;&#26041;&#26696;&#21487;&#25191;&#34892;&#20840;&#37096;&#30340;DALI &#21644;

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. vue 图片下载到本地,图片保存到本地

    必须同源(访问的网站域名与服务器域名一致)才能下载 downs() { var alink = document.createElement("a"); alink.href = ...

  10. linux (ubuntu) 命令学习笔记

    1, md5sum 输出字符串的MD5值 echo -n 123456 | md5sum //-n表示不打印回车符 2, ubuntu设置dock任务栏鼠标点击效果 16.04: 调整位置:gsett ...