Ajax之JavaScript实现

Posted Paradise Lost Hair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax之JavaScript实现相关的知识,希望对你有一定的参考价值。

Ajax

Ajax(Asynchronous JavaScript and XML)异步JavaScript和XML

Ajax实际上是下面这几种技术的融合:

Xhtml和CSS的基于标准的表示技术DOM进行动态显示和交互XML和XSLT进行数据交换和处理XMLHttpRequest进行异步数据检索javascript将以上技术融合在一起

客户端与服务器,可以在不必刷新整个浏览器的情况下,与服务器进行异步通讯的技术


Ajax作用

每当用户向服务器发送请求,哪怕只是需要更新一点点的局部内容,服务器都会将整个页面进行刷新。

性能会有所降低(一点内容,刷新整个页面!)用户的操作页面会中断(整个页面被刷新了)

Ajax就是能够做到局部刷新!

Ajax之JavaScript实现

XMLHttpRequest

XMLHttpRequest对象是Ajax中最重要的一个对象。使用Ajax更多的是编写客户端代码,而不是服务端的代码。

XMLHttpRequest 工作原理

传统的web前端与后端的交互中,浏览器直接访问Tomcat的Servlet来获取数据。Servlet通过转发把数据发送给浏览器。

当我们使用AJAX之后,浏览器是先把请求发送到XMLHttpRequest异步对象之中,异步对象对请求进行封装,然后再发送给服务器。服务器并不是以转发的方式响应,而是以流的方式把数据返回给浏览器

XMLHttpRequest异步对象会不停监听服务器状态的变化,得到服务器返回的数据,就写到浏览器上因为不是转发的方式,所以是无刷新就能够获取服务器端的数据。

Ajax之JavaScript实现

创建XMLHttpRequest对象

要创建XMLHttpRequest对象是要分两种情况考虑的:

在IE6以下的版本在IE6以上的版本以及其他内核的浏览器(Mozilla)等


<script type="text/javascript">

var httpRequest;

if(window.XMLHttpRequest) {

//在IE6以上的版本以及其他内核的浏览器(Mozilla)等
httpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject) {

//在IE6以下的版本
httpRequest = new ActiveXObject();
}


</script>

XMLHttpRequest对象的属性和方法

方法

open()(String method,String url,boolean asynch,String username,String password)
send(content)
setRequestHeader(String header,String value)
getAllResponseHeaders()
getResponseHeader(String header)
abort()

常用的方法就是前三个

open():该方法创建http请求

setRequestHeader(String header,String value) 设置消息头 (使用post方式才会使用到,get方法并不需要调用该方法)

xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

send(content):发送请求给服务器

如果是get方式,并不需要填写参数,或填写null如果是post方式,把要提交的参数写上去

属性

onreadystatechange:请求状态改变的事件触发器(readyState变化时会调用此方法),一般用于指定回调函数readyState:请求状态readyState一改变,回调函数被调用,它有5个状态

0:未初始化 1:open方法成功调用以后 2:服务器已经应答客户端的请求 3:交互中。Http头信息已经接收,响应数据尚未接收。4:完成。数据接收完成

Ajax之JavaScript实现

responseText:服务器返回的文本内容responseXML:服务器返回的兼容DOM的XML内容status:服务器返回的状态码statusText:服务器返回状态码的文本信息

Ajax之JavaScript实现

编写第一个Ajax程序

检测用户输入的用户名是否为"xiongxiong",只要不是xiongxiong,就可以使用!

html代码

创建的div只要用于显示服务器返回的数据当用户点击按钮的时候,就触发事件。

<input type="text" id="username">
<input type="button" onclick="checkUsername()" value="检测用户名是否合法">
<div id="result">
</div>

javaScript代码

创建流程

创建XMLHttpRequest对象创建http请求把文本框的数据发送给http请求的目标指定回调函数编写回调函数发送http请求回调函数得到http返回的内容,把内容写在div上

<script type="text/javascript">

var httpRequest;
function checkUsername() {

if(window.XMLHttpRequest) {
//在IE6以上的版本以及其他内核的浏览器(Mozilla)等
httpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject) {
//在IE6以下的版本
httpRequest = new ActiveXObject();
}

//创建http请求
httpRequest.open("POST", "Servlet1", true);

//因为我使用的是post方式,所以需要设置消息头 消息类型无文件上传
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

//指定回调函数
httpRequest.onreadystatechange = callback;

//得到文本框的数据
var name = document.getElementById("username").value;

//发送http请求,把要检测的用户名传递进去
httpRequest.send("username=" + name);
}

function callback() {

//判断请求状态码是否是 4数据接收完成
if(httpRequest.readyState==4) {

//再判断状态码是否为200 200是成功的
if(httpRequest.status==200) {

//得到服务端返回的文本数据
var text = httpRequest.responseText;

//把服务端返回的数据写在div上
var div = document.getElementById("result");
div.innerText = text;
}

}
}
</script>

