在使用过JQuery之后,再来看JavaScript的Ajax实现就会觉得很麻烦,不过,最近使用到了,就记录一下吧

在JavaScript中Ajax的实现可以分为四步:

第一步 得到XMLHttpRequest对象

得到XMLHttpRequest

  • 大多数浏览器都支持:var xmlHttp = new XMLHttpRequest();
  • IE6.0:var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
  • IE5.5以更早版本的IE:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

编写创建XMLHttpRequest对象的函数

function createXMLHttpRequest() {
try {
return new XMLHttpRequest();
} catch (e) {
try {
return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
} catch (e) {
try {
return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本
} catch (e) {
alert("浏览器不支持");
throw e;
}
}
}
};

第二步 打开与服务器的链接

xmlHttp.open():用来打开与服务器的连接,它需要三个参数:

  • 请求方式:可以是GET或POST
  • 请求的URL:指定服务器端资源,例如一个Servlet
  • 请求是否为异步:如果为true表示发送异步请求,否则同步请求
 xmlHttp.open("GET", "/AServlet", true);

第三步 发送请求(分为GET和POST方式)

xmlHttp.send(null):如果不给可能会造成部份浏览器无法发送,参数:就是请求体内容!如果是GET请求,必须给出null

第四步 给XMLHttpRequest对象的onreadystatechange事件注册监听器,以监听服务器响应

在xmlHttp对象的一个事件上注册监听器:onreadystatechange
xmlHttp对象一共有5个状态:

  • 0状态:刚创建,还没有调用open()方法;
  • 1状态:请求开始:调用了open()方法,但还没有调用send()方法
  • 2状态:调用完了send()方法了;
  • 3状态:服务器已经开始响应,但不表示响应结束了!
  • 4状态:服务器响应结束!(通常我们只关心这个状态!!!)

得到xmlHttp对象的状态:
var state = xmlHttp.readyState;//可能是0、1、2、3、4
得到服务器响应的状态码
var status = xmlHttp.status;//例如为200、404、500
得到服务器响应的内容

  • var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
  • var content = xmlHttp.responseXML;//得到服务器的响应的xml响应的内容,它是Document对象了
  xmlHttp.onreadystatechange = function() {//xmlHttp的5种状态都会调用本方法
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断:判断是否为4状态,而且还要判断是否为200
// 获取服务器的响应内容
var text = xmlHttp.responseText;
}
};

示例代码

准备工作:在页面(jsp)中写两句HTML,一个按钮,一个段落

    <input type="button" value="点击" id="btn"/>
<h1 id="h1"></h1>

先来看看GET方式的Ajax:

<script type="text/javascript">
function createXMLHttpRequest() {
try {
return new XMLHttpRequest();
} catch (e) {
try {
return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
} catch (e) {
try {
return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本
} catch (e) {
alert("浏览器不支持");
throw e;
}
}
}
};
window.onload = function() {
var btn=document.getElementById("btn");
btn.onclick=function(){
//第一步:得到XMLHttpRequest对象
var xmlHttp = createXMLHttpRequest();
//第二步:打开与服务器的连接
xmlHttp.open("GET", "${pageContext.request.contextPath}/AServlet",true);
//第三步:发送请求(GET方式必须指定null)
xmlHttp.send(null);
//第四步:给异步对象的onreadystatechange事件注册监听器
xmlHttp.onreadystatechange = function() {
//双重判断:状态4 响应码200
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
//获得服务器的响应
var text = xmlHttp.responseText;
//处理h1元素
var h1 = document.getElementById("h1");
h1.innerHTML = text;
}
};
};
};
</script>

获得XMLHttpRequest对象方式会有浏览器差异,所以createXMLHttpRequest()方法处理一下,在这里我使用的是Servlet

AServlet如下:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello Ajax");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("Hello Ajax");
} public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
System.out.println("POST(:)Hello Ajax");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("POST(:)Hello Ajax"+req.getParameter("userName"));
}
}

Servlet完成的工作还算简单,值得说的是必须给response指定请求头 setContentType()

POST方式的Ajax提交方式:

<script type="text/javascript">
function createXMLHttpRequest() {
try {
return new XMLHttpRequest();
} catch (e) {
try {
return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
} catch (e) {
try {
return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本
} catch (e) {
alert("浏览器不支持");
throw e;
}
}
}
};
window.onload = function() {
var btn=document.getElementById("btn");
btn.onclick=function(){
//第一步:得到XMLHttpRequest对象
var xmlHttp = createXMLHttpRequest();
//第二步:打开与服务器的连接
xmlHttp.open("POST", "${pageContext.request.contextPath}/AServlet",true);
//POST方式需要处理请求头
xmlHttp.setRequestHeader("content-type","application/x-www-form-urlencoded");
//第三步:发送请求
xmlHttp.send("userName=lz");
//第四步:给异步对象的onreadystatechange事件注册监听器
xmlHttp.onreadystatechange = function() {
//双重判断:状态4 响应码200
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
//获得服务器的响应
var text = xmlHttp.responseText;
//处理h1元素
var h1 = document.getElementById("h1");
h1.innerHTML = text;
}
};
};
};
</script>

与GET方式不同的之处在于POST需要处理请求头,使用send()方法时需要给出需要的参数,就是这两点不同吧

封装Ajax

