原生AJAX入门讲解(含实例)
相对于jQuery、YUI以及其他一些类库的AJAX封装,原生JS的AJAX显得那么的尴尬,兼容性不好,要记很多的方法属性,调用不便捷,代码臃肿...但我还是想说,原生JS才是最根本最底层的知识(虽然实际项目中我也是以jQuery AJAX为主,为什么?高效!),求木之长者,必固其根本。 什么是AJAX? 它的优点劣势是什么? Asynchronous JavaScript and XML(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。简单的说它是多种技术的组合,目的就是让前台的数据交互变得更快捷,不用刷新页面就可以完成数据的更新。关于它的概念,止于此。ajax 优点很明显,利于用户体验,不会打断用户的操作,在不刷新页面的情况下更新内容,减小服务器压力也是它很硬性的一个优点;而缺点,除了倍受追捧的SEO问题,安全问题、前进后退(这个虽然可以用其他方法解决,但AJAX本身的机制还是没变)、破坏程序的异常机制以及对新兴手持设备支持不完美的问题都是它现存的一些缺点。人无完人,AJAX也是如此,我们并不能因为它有缺点而摒弃它。 什么地方需要AJAX? 其实这是一个太宽泛的问题,各人各项目都有不同的用处,依我的经验与理解,AJAX应该用于小面积更新数据而不希望整个页面刷新的情况下使用。比如对用户名或者注册邮箱等数据判断、内容选项卡内容、弹出的登录注册窗口以及用户提交信息后的反馈信息等等。 实践出真知! 崇尚思考加实践,我坚信这是深入任何一门技术的必备法宝。下面,我就以一个常用的验证用户是否使用的实例,浅尝辄止的讲解一下基础的AJAX。 验证用户名这种数据判断,不用多说了,会一点点前端的人都知道是必须的。最传统的模式可能是输入信息,然后用户点提交后alert出一个窗口,告诉用户XXX用户名已被注册,请重新输入!我讨厌极丑的alert框!我想大多用户也是一样。此时,AJAX就可以华丽登场了。当用户输入完名字后,在表单外任何地方点一下(失去焦点),AJAX就迅速把用户输入的信息反馈到服务器端判断,并迅速返回一个信息告知用户输入的昵称是否可用。如此,我们需要一个前台的输入表单,代码如下:
|
1
2
3
|
<form name="iform" method="post" action="#"><p><label for="nickname">用户名:</label><input placeholder="在这里输入用户名" id="nickname" name="nickname" type="text"><span id="tips"></span></p></form> |
另外,我们还需要一个判断输入昵称是否存在的后端页面(本文以PHP为例,这部分不用细究):
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
...if(isset($_GET['entryname'])){ $entryname=$_GET['entryname'];}else{ $entryname='DATA NULL';}$sql=sprintf("select * from i_test_ajax where nickname='%s'",$entryname);$res=$iajax->query($sql);//sleep只是为了展示readState==1时的效果sleep(1);if(($res->num_rows)>0){ echo "抱歉!此昵称已存在 :(";}else{ echo "恭喜!此昵称可注册 :)";}... |
如此,万事俱备,只欠东风,剩下的就交给AJAX来处理了。 XMLHttpRequest,不得不提的一个对象,AJAX最核心也是最底层的对象。可悲哀的是,它是W3C的一个标准,但微软IE一直很自我(微软IE)。怎么办?当然是用一个方法和谐掉它们。微软IE支持ActiveXObject('Microsoft.XMLHTTP')对象,这样就简单了:
|
1
2
3
4
5
6
7
8
9
10
|
//兼容的XMLHttpRequest对象IXHR: function(){ if(window.ActiveXObject){ XHR=new ActiveXObject('Microsoft.XMLHTTP'); }else if(window.XMLHttpRequest){ XHR=new XMLHttpRequest(); }else{ return null; }} |
兼容的XMLHttpRequest对象实现了,接下来写一个简单的onblur事件,即当输入值后,表单失去焦点后开始判断并迅速回馈一个信息到前台。代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//触发焦点时执行document.forms['iform'].nickname.onblur = function(){ //输入的值 var val=document.forms['iform'].nickname.value; //对用户名的判断 if(!/^[a-zA-Z0-9_]{3,16}$/.test(val)){ alert('请输入3~16位由英文、数字、下划线组成的昵称!'); return false; } //初始化一下XHR iBase.IXHR(); //原来需要新打开的判断页面用GET使用异步 XHR.open('GET','/demo/ajax/iajax20110306_query.php?entryname='+val,true); //与readyState属性有关,当readyState改变时它才会触发 XHR.onreadystatechange=returnFun; //异步处理完成后发送数据出去(比如某些需要在焦点事件后再执行的) XHR.send(null);} |
解释一下AJAX部分的代码。iBase.IXHR(),初始化XHR,以保证XMLHttpRequest对象的兼容。接下来,通过以GET的方式,异步发送到/demo/ajax/iajax20110306_query.php页面进行验证。有人会问什么是GET,GET是从服务器上请求数据,GET方法就是把数据参数队列加到一个URL上,值和表单是一一对应的,比如本文的entryname=val。这个概念可能属于后台程序的范畴,不在此细说。然后,我们需要用到一个onreadystatechange事件属性,这个属性是用来存储函数(或函数名),每当readyState属性改变时,就会调用该函数,即本文中的returnFun;最后,我们还要发送一个数据到服务器,send属性一般用于数据交换,而本文只是一个简单的验证判断,所以,send一个空值。 基本的判断与数据发送完成了,接下来还剩一个关键的信息获取,即returnFun。先看代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function returnFun(){ //当send()已调用,正在发送请求时,显示Loading... if(XHR.readyState==1){ iBase.Id('tips').innerHTML='Loding...'; }else if(XHR.readyState==4){ //当响应内容解析完成,可以调用时 //更缜密,再判断一下status是否成功 if(XHR.status==200){ //responseText为返回的文本 iBase.Id('tips').innerHTML=XHR.responseText; } //使用完请销毁,避免内存泄露 XHR=null; }} |
此函数是用来通过判断readyState及status状态也及时反馈给用户相应的提示信息。readyState有五种状态: 0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法; 1 (载入):已经调用open() 方法,但尚未发送请求; 2 (载入完成): 请求已经发送完成; 3 (交互):可以接收到部分响应数据; 4 (完成):已经接收到了全部数据,并且连接已经关闭。 如此一来,你应该就能明白readyState的功能,而status实际是一种辅状态判断,只是status更多是服务器方的状态判断。关于status,由于它的状态有几十种,我只列出平时常用的几种: 100——客户必须继续发出请求 101——客户要求服务器根据请求转换HTTP协议版本 200——成功 201——提示知道新文件的URL 300——请求的资源可在多处得到 301——删除请求数据 404——没有发现文件、查询或URl 500——服务器产生内部错误 至此,一个简单的AJAX验证实例就完成了:关于AJAX的基础介绍与实例就这么多,关键还是在于自己的实践与思考。其实这其中涉及知识并不复杂,若有后端程序的基础,学起AJAX会更加容易,关键是要想明白其中的逻辑关系。有兴趣的话,可以自己写一个不刷新页面加载新内容的AJAX,或者研究一下jQuery中关于AJAX的封装。
原生AJAX入门讲解(含实例)的更多相关文章
- 原生AJAX基础讲解及兼容处理
原文:原生AJAX基础讲解及兼容处理 AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML). AJAX不是新技术 ,但却是热门的技术.它 ...
- Day21 Django之Form文件上传、原生Ajax和实现抽屉实例
一.Form文件上传 """ Django settings for prev_chouti project. Generated by 'django-admin st ...
- mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204
前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...
- JavaScript之AJAX:原生ajax入门
背景 传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求.服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分H ...
- Maven入门(含实例教程)
原文地址:http://blog.csdn.net/u013142781/article/details/50316383 Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目 ...
- 原生Ajax的使用——含开放API接口
看了两天关于Ajax的使用,总感觉云里雾里的. 故在此总结梳理一下,如果疏漏错误还请纠正支出. Ajax能够在向服务器请求额外的数据时,不必重新加载/卸载整个页面,实现一小块区域性的刷新,也是常说的异 ...
- Spring中@Transactional事务回滚(含实例详细讲解,附源码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
- Spring中@Transactional事务回滚(含实例具体解说,附源代码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用. 以下举个栗子:比方一个部门里面有非常多成员,这两者分别保存在部门表和成员表里面,在 ...
- Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)
1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...
随机推荐
- .net 下新版highcharts本地导出图片bug处理
最近公司要用到highcharts这个插件来生成图表,所以我花了点时间研究了下. 现在最新的版本是3.0.2,这js插件居多优点就不比多说了,demo官网上也很详细.但是优点不爽的地方是,导出图片这个 ...
- java学习笔记(3)之面向对象(1)
下面来谈谈我对面向对象的一些理解和总结. 1.什么叫面向对象?我自己的理解就是一种编程思想,强调对象,是一种思考问题的思维模式.在学习面向对象的时候,我们要建立起自己面向对象的思维模式. (1).先整 ...
- Android安全开发之安全使用HTTPS
Android安全开发之安全使用HTTPS 1.HTTPS简介 阿里聚安全的应用漏洞扫描器中有证书弱校验.主机名弱校验.webview未校验证书的检测项,这些检测项是针对APP采用HTTPS通信时容易 ...
- 初识ASP.NET Core 1.0
本文将对微软下一代ASP.NET框架做个概括性介绍,方便大家进一步熟悉该框架. 在介绍ASP.NET Core 1.0之前有必要澄清一些产品名称及版本号.ASP.NET Core1.0是微软下一代AS ...
- 每周一书-《鸟哥的Linux私房菜》获奖公布
<鸟哥的Linux私房菜>一书的赠书活动时间为2016年10月19日到10月31日, 也就是今天结束. 首先要感谢QQ号为:1084830483(路在远方),来自哈尔滨工程大学的同学赠送给 ...
- 剑指Offer面试题:29.丑数
一.题目:丑数 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个 ...
- 我的Git手册
本文肯定不是Git的最佳的教程,它只是本人的Git操作手册,我将从一些实际问题出发,让熟悉SVN用户顺利过度到Git来(当然包括我自己了),其中会加入一些个人感受或看法,相信会对大家有些启发.另外,全 ...
- 《CLR.via.C#第三版》第二部分第13章节 接口 读书笔记(七)
这章的书写感觉很普通,是些基础的认知知识. 其中一点的重要认知,泛型接口的好处(其实也是使用泛型的好处之一):编译时类型安全&处理值类型时减少装箱. 再说点书上没有的.本来这些知识我打算另外分 ...
- Wireshark抓包分析/TCP/Http/Https及代理IP的识别
前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...
- 【Prince2是什么】PRINCE2认证之项目四大管理步骤
昨天谈到PRINCE2要求项目经理在做项目的时候要考虑四大核心指标(成本.时间.质量.范围)加风险与收益这两个重要要素. 然后PRINCE2基于这几大要素进行了四大管理步骤,分别是: 1.计划 2.授 ...