通过一个例子了解Ajax
Ajax指的Asyncronous JavaScript and XML
Ajax并不是什么新的编程语言, 它是现有一些东西的应用.从它的名称中就可以看出来
假如我们设想, 浏览器展示了一个页面,但需要更新其中小部分信息,这些信息依赖用户输入,又需要和服务器交互, 因为要和服务器交互, 但是其实还是在这个页面(url), 所以再重新加载整个HTML其实很浪费, 所以出现了Ajax
Ajax就是在JavaScript中, 后台做Http请求, 可以是异步的也可以是同步的, 然后动态更新显示页面. 当然这个过程我们感觉不太到,因为地址栏并不会有任何变化.
Ajax涉及的东西:
- JavaScript
- HTTP
其实就只有这两个
再具体一点:
- XMLHttpRequest (是JavaScript Object), 后台发送HTTP请求
- JavaScript DOM , 修改HTML来展示信息
- HTTP请求和服务器交互
一个例子
比如一个常用的Ajax用途是在注册的时候校验邮箱是否被注册,或用户名是否已存在,用户不用等到整个form都填写完提交才知道是否是已被注册.
<form action=" " method="post"> <input type="text" id="email_register" name="email" onblur="check_email(this.value)" /> </form>
比如这样一个页面, 有一个<form>, 我们再输入邮箱后, 它就会去校验这个邮箱是否被注册了
给<input>绑定一个blur事件, 失去焦点的时候触发
check_email函数:
function check_email(email){ ajax_request = new XMLHttpRequest(); ajax_request.onreadystatechange=function(){ if (ajax_request.readyState==4 && ajax_request.status==200){ var result = eval(ajax_request.responseText); if (result.status == 'False'){ alert("email registered"); } } } ajax_request.open("GET", '192.168.12.192:8088/accounts/apiValidRegAddress?type=email&address=' + email, true); ajax_request.send(); }
可以看到用javascript做一个Ajax请求的接口,流程
- 初始化一个XMLHttpRequest对象 ajax_request.
- 给ajax_request写一个readystatechange函数, 每次其readyState改变的时候会被调用
- open()
- send()
GET请求的send()不带参数, 对于POST请求,要发送的数据放在send()的参数中, 如果上面使用POST
ajax_request.send(type="email", address=email);
注意到我们这行语句:
if (ajax_request.readyState==4 && ajax_request.status==200)
XMLHttpRequest的readyState可以取值0~4, 记录当前请求所处的阶段
- 0: request not initialized
- 1: server connection established
- 2: request received
- 3: processing request
- 4: request finished and response is ready
当readyState为4, 也就是收到服务器回应时, 服务器当然是做了一个HTTP应答, status记录服务器HTTP应答状态码, 比如
- 200 OK
- 404 页面缺失
[学习] : XMLHttpRequest是JavaScript的一个类,它也是一个标准, 更多的学习, 参考XMLHttpRequest的API
上面例子页面的完整代码
<html> <head> <script> function checkEmail(email){ var mailPattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; if (!mailPattern.test(email)){ alert("invaid email : " + email); } else { ajax_request = new XMLHttpRequest(); ajax_request.onreadystatechange=function(){ if (ajax_request.readyState==4 && ajax_request.status==200){ var result = eval("("+ajax_request.responseText+")"); if (result.status == false){ alert("email registered"); } } } ajax_request.open("GET", '/accounts/apiValidRegAddress?type=email&address=' + email, true); ajax_request.send(); } } </script> </head> <input type="text" onblur="checkEmail(this.value)"/> </html>
在checkEmail()中做了一个邮箱地址是否合法的正则检查
我在自己的Django项目中,加入了这个页面这个页面来测试, 上面那个Ajax接口是我们已经实现了的,检查用户输入的手机或邮箱是否被注册了.
页面截图:
JQuery的Ajax
jquery有一系列和Ajax相关的函数,其中最主要的是 jquery.ajax()
语法
- jquery.ajax([setting])
setting就是一系列的参数,比如
- type 'GET' or 'POST'
- url 请求的url
- data 传递到服务器的数据, key/value的形式
- sucess 请请求成功的回调函数, 参数是整个ajax调用返回的数据, 并且已经根据 dataType转成了相应的类型
- dataType 预计的调用返回数据的类型, 如 'json'
比如上面的例子,用ajax来写就是
1 jquery.ajax(type='GET', 2 url = '/accounts/apiValidRegAddress', 3 data={'type':'email', 'address': email}, 4 dataType='json', 5 sucess = function(result){ 6 if (result.status == false){ 7 alert('email registered'); 8 } 9 })
--------------------------
参考:
w3cshools的教程
http://www.w3schools.com/ajax/
mozilla development network
http://mdn.beonex.com/en/AJAX.html