因为JavaScript的Ajax处理较为麻烦且固定,在这里完成一个简单封装,类似于JQuery中的$.ajax()方法的实现

ajaxUtils.js :

//处理浏览器差异,获得XMLHttpRequest
function createXMLHttpRequest(){
try{
return new XMLHttpRequest(); //大多数浏览器
}catch (e) {
try {
return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
} catch (e) {
try {
return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本
} catch (e) {
alert("浏览器不支持");
throw e;
}
}
}
} /*
* option对象有如下属性
*/
/*请求方式method,*/
/*请求的url url,*/
/*是否异步 asyn,*/
/*请求体 params, */
/*回调方法 callback,*/
/*服务器响应数据转换成什么类型 type*/
/*url和callback没有默认值,必须指定*/
function ajax(option){
/**
* 1.得到XMLHttpRequest
*/
var xmlHttp=createXMLHttpRequest();
/**
* 2.打开连接
*/
if(!option.method){ //默认为GET请求
option.method="GET";
}
if(option.asyn==undefined){ //默认为异步
option.asyn=true;
}
xmlHttp.open(option.method, option.url, option.asyn);
/**
* 3.判断是否为POST
*/
if("POST" == option.method) {
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
/**
* 4.发送请求
*/
xmlHttp.send(option.params);
/**
* 5.注册监听
*/
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断
var data;
// 获取服务器的响应数据,进行转换!
if(!option.type) {//如果type没有赋值,那么默认为文本
data = xmlHttp.responseText;
} else if(option.type == "xml") {
data = xmlHttp.responseXML;
} else if(option.type == "text") {
data = xmlHttp.responseText;
} else if(option.type == "json") {
var text = xmlHttp.responseText;
data = eval("(" + text + ")");
} // 调用回调方法
option.callback(data);
}
};
};

我们直接在页面中使用ajax()方法即可,注意 url和callback没有默认值,必须指定

页面中使用:

<script type="text/javascript" src="${pageContext.request.contextPath}/js/ajaxUtils.js"></script>
<script type="text/javascript">
window.onload=function(){
var btn=document.getElementById("btn");
btn.onclick=function(){
ajax({
url:"${pageContext.request.contextPath}/AServlet",
callback:function(data){
document.getElementById("h1").innerHTML=data;
}
});
};
};
</script>

data就是服务器返回的数据

JavaScript笔记——使用AJax的更多相关文章

  1. 用javascript写原生ajax(笔记)

    AJAX  的全名叫做  Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并 ...

  2. jQuery学习笔记之Ajax用法详解

    这篇文章主要介绍了jQuery学习笔记之Ajax用法,结合实例形式较为详细的分析总结了jQuery中ajax的相关使用技巧,包括ajax请求.载入.处理.传递等,需要的朋友可以参考下 本文实例讲述了j ...

  3. 【笔记】AJAX基础

    [笔记]AJAX基础 Django AJAX  知识储备:JSON 什么是 JSON JSON 是轻量级的文本数据交换格式 JSON 独立于语言和平台.JSON 解析器和 JSON 库支持许多不同的编 ...

  4. 【温故而知新-Javascript】使用 Ajax

    Ajax 是现代Web 应用程序开发的一项关键工具.它让你能向服务器异步发送和接收数据,然后用 Javascript 解析. Ajax 是 Asynchronous JavaScript and XM ...

  5. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  6. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  7. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  8. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  9. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

随机推荐

  1. ffmpeg jpeg图片播放失败之问题排查

    播放jpeg时,avformat_find_stream_info出现以下问题,排查: [jpeg_pipe @ 0x146a80] Could not find codec parameters f ...

  2. Android程序员学WEB前端(3)-HTML(3)-表单嵌套-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522586觉得博文有用,请点赞,请评论,请关注,谢谢!~ 表单嵌套: <!DO ...

  3. 使用fill_n算法

    今天使用这个算法来给一个数组赋值,所以把它的使用过程记录下来: fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val.把从起始点开始依次赋予count个元素val的值. 注意 ...

  4. 我也说说Emacs吧(2) - Emacs其实就是函数的组合

    Emacs本质上是函数的组合 从帮助上看emacs有何不同 Vim和Sublime Text等编辑器,本质上是一个编辑器. 比如我们看看vim的帮助,是这个风格的,比如我要看i命令的帮助: <i ...

  5. 会议室预定demo mrbs

    关于会议室的增删改查 查: HTML: login继承django自带的admin用户认证系统 <!DOCTYPE html> <html lang="en"&g ...

  6. 分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    本篇导读: 上篇介绍了一款Windows环境下的Git服务器工具GitStack ,搭建了最简单的Windows下的Git服务器,需要再次提醒的是GitStack是打包了相对较稳定的Git原生版本的, ...

  7. C++中的友元函数的总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...

  8. vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法

    一.下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C+ ...

  9. 重温CLR(十六) CLR寄宿和AppDomain

    寄宿(hosting)使任何应用程序都能利用clr的功能.特别要指出的是,它使现有应用程序至少能部分使用托管代码编写.另外,寄宿还为应用程序提供了通过编程来进行自定义和扩展的能力. 允许可扩展性意味着 ...

  10. MYSQL在当前日期的基础上加上N(年月日分秒)

    //把id为1的那条数据的开始时间改为现在  结束时间改为开始时间的1个月后 update 表明 set  begintime=now(),endtime=date_add(NOW(), interv ...