原生js学习笔记——Ajax基础

1.什么是Ajax

Ajax:是Asynchronous Javascript And XML的简写,即异步JavaScript和XML

XMLHttpRequest 提供的异步,是指基于 ajax 的应用在服务器中的通信方式。

传统的 web 应用,每次用户向服务器请求获得新数据时,浏览器都会丢弃当前页面,而等待重新加载新的页面。这样一来,在服务器完全响应之前,用户浏览器将一片空白,用户的动作必须中断。而异步指用户发送请求后,完全无需等待,请求会在后台发送,不会阻塞用户当前活动。这样一来,用户无须等待第一次请求得到完全响应,就可以发送第二次请求。借用网上一张图来说明:

用途:动态刷新局部数据,无需下载整个页面,从而带来更好的用户体验

Ajax核心:是 JS 对象 XMLHttpRequest。该对象提供了异步发送请求的能力。它可以通过 JS 向服务器发送请求,处理服务器响应,避免阻塞用户动作。

2. XMLHttpRequest对象的方法与属性

2.1XMLHttpRequest 对象方法描述

(1)abort()停止当前请求

(2)getAllResponseHeaders()把HTTP请求的所有响应首部作为键/值对返回

(3)getResponseHeader("header")返回指定首部的串值

(4)open("method","URL",[asyncFlag],["userName"],["password"])建立对服务器的调用。method参数可以是GET、POST或PUT。 url参数可以是相对URL或绝对URL。 这个方法还包括3个可选的参数,是否异步,用户名,密码

(5)send(content)向服务器发送请求

(6)setRequestHeader("header", "value")把指定首部设置为所提供的值。在设置任何首部之前必须先调用open()。 设置header并和请求一起发送 (‘post‘方法一定要 ).

2.2.XMLHttpRequest 对象属性描述

(1)onreadystatechange状态改变的事件触发器,每个状态改变时都会触发这个事件处理器,通常会调用一个JavaScript函数. onreadystatechange 属性存有处理服务器响应的函数

xmlHttp.onreadystatechange=function()

{

//代码

}

(2)readyState,readyState表示HTTP请求的运行状态,有5个可取值:

0 (未初始化) 对象已建立,但是请求尚未初始化(尚未调用open方法)

1 (初始化) 对象已建立,请求已提出,尚未调用send方法

2 (发送数据) send方法已调用,请求已经发送,但是当前的状态及http头未知

3 (数据传送中) 已接收部分数据,请求已经处理中,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,

4 (完成) 数据接收完毕,请求已经完成,此时可以通过通过responseXml  和responseText获取完整的回应数据

(3)responseText服务器的响应,返回数据的文本。

(4)responseXML服务器的响应,返回数据的兼容DOM的XML文档对象,这个对象可以解析为一个DOM对象。

(5)responseBody 服务器返回的主题(非文本格式)

(6)responseStream服务器返回的数据流

(7)status 则表示了HTTP所请求数据的状态[常见的反馈码](如:404 = "文件末找到" 、200 ="成功" ,等等)

(8)statusText服务器返回的状态文本信息 , HTTP状态码的相应文本(OK或Not Found(未找到)等等)

3. 一个XHR建立一个典型的AJAX请求的四步骤:

第一步:new 一个XHR对象

第二步:调用open方法

第三步:send()方法,发送一些信息

第四步:监听onreadystatechange()事件,主要插入成功后要做的事情

具体代码:

<script>
  第一步:  // IE浏览器
   if(ActiveXObject){
         // 微软目前AJAX最新版本
        var xmlhttp = new ActiveXObject("Msxm12.XMLHTTP.6.0");
    }else{
        // 主流浏览器
        var xmlhttp = new XMLHttpRequest();
     }
    
  第二步:  // 创建HTTP请求
   // open(method, url, asynchronous, user, password);
           // method:请求方法(post,get)
           // url:请求地址(是具体要接收数据的地址)
         // asynchronous:同步或异步请求(true是异步,false是同步,默认是true,可不填)
        // user:(指定请求用户名,可不填)
        // password:(指定请求密码,可不填)

     xmlhttp.open(‘get‘,‘url‘);   //open()方法并不会真正发送请求,而只是启动一个请求以备发送。
 第三步: // 如果用的是post方式请求,要在send之前设置HTTP头
  xmlhttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
   send(content);
    // 发送请求,content是要发送的内容,一般post方式需要发送内容写在send的参数里,如果没有则填null,send()方法接收一个参数,是向请求主体发送的数据,如果不需要向请求体发送数据,则参数就为null,调用send()后,请求就会被分派到服务器。  
 
   第四步:xmlhttp.onreadystatechange = function(){
    if((xmlhttp.readyState==4) && (xmlhttp.status)==200){
      alert(xmlhttp.responseText); // 返回的数据内容
    }else{
      alert(‘请求失败‘);
    }
}
</script>