Ajax二级下拉联动案例(xml)

前台分析

当用户选择了某个省份之后,就使用AJAX与服务器进行交互,那么在选择城市的时候就出现对应的城市信息。

监听下拉框值变化事件只要下拉框值变化了,就与服务器进行交互得到服务器返回的值,解析XML使用DOM把数据写到城市下拉框列表中

后台分析

得到前台带过来的数据判断该数据是什么,返回对应的的XML文件

Jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>多级联动</title>
<script type="text/javascript" src="js/ajax.js"></script>
</head>
<body>

<%--############前台页面###################--%>
<select name="province" id="provinceId">
<option value="-1">请选择省份</option>
<option>广东</option>
<option>湖南</option>
</select>

<select name="city" id="cityId">
<option>请选择城市</option>
</select>

<%--############AJAX###################--%>

<script type="text/javascript">
//定义函数
document.getElementById("provinceId").onchange = function () {
/**********定位到下拉框,获取下拉框的值***************/
// 获取选中的下拉框索引值
var index = this.selectedIndex;
// 得到下拉框的值
var province = this.options[index].innerHTML;

//下拉框的值要是“请选择”,那么我们是不会访问服务器的
if ("请选择省份" != province) {

/********由于每次都会自动添加,因此每次在调用的时候清除***********/
var citySelect = document.getElementById("cityId");

//每次都将option变成长度只有1的
citySelect.options.length = 1;

/*************ajax代码*********************/
//创建AJAX对象
var ajax = createAJAX();
//准备发送请求
var method = "post";
var url = "${pageContext.request.contextPath}/ProvinceServlet?time=" + new Date().getTime();
ajax.open(method, url);
//由于是POST方式,因此要设置头
ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");

ajax.send("province=" + province);

/************ajax回调函数*********************/
ajax.onreadystatechange = function () {

if (ajax.readyState == 4) {
if (ajax.status == 200) {

//得到服务器端带过来的XML
var XMLDocument = ajax.responseXML;

/**********解析XML文档,使用DOM写到下拉框中****************/
var cities = XMLDocument.getElementsByTagName("city");

//得到每一个cities节点的值,动态生成下拉框,添加到下拉框中
for (var i = 0; i < cities.length; i++) {
var value = cities[i].firstChild.nodeValue;
//动态生成下拉框
var optionElement = document.createElement("option");
optionElement.innerHTML = value;

//添加到下拉框中
citySelect.appendChild(optionElement);

}
}
}
};
}
};

</script>
</body>
</html>

Servlet

import java.io.IOException;
import java.io.PrintWriter;


@javax.servlet.annotation.WebServlet(name = "ProvinceServlet",urlPatterns = "/ProvinceServlet")
public class ProvinceServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

//设置中文编码
request.setCharacterEncoding("UTF-8");
String province = request.getParameter("province");

//这里是返回的是XML,因此指定XML数据!
response.setContentType("text/xml;charset=UTF-8");
//输出流
PrintWriter printWriter = response.getWriter();

/****************返回XML文件给前台**************/
printWriter.write("<?xml version='1.0' encoding='UTF-8'?>");
printWriter.write("<root>");
if("广东".equals(province)){
printWriter.write("<city>广州</city>");
printWriter.write("<city>深圳</city>");
printWriter.write("<city>中山</city>");
}else if("湖南".equals(province)){
printWriter.write("<city>长沙</city>");
printWriter.write("<city>株洲</city>");
printWriter.write("<city>湘潭</city>");
printWriter.write("<city>岳阳</city>");
}
printWriter.write("</root>");

System.out.println("1111");


/*******事后操作 关闭输出流*******/
printWriter.flush();
printWriter.close();


}

protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

this.doPost(request, response);
}
}

XML方式总结

监听下拉框的变化,如果变化了,那么就使用异步操作去访问服务器,得到对应的数据返回给异步对象异步对象解析服务器带过来的数据,使用DOM编程把数据动态添加到页面上

1.在Servlet上记得要指定返回的是XML的数据!2.在前台解析XML文档的时候,不能直接使用innerHtml来得到节点的值,只能通过firstChild.nodeValue的方式获取。3.由于每次append到下拉框都会连续append,因此在响应事件的时候,把下拉框清零4.把下拉框options的长度赋值为1,那么就是清零的操作了。

总结

References



以上是关于Ajax之JavaScript实现的主要内容,如果未能解决你的问题,请参考以下文章

执行AJAX返回HTML片段中的JavaScript脚本

javascript AJAX片段

AJAX技术之网易滚动新闻的简单实现(附源码)--AJAX

前端面试题之手写promise

Ajax之JavaScript实现

JavaScript之Ajax-7 Ajax跨域请求(Ajax跨域概述Ajax跨域实现)