1.什么是异步?在传统的网站项目中,填写一堆数据,最后点击提交,在点击提交的这一刻才实现数据提交,前后台交互。在你点击提交之前数据是没有提交到后台的。这样就会造成很大的不便。比如,我填了一大堆数据,结果告诉我填错了,怎么办?如果我一填错就提示我填错了,那该有多好啊,此时,异步提交就出现了,不用写好所有数据一次全部提交,而是可以部分提交数据。
2.ajax实现异步提交的核心代码就是一行,就是获取浏览器内嵌的XMLHttpRequest对象,用该对象发送请求xmlHttp.open("GET",url,true),设置第三个参数为true,即脚本会在send(提交)方法之后继续执行,而不用等待来自服务器的响应(异步)
3.具体实现请看实例实现类似于百度输入框的效果,随着输入内容的改变,动态改变页面提示信息,关键部位已有注释:
页面内容:
<body>
<div id="myDiv">
<input type="text" size="50" id="keyword" onkeyup="getMoreContents()" onblur="clearData()"
onfocus="getMoreContents()">
<input type="button" value="百度一下" width="50">
<!--紧贴在输入框下面,动态显示提示内容-->
<div id="popDiv">
<table id="content_table" bgcolor="#FFFAFA" border="0" cellpadding="0">
<tbody id="content_table_body"> </tbody>
</table>
</div>
</div>
</body>
首先,在输入框中的内容发生变化的时候触发onkeyup事件(键盘敲击之后),进入getMoreContents()函数,进行后台交互,将相关联的信息查出来显示到输入框的下方。代码如下
var xmlHttp; function getMoreContents() {
var contents = document.getElementById("keyword");
if (contents.value == "") {
clearData();
return;
} //该对象是实现异步提交的核心
xmlHttp = createXmlHttp(); //向服务器发送数据,escape函数是编码函数,将内容编码为ascll传输,以防中文乱码
var url = "search?keyword=" + escape(contents.value); //true表示脚本会在send方法之后继续执行,而不用等待来自服务器的响应(异步)
xmlHttp.open("GET", url, true) //xmlHttp绑定回调函数,在对象状态发生改变时调用。有0-4五个状态,一般只关心4(提交完成)
//不能带参数,不能带括号
xmlHttp.onreadystatechange = callBack;
xmlHttp.send();
}
其中有一个函数是createXmlHttp,这是用来获取实现异步提交的对象,不同的浏览器有不同的获取方法,代码如下:
//获得xmlHttp对象
function createXmlHttp() {
var xmlHttp; //一般的浏览器都支持这种方式来获取该对象
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} //考虑浏览器的兼容性,ie就是他妈的事多
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //虽然该浏览器支持ActiveXObject,但是不支持Microsoft.XMLHTTP
if (!xmlHttp) {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
}
return xmlHttp;
}
在获取后台返回的数据之后要将数据显示到页面上,这就要求提交对象绑定一个回调函数(提交成功之后执行),代码如下:
xmlHttp.onreadystatechange = callBack; function callBack() {
if (xmlHttp.readyState == 4) { //200表示响应成功,404表示未找到,500表示服务器内部错误
if (xmlHttp.status == 200) { //交互成功,获得响应数据
var result = xmlHttp.responseText; //java返回的json数据和js的json数据有细微的区别:最外层少了小括号
var json = eval("(" + result + ")"); //获得数据之后就可以动态展示数据了
setContents(json);
}
}
}
其中xmlHttp.readyState==4表示请求后台成功,至此,已经完成了关于异步提交的所有事情,后面的优化需要同学们自己完成。有需要的可以在评论区留下邮箱,有完整代码奉上。