4. Ajax运行机制

首先创建一个xmlHttpRequest的对象之后xmlHttp.readyState的值是0了,然后xmlHttp.onreadystatechange = handlestatechange没有运行。紧接着是open(),这个函数发生了之后xmlHttp.readyState的值是1了,那么就会有一个断点在open()函数处断开,保留现场,紧接着又返回到xmlHttp.onreadystatechange = handlestatechange运行,然后再执行Send()函数,这个函数发生了之后xmlHttp.readyState的值是2了,接着又返回到xmlHttp.onreadystatechange = handlestatechange运行。

异步的ajax实际上使用了单独的进程,因此你无法获取到这个返回值,而且,在你调用ajax()方法时你根本无法知道它什么时候会执行完毕。因此,只能提供回调方法,ajax对象可以将参数传递到你提供的回调方法中。

5.实例:  //验证表单中的用户名是否已经存在

function checkName(){
     var namevalue=ele.name.value;        
         if(namevalue==""){
          ele.imgs[0].setAttribute("width","30px");
          ele.imgs[0].setAttribute("height","30px");
          ele.imgs[0].setAttribute("src","img/wrong.jpg"); //对应图标
          ele.imgs[0].style.display = "inline"; //显示   
          biaoqian1.innerHTML=‘<strong>用户名不能为空</strong>‘;
                    return false;
                }
          else{
          //这个是使用get方式向后台传递数据的参数写在url后面,使用时间戳或随机数来确保无缓存的请求数据.
                 var url=‘http://localhost/chkname.php?username=‘+namevalue+‘&‘+‘t=‘+new Date()*1;
             //使用post方式的url
               // var url=‘http://localhost/chkname.php‘;
                  var cb = ajaxResultdeal;  //处理响应信息的回调函数     
                  toAjax(url,cb)
          }
        
 
 
  }
function toAjax(url,callback){  
             var namevalue=ele.name.value;          
             xmlhttp=new XMLHttpRequest();          
             xmlhttp.onreadystatechange =function(){
            if(xmlhttp.readyState == 4){
               if(xmlhttp.status == 200){
                  if(callback) {
                               callback(xmlhttp.responseText);
                      
                            }
               }
      }
}
         //发送数据,开始与服务器进行交互  
        //post发送请求  是因为PHP中的$_POST[‘key‘]方法,需要用到键值对的格式,
因此必须申明请求头部:setRequestHeader(‘Content-Type‘,‘application/x-www-form-urlencoded‘) 以表单提交数据的方式来发送数据到服务器。
       xmlhttp.open(‘POST‘,url,true);     
       xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");       xmlhttp.send("username="+namevalue);
   //get发送请求
        /*xmlhttp.open(‘GET‘,url,true);
          xmlhttp.send(null);*/
}
 
 
var ajaxResult = false;//全局变量
//处理响应的回调函数
function ajaxResultdeal(response){
    ajaxResult = response; //传递给全局变量             
    if(ajaxResult == ‘1‘){
             ele.imgs[0].setAttribute("width","30px");
            ele.imgs[0].setAttribute("height","30px");
            ele.imgs[0].setAttribute("src","img/right.jpg"); //对应图标
            ele.imgs[0].style.display = "inline"; //显示
           biaoqian1.innerHTML="";
          ajaxResult= true;
 
  }
      else{
 
       ele.imgs[0].setAttribute("width","30px");
       ele.imgs[0].setAttribute("height","30px");
       ele.imgs[0].setAttribute("src","img/wrong.jpg"); //对应图标
      ele.imgs[0].style.display = "inline"; //显示   
        biaoqian1.innerHTML=‘<strong>该用户名已经存在</strong>‘;     
      ajaxResult=false;
   

}

ajaxResultreturn(); //用这个函数来返回表单中的name项,返回真还是假,用于提交表单前的验证函数。

   
 
}
function ajaxResultreturn(){
if(ajaxResult){return true;}
else{
return false;
}
}
后台php,为了简单,没有从数据库取得数据,只是简单判断,页面对post,获得get 的请求的获得:
     /*$username=$_POST[‘username‘];*/ //已post提交的获得方式,
     $username=$_GET[‘username‘];//以get提交的获得方式
     if($username=="11"){
       $reback = ‘1‘;
   echo $reback;
   }

