Ajax初识
Ajax初识
cpp_monkey 发表于3年前
Ajax初识
  • 发表于 3年前
  • 阅读 51
  • 收藏 7
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: ​在本篇博文中,主要讨论的还是ajax的初级知识。首先,谈谈ajax是门什么技术,它出现的原因和背景是什么,接着,扯扯ajax内部结构是什么,在什么地方可以使用,最后,说一下它的使用。

    扯蛋

    在这个星期,甚至说在这一段时间内,因为工作需要,一直都在学习前端开始知识,想想就比较苦恼,当我学C语言时,小伙伴们也在学,当我学C++时,小伙伴们在学Web开发知识,当我学Web开发知识时,小伙伴们已经在学移动开发知识,我这是总慢人一步的节奏么?不过我的根本和吃饭家伙还是习佳佳,其他都是附带的,好了,不扯远了,还是回归正题吧。

     在本篇博文中,主要讨论的还是ajax的初级知识。首先,谈谈ajax是门什么技术,它出现的原因和背景是什么,接着,扯扯ajax内部结构是什么,在什么地方可以使用,最后,说一下它的使用。

    背景

    ajax的意思是Asynchronous Javascript And XML,取这四个单词的首字母拼凑而成,中文意思是异步js及xml(实际上现在使用的都是json而不是xml),咋一看,每个单词都认识,但是拼在一起就它认识我,我不认识它了。其实很简单,ajax就是使用了这几门技术组合成的一门新技术,它的功能就是在浏览器下,可以不通过刷新页面的形式,获取服务端的数据,例如:某度的搜索框,你输入了一个单词,搜索框会出现一个下拉框,显示相关的搜索词,这就是使用了ajax的地方(如下图),如果不适用ajax,你要实现此功能,估计要加一个按钮,上面写着相关搜索词,点击一下,刷新页面,才能显示出来。

    使用ajax的好处已经看到了,第一,交互好,让用户少做点事,方便快捷,设计师也不用考虑多一个按钮放什么地方,苦了程序员而已;第二,减少网络的传输量,因为在某些情况下,你只需要页面部分数据更新,其它地方都不需要,但是如果不适用ajax就要传输整个页面,增加了页面的加载速度,而且在互联网初期,带宽是很低的,能节约一点是一点,况且这节约的是一大部分。

    缺点是,在网络不好的情况下,ajax与服务器交互时间过长,而页面却没有任何反应,这用户体验对用户是致命的,因此,一般都要加上一个可视化组件,显示正在获取数据,而不是出现bug,页面挂掉的情况。

ajax内部结构

    ajax说的这么神奇,它又是如何实现的呢? 有几大关键点用于实现。

    1.  XMLHttpRequest对象(IE5 和 IE6 使用 ActiveXObject),由微软提供的,通过封装XMLHttpRequest的操作得到ajax接口。ajax能局部刷新都是依靠此对象!w3c的例子:ajax例子

xmlhttp.open("GET","demo.cgi",true);        //通过使用Get方法调用url,局部刷新页面
xmlhttp.send(null);                         //发送真正请求,open只是准备,并没有真正发送

     在IE不知道多少版本下- -||,浏览器是使用缓存数据,并不会请求服务器,因此需要在url后面添加一个随机参数,以确保每次都是请求服务器的数据。

xmlhttp.open("GET","demo.cgi?t=" + Math.random(),true);

    另一方面,可以在url后添加随机参数也就是说可以在url后添加参数,以此传递。

xmlhttp.open("GET","demo.asp?user=admin&passwd=admin",true);

    2.  Get和Post,不只是ajax内是Get和Post,整个Web开发,传输数据都是使用Get和Post,在ajax内,使用Get和Post是有一点点的区别,Get的调用形式参考上面,而Post的调用形式则如下

xmlhttp.open("POST","demo.cgi",true);            //传递的方法不同,没什么好说的
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");   //Post是用于传递大量数据,使用在表单的提交,这就是与Get的不同,Get是以url参数的形式,则是text/html,而Post则以表单,而表单则是使用application/x-www-form-urlencoded的形式,因此ajax使用Post请求时,需要模拟表单提交的形式,添加请求头部Content-type。
xmlhttp.send("user=admin&passwd=admin");        //Get的是为null的,Send的参数是专门为post方法服务的。

    3. readyState,存放XMLHttpRequest的状态,标识着一个ajax的请求从开始到结束,让开发者可以在不同状态变换时,可以做某些操作。

    • 0: 请求未初始化

    • 1: 服务器连接已建立

    • 2: 请求已接收

    • 3: 请求处理中

    • 4: 请求已完成,且响应已就绪

    4. 同步与异步,这一关系可以简单的理解为单进程与多进程,ajax使用的最多的就是异步方式。

xmlhttp.open("GET","demo.cgi",true);  //第三个参数决定是同步(false)还是异步(true)

    onreadystatechange,当readyState变换时,会触发此函数。ajax以异步(true)方式调用,必须实现此函数,否则请求无效。而同步(false)则不能实现此函数。

xmlhttp.onreadystatechange=function()            //选自http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_onreadystatechange.asp
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  }

    5. 回调函数(Call Back),将函数以参数的形式,传递给另一个函数,让其调用。例如,onreadystatechange调用时,需要返回服务器数据和自定义串组合,不能将onreadystatechange写死,这时将自定义函数传递给        onreadystatechange,让其调用组合。(好难说- -||)

function A(){
    functioin B(){
        return <p>test</p>;
    }
}

A();    //A得到的是空,因为B的返回数据不能返回到A的返回数据,这两者是不同的
//-----------------------------------------------------------------
function A(cb){
    functioin B(cb){
        return cb();
    }
}

A(function {
    return <p>test</p>;    //将函数以参数的形式传递,并运行。(好像问题还没解决。。)
});

运用

    ajax的使用很简单,就是传递一个json对象,jQuery调用ajax如下,其他的js库也差不多,可以依此类推。

$.ajax({                                                    //一个Ajax过程 
    type: "post",                                           //以post方式与后台沟通 
    url : "./demo.cgi",                                     //与此请求页面沟通 
    dataType:'json',                                        //从返回的值以 JSON方式 解释 
    data: 'username='+username+'&password='+password,       //发给服务器的数据有两项,分别是上面传来的u和p 
    success: function(json){                                //如果调用成功 
        alert(json.username+'\n'+json.password);            //打印出来
    }
});

  完整例子,一个自定义封装XMLHttpRequest对象的ajax接口。

标签: Web ajax
共有 人打赏支持
粉丝 0
博文 5
码字总数 4638
×
cpp_monkey
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: