相对于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入门讲解(含实例)的更多相关文章

  1. 原生AJAX基础讲解及兼容处理

    原文:原生AJAX基础讲解及兼容处理 AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML). AJAX不是新技术 ,但却是热门的技术.它 ...

  2. Day21 Django之Form文件上传、原生Ajax和实现抽屉实例

    一.Form文件上传 """ Django settings for prev_chouti project. Generated by 'django-admin st ...

  3. mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204

    前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...

  4. JavaScript之AJAX:原生ajax入门

    背景 传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求.服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分H ...

  5. Maven入门(含实例教程)

    原文地址:http://blog.csdn.net/u013142781/article/details/50316383 Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目 ...

  6. 原生Ajax的使用——含开放API接口

    看了两天关于Ajax的使用,总感觉云里雾里的. 故在此总结梳理一下,如果疏漏错误还请纠正支出. Ajax能够在向服务器请求额外的数据时,不必重新加载/卸载整个页面,实现一小块区域性的刷新,也是常说的异 ...

  7. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  8. Spring中@Transactional事务回滚(含实例具体解说,附源代码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用. 以下举个栗子:比方一个部门里面有非常多成员,这两者分别保存在部门表和成员表里面,在 ...

  9. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

随机推荐

  1. 实现textarea高度自适应内容,无滚动条

    最近接触到一个很好用的js插件,可以实现textarea高度随内容增多而改变,并且不显示滚动条,推荐给大家: http://www.jacklmoore.com/autosize/

  2. 飞鱼(FlyFish)——便捷的原型在线制作工具

    关于项目原型制作,小菜先前写过一篇文章<FastUI快速界面原型制作工具>,只不过那个是用C#写的原型制作工具,但是感觉用C#写起来比较费力,而且也不太好用,经过高人指点,茅塞顿开,决定重 ...

  3. C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字

    C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...

  4. 京东招聘Java开发人员

    软件开发工程师(JAVA) 岗位职责: 1. 负责京东核心业务系统的需求分析.设计.开发工作 2. 负责相关技术文档编写工作 3. 解决系统中的关键问题和技术难题 任职要求: 1. 踏实诚恳.责任心强 ...

  5. TODO:小程序集成WeUI

    TODO:小程序集成WeUI WeUI 为微信 Web 服务量身设计.WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一. ...

  6. JS.中文乱码,Jsp\Servlet端的解决办法

    JS.中文乱码,Jsp\Servlet端的解决办法 2010-03-08 15:18:21|  分类: Extjs |  标签:encodeuricomponent  乱码  urldecoder   ...

  7. 没有水果机的也来体验下Visual Studio for Mac

    在去年微软已经宣布.NET将实现真正的跨平台,并且发布了Mac和Linux版的Visual Studio Code编辑器,但强大的Visual Studio确只有Windows版. 还坚守.NET开发 ...

  8. SSISDB4:Execution

    Execution是Package或Project的Execution Instance,每次执行都会生成一个唯一的ExecutionID,并记录Execution 执行的结果.在每次Executio ...

  9. 【解决】Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx

    有好几种情况,我先说我的这个情况 1.word设置不当导致 看图: 然后就能打开了~ 2.word格式问题,比如原来是doc,被人手动改成docx~~~ 解决方法:改回来 3.word版本不兼容,比如 ...

  10. Sql Server系列:数据库对象

    数据库对象是数据库的组成部分,数据表.视图.索引.存储过程以及触发器等都是数据库对象. 数据库的主要对象是数据表,数据表是一系列二维数组的集合,用于存储各种信息. 视图表面上看与表几乎一样,具有一组命 ...