输入用户名为11时,页面实时返回效果图如:

输入其他用户名,则页面实时返回效果图:

5.总结

ajax的实现了:

1、页面无刷新,在页面内与服务器通信,给用户的体验非常好。

2、使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。

自己根据基本知识,写了简单的注册,使用ajax技术判断用户名是否已经存在,分别使用了post方式,get方式,来进行传送,后期需要完善的,学习使用Json编码请求,以及学习跨源资源共享。

时间: 2024-12-13 16:19:19

原生js学习笔记——Ajax基础的相关文章

原生js学习笔记2

知识点: 1:关于this指向问题,如果有函数a(),直接a()那么this指向window,new a()指向函数本身. 2:关于null和undefined.两者如果用“==”则认为两者是相等的,要使用严格相等符号===来区分.typeof null --->object,type of undefined ---->undefined,   在希望值是bool值的地方,它们的值都是假值.它们都不包含任何属性和方法.使用“.”,"[]"来存取这两个值都会产生一个类型错误

HTML5独家分享:原生JS学习笔记1——基本数据类型和运算符

JS介绍 js的历史 在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的第一代互联网公司. 由于网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Brendan Eich这哥们在两周之内设计出了JavaScript语言.你没看错,这哥们只用了10天时间. 为什么起名叫JavaScript?原因是当时Java语言非常红火,所以网景公司希望借Java的名气来推广,但事实上JavaScript除了语法上有点像Java,其他部分基本上没啥关系. J

JS学习笔记1_基础与常识

1.六种数据类型 5种基础的:Undefined,Null,Boolean,Number,String(其中Undefined派生自Null) 1种复杂的:Object(本质是一组无序键值对) 2.字符串转数字 Number(str):先求值再转换(先valueOf再toString都不行就是NaN),一般与我们的预期结果不一样,比如Number(”)=Number(false)=Number(null)=0而var x;Number(x)=NaN...所以一般都用下面两种方式 parseInt

【学习】原生js学习笔记1:添加class和使input为不可用

<input type="checkbox" id="new_check" onChange="noUse()" checked> <input type="button" class="new_login_btn2" id="new_login"> <script>var new1=document.getElementById("new_

Node.js学习笔记【3】NodeJS基础、代码的组织和部署、文件操作、网络操作、进程管理、异步编程

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

jQuery学习笔记——jQuery基础核心

代码风格 在jQuery程序中,不管是页面元素的选择.内置的功能函数,都是美元符号“$”来起始的.而这个“$”就是jQuery当中最重要且独有的对象:jQuery对象,所以我们在页面元素选择或执行功能函数的时候可以这么写: $(function () {}); //执行一个匿名函数 $(‘#box’);//进行执行的ID元素选择 $(‘#box’).css(‘color’, ‘red’);//执行功能函数由于$本身就是jQuery对象的缩写形式,那么也就是说上面的三段代码也可以写成如下形式:jQ

【转】Backbone.js学习笔记(二)细说MVC

文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Backbone源码结构 1: (function() { 2: Backbone.Events // 自定义事件 3: Backbone.Model // 模型构造函数和原型扩展 4: Backbone.Collection // 集合构造函数和原型扩展 5: Backbone.Router // 路由

JS学习笔记-OO疑问之封装

封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 匿名函数 即没有名字的函数,其创建方式为 function(){...} 单独存在的匿名函数,无法运行,可通过赋值给变量调用或通过表达式自我执行来实现运行. 1.赋值给变量为一般的函数使用方式 var run = function(){ return '方法运行中'; }; alert(run()); 2.通过表达式自我执行 (function(a

[Golong]学习笔记(一) 基础知识

Go编程基础 Go的内置关键字(25个) 不多 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continute for import return var Go的注释方法(和js一样) 单行注释: // 多行注释: /**/ Go程序一般结构 common_structure.go 通过